зеркало из 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
|
||||
run-on-projects:
|
||||
- mozilla-central
|
||||
when:
|
||||
by-project:
|
||||
# No default branch
|
||||
mozilla-central:
|
||||
# Buildbot start time is 10:02am UTC, until we are able to
|
||||
# disable buildbot scheduling, use +12h
|
||||
- {hour: 22, minute: 0}
|
||||
when: [] # don't run for now due to unforeseen issues
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
This is the PDF.js project output, https://github.com/mozilla/pdf.js
|
||||
|
||||
Current extension version is: 1.9.597
|
||||
Current extension version is: 1.9.607
|
||||
|
||||
Taken from upstream commit: f3987bba
|
||||
Taken from upstream commit: b3f84112
|
||||
|
|
|
@ -1511,6 +1511,9 @@ class DOMCMapReaderFactory {
|
|||
this.isCompressed = isCompressed;
|
||||
}
|
||||
fetch({ name }) {
|
||||
if (!this.baseUrl) {
|
||||
return Promise.reject(new Error('CMap baseUrl must be specified, ' + 'see "PDFJS.cMapUrl" (and also "PDFJS.cMapPacked").'));
|
||||
}
|
||||
if (!name) {
|
||||
return Promise.reject(new Error('CMap name must be specified.'));
|
||||
}
|
||||
|
@ -1990,6 +1993,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
|
|||
if (worker.destroyed) {
|
||||
return Promise.reject(new Error('Worker was destroyed'));
|
||||
}
|
||||
let apiVersion = '1.9.607';
|
||||
source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');
|
||||
source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');
|
||||
source.chunkedViewerLoading = !!pdfDataRangeTransport;
|
||||
|
@ -1999,6 +2003,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
|
|||
}
|
||||
return worker.messageHandler.sendWithPromise('GetDocRequest', {
|
||||
docId,
|
||||
apiVersion,
|
||||
source: {
|
||||
data: source.data,
|
||||
url: source.url,
|
||||
|
@ -3309,8 +3314,8 @@ var _UnsupportedManager = function UnsupportedManagerClosure() {
|
|||
}();
|
||||
var version, build;
|
||||
{
|
||||
exports.version = version = '1.9.597';
|
||||
exports.build = build = 'f3987bba';
|
||||
exports.version = version = '1.9.607';
|
||||
exports.build = build = 'b3f84112';
|
||||
}
|
||||
exports.getDocument = getDocument;
|
||||
exports.LoopbackPort = LoopbackPort;
|
||||
|
@ -5049,8 +5054,8 @@ exports.SVGGraphics = SVGGraphics;
|
|||
"use strict";
|
||||
|
||||
|
||||
var pdfjsVersion = '1.9.597';
|
||||
var pdfjsBuild = 'f3987bba';
|
||||
var pdfjsVersion = '1.9.607';
|
||||
var pdfjsBuild = 'b3f84112';
|
||||
var pdfjsSharedUtil = __w_pdfjs_require__(0);
|
||||
var pdfjsDisplayGlobal = __w_pdfjs_require__(13);
|
||||
var pdfjsDisplayAPI = __w_pdfjs_require__(3);
|
||||
|
@ -8176,8 +8181,8 @@ if (!_global_scope2.default.PDFJS) {
|
|||
}
|
||||
var PDFJS = _global_scope2.default.PDFJS;
|
||||
{
|
||||
PDFJS.version = '1.9.597';
|
||||
PDFJS.build = 'f3987bba';
|
||||
PDFJS.version = '1.9.607';
|
||||
PDFJS.build = 'b3f84112';
|
||||
}
|
||||
PDFJS.pdfBug = false;
|
||||
if (PDFJS.verbosity !== undefined) {
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -55,6 +55,11 @@
|
|||
|
||||
/** Begin titlebar **/
|
||||
|
||||
#titlebar {
|
||||
/* Centrally align content items vertically */
|
||||
-moz-box-pack: center;
|
||||
}
|
||||
|
||||
#titlebar-content {
|
||||
/* Ensure the the content part of the titlebar does not shrink. */
|
||||
min-height: inherit;
|
||||
|
@ -69,6 +74,8 @@
|
|||
#titlebar-secondary-buttonbox {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
/* Centrally align indicators and full screen button vertically */
|
||||
-moz-box-align: center;
|
||||
}
|
||||
|
||||
#titlebar-buttonbox-container {
|
||||
|
@ -103,28 +110,6 @@
|
|||
min-height: calc(var(--tab-min-height) + var(--space-above-tabbar) - var(--tab-toolbar-navbar-overlap));
|
||||
}
|
||||
|
||||
/**
|
||||
* We also vertically center the window buttons.
|
||||
*/
|
||||
#titlebar-buttonbox-container {
|
||||
-moz-box-align: start;
|
||||
}
|
||||
|
||||
#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
|
||||
#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
|
||||
/*
|
||||
* To vertically center the window controls, we place them at half the
|
||||
* height of the tabstrip ((tab height + drag space) / 2) - half the height
|
||||
* of the window controls (16px / 2).
|
||||
* */
|
||||
margin-top: calc((var(--tab-min-height) + var(--space-above-tabbar)) / 2 - 8px);
|
||||
}
|
||||
|
||||
#main-window:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
|
||||
#main-window:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
/** End titlebar **/
|
||||
|
||||
#main-window[chromehidden~="toolbar"][chromehidden~="location"][chromehidden~="directories"] {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
"cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
|
||||
"as": "/builds/worker/workspace/build/src/gcc/bin/gcc",
|
||||
"patches": [
|
||||
"llvm-debug-frame.patch"
|
||||
"llvm-debug-frame.patch",
|
||||
"hide-gcda-profiling-symbols.patch"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
diff --git a/compiler-rt/lib/profile/GCDAProfiling.c b/compiler-rt/lib/profile/GCDAProfiling.c
|
||||
index 138af6ec4..f0c05075a 100644
|
||||
--- a/compiler-rt/lib/profile/GCDAProfiling.c
|
||||
+++ b/compiler-rt/lib/profile/GCDAProfiling.c
|
||||
@@ -231,6 +231,7 @@ static void unmap_file() {
|
||||
* profiling enabled will emit to a different file. Only one file may be
|
||||
* started at a time.
|
||||
*/
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_gcda_start_file(const char *orig_filename, const char version[4],
|
||||
uint32_t checksum) {
|
||||
const char *mode = "r+b";
|
||||
@@ -298,6 +299,7 @@ void llvm_gcda_start_file(const char *orig_filename, const char version[4],
|
||||
/* Given an array of pointers to counters (counters), increment the n-th one,
|
||||
* where we're also given a pointer to n (predecessor).
|
||||
*/
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_gcda_increment_indirect_counter(uint32_t *predecessor,
|
||||
uint64_t **counters) {
|
||||
uint64_t *counter;
|
||||
@@ -320,6 +322,7 @@ void llvm_gcda_increment_indirect_counter(uint32_t *predecessor,
|
||||
#endif
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_gcda_emit_function(uint32_t ident, const char *function_name,
|
||||
uint32_t func_checksum, uint8_t use_extra_checksum,
|
||||
uint32_t cfg_checksum) {
|
||||
@@ -346,6 +349,7 @@ void llvm_gcda_emit_function(uint32_t ident, const char *function_name,
|
||||
write_string(function_name);
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
|
||||
uint32_t i;
|
||||
uint64_t *old_ctrs = NULL;
|
||||
@@ -397,6 +401,7 @@ void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
|
||||
#endif
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_gcda_summary_info() {
|
||||
const uint32_t obj_summary_len = 9; /* Length for gcov compatibility. */
|
||||
uint32_t i;
|
||||
@@ -450,6 +455,7 @@ void llvm_gcda_summary_info() {
|
||||
#endif
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_gcda_end_file() {
|
||||
/* Write out EOF record. */
|
||||
if (output_file) {
|
||||
@@ -474,6 +480,7 @@ void llvm_gcda_end_file() {
|
||||
#endif
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_register_writeout_function(writeout_fn fn) {
|
||||
struct writeout_fn_node *new_node = malloc(sizeof(struct writeout_fn_node));
|
||||
new_node->fn = fn;
|
||||
@@ -487,6 +494,7 @@ void llvm_register_writeout_function(writeout_fn fn) {
|
||||
}
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_writeout_files(void) {
|
||||
struct writeout_fn_node *curr = writeout_fn_head;
|
||||
|
||||
@@ -496,6 +504,7 @@ void llvm_writeout_files(void) {
|
||||
}
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_delete_writeout_function_list(void) {
|
||||
while (writeout_fn_head) {
|
||||
struct writeout_fn_node *node = writeout_fn_head;
|
||||
@@ -506,6 +515,7 @@ void llvm_delete_writeout_function_list(void) {
|
||||
writeout_fn_head = writeout_fn_tail = NULL;
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_register_flush_function(flush_fn fn) {
|
||||
struct flush_fn_node *new_node = malloc(sizeof(struct flush_fn_node));
|
||||
new_node->fn = fn;
|
||||
@@ -519,6 +529,7 @@ void llvm_register_flush_function(flush_fn fn) {
|
||||
}
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void __gcov_flush() {
|
||||
struct flush_fn_node *curr = flush_fn_head;
|
||||
|
||||
@@ -528,6 +539,7 @@ void __gcov_flush() {
|
||||
}
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_delete_flush_function_list(void) {
|
||||
while (flush_fn_head) {
|
||||
struct flush_fn_node *node = flush_fn_head;
|
||||
@@ -538,6 +550,7 @@ void llvm_delete_flush_function_list(void) {
|
||||
flush_fn_head = flush_fn_tail = NULL;
|
||||
}
|
||||
|
||||
+COMPILER_RT_VISIBILITY
|
||||
void llvm_gcov_init(writeout_fn wfn, flush_fn ffn) {
|
||||
static int atexit_ran = 0;
|
||||
|
|
@ -409,6 +409,78 @@ body {
|
|||
:root.theme-dark .CodeMirror-scrollbar-filler {
|
||||
background: transparent;
|
||||
}
|
||||
.modal-wrapper {
|
||||
position: fixed;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
transition: z-index 200ms;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.modal {
|
||||
top: 0;
|
||||
height: 230px;
|
||||
width: 500px;
|
||||
background-color: var(--theme-codemirror-gutter-background);
|
||||
transform: translateY(-250px);
|
||||
transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
|
||||
box-shadow: 2px 4px 6px var(--popup-shadow-color);
|
||||
}
|
||||
|
||||
.modal.entering,
|
||||
.modal.exited {
|
||||
transform: translateY(-250px);
|
||||
}
|
||||
|
||||
.modal.entered,
|
||||
.modal.exiting {
|
||||
transform: translateY(30px);
|
||||
}
|
||||
|
||||
@media (max-width: 520px) {
|
||||
.modal {
|
||||
width: 80%;
|
||||
left: 10%;
|
||||
}
|
||||
}
|
||||
.shortcuts-content {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.shortcuts-content h2 {
|
||||
margin-top: 2px;
|
||||
margin-bottom: 2px;
|
||||
color: var(--theme-graphs-bluegrey);
|
||||
}
|
||||
|
||||
.shortcuts-section {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.shortcuts-list {
|
||||
list-style: none;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
overflow: auto;
|
||||
width: calc(100% - 1px); /* 1px fixes the hidden right border */
|
||||
}
|
||||
|
||||
.shortcuts-modal {
|
||||
height: fit-content;
|
||||
}
|
||||
|
||||
.shortcuts-list li {
|
||||
width: 40%;
|
||||
color: var(--theme-body-color);
|
||||
padding-top: 5px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
:root.theme-light,
|
||||
:root .theme-light {
|
||||
--search-overlays-semitransparent: rgba(221, 225, 228, 0.66);
|
||||
|
@ -424,6 +496,17 @@ body {
|
|||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
button {
|
||||
background: transparent;
|
||||
outline: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
button:hover,
|
||||
button:focus {
|
||||
background-color: var(--theme-toolbar-background-hover);
|
||||
}
|
||||
|
||||
.debugger {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
|
@ -793,6 +876,7 @@ menuseparator {
|
|||
.file,
|
||||
.worker,
|
||||
.refresh,
|
||||
.shortcut,
|
||||
.add-button {
|
||||
fill: var(--theme-splitter-color);
|
||||
}
|
||||
|
@ -816,6 +900,7 @@ menuseparator {
|
|||
.folder svg,
|
||||
.worker svg,
|
||||
.refresh svg,
|
||||
.shortcut svg,
|
||||
.add-button svg {
|
||||
width: 15px;
|
||||
}
|
||||
|
@ -828,6 +913,7 @@ menuseparator {
|
|||
.domain svg,
|
||||
.folder svg,
|
||||
.refresh svg,
|
||||
.shortcut svg,
|
||||
.worker svg {
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
@ -857,6 +943,17 @@ html .arrow.expanded svg {
|
|||
.arrow.hidden {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.webpack svg {
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
margin-right: 5px;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.theme-dark .webpack {
|
||||
opacity: 0.5;
|
||||
}
|
||||
.managed-tree .tree {
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
|
@ -1301,38 +1398,6 @@ html[dir="rtl"] .managed-tree .tree .node > div {
|
|||
user-select: none;
|
||||
}
|
||||
|
||||
.sources-header {
|
||||
height: 29px;
|
||||
background-color: var(--theme-toolbar-background);
|
||||
border-bottom: 1px solid var(--theme-splitter-color);
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
line-height: 30px;
|
||||
font-size: 1.2em;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.theme-dark .sources-header {
|
||||
background-color: var(--theme-tab-toolbar-background);
|
||||
}
|
||||
|
||||
.sources-header {
|
||||
padding-inline-start: 10px;
|
||||
}
|
||||
|
||||
.sources-header-info {
|
||||
font-size: 12px;
|
||||
color: var(--theme-comment-alt);
|
||||
font-weight: lighter;
|
||||
white-space: nowrap;
|
||||
padding-inline-end: 10px;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.sources-list {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
|
@ -1347,6 +1412,14 @@ html[dir="rtl"] .managed-tree .tree .node > div {
|
|||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.sources-list .managed-tree .tree .node {
|
||||
padding: 0px 0px 0px 3px;
|
||||
}
|
||||
|
||||
.sources-list .tree .arrow svg {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.theme-dark .sources-list .tree .node:not(.focused) svg {
|
||||
fill: var(--theme-content-color3);
|
||||
}
|
||||
|
@ -1355,6 +1428,15 @@ html[dir="rtl"] .managed-tree .tree .node > div {
|
|||
background-color: var(--theme-tab-toolbar-background);
|
||||
}
|
||||
|
||||
.sources-list .tree .focused .label {
|
||||
background-color: var(--theme-selection-background);
|
||||
}
|
||||
|
||||
.sources-list .tree .label {
|
||||
padding: 3px 0px 3px 0px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.no-sources-message {
|
||||
font-size: 12px;
|
||||
color: var(--theme-comment-alt);
|
||||
|
@ -1366,56 +1448,58 @@ html[dir="rtl"] .managed-tree .tree .node > div {
|
|||
align-items: center;
|
||||
}
|
||||
|
||||
.sources-panel .source-footer {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.sources-panel .outline {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.sources-panel .outline.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.source-footer {
|
||||
.source-outline-tabs {
|
||||
width: 100%;
|
||||
background: var(--theme-body-background);
|
||||
border-top: 1px solid var(--theme-splitter-color);
|
||||
display: flex;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.source-footer .tab {
|
||||
.source-outline-tabs .tab {
|
||||
flex: 1;
|
||||
justify-content: center;
|
||||
border: 1px solid transparent;
|
||||
border-bottom-left-radius: 2px;
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom: 1px solid transparent;
|
||||
border-left: 1px solid transparent;
|
||||
display: inline-flex;
|
||||
position: relative;
|
||||
transition: all 0.25s ease;
|
||||
overflow: hidden;
|
||||
padding: 5px;
|
||||
padding: 6.5px;
|
||||
margin-bottom: 0px;
|
||||
margin-top: -1px;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.source-footer .tab:hover {
|
||||
.source-outline-tabs .tab:first-child {
|
||||
border-left: 0;
|
||||
}
|
||||
|
||||
.source-outline-tabs .tab:hover {
|
||||
background-color: var(--theme-toolbar-background-alt);
|
||||
border-color: var(--theme-splitter-color);
|
||||
}
|
||||
|
||||
.source-footer .tab.active {
|
||||
.source-outline-tabs .tab {
|
||||
color: var(--theme-body-color);
|
||||
background-color: var(--theme-toolbar-background);
|
||||
border-color: var(--theme-splitter-color);
|
||||
}
|
||||
|
||||
.source-footer .tab.active path,
|
||||
.source-footer .tab:hover path {
|
||||
.source-outline-tabs .tab.active {
|
||||
background-color: var(--theme-body-background);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
.source-outline-tabs .tab.active path,
|
||||
.source-outline-tabs .tab:hover path {
|
||||
fill: var(--theme-body-color);
|
||||
}
|
||||
.outline {
|
||||
|
@ -1504,14 +1588,14 @@ html[dir="rtl"] .managed-tree .tree .node > div {
|
|||
}
|
||||
.toggle-button-start,
|
||||
.toggle-button-end {
|
||||
transform: translate(0, 2px);
|
||||
transform: translate(0, 0px);
|
||||
transition: transform 0.25s ease-in-out;
|
||||
padding: 5px 2px;
|
||||
padding: 5px 5px;
|
||||
}
|
||||
|
||||
.toggle-button-start.vertical,
|
||||
.toggle-button-end.vertical {
|
||||
padding: 4px 2px;
|
||||
padding: 2.5px 2.5px;
|
||||
}
|
||||
|
||||
.toggle-button-start svg,
|
||||
|
@ -1526,12 +1610,12 @@ html[dir="rtl"] .managed-tree .tree .node > div {
|
|||
}
|
||||
|
||||
.toggle-button-end {
|
||||
margin-inline-end: 5px;
|
||||
margin-inline-end: 0px;
|
||||
margin-inline-start: auto;
|
||||
}
|
||||
|
||||
.toggle-button-start {
|
||||
margin-inline-start: 5px;
|
||||
margin-inline-start: 0px;
|
||||
}
|
||||
|
||||
html:not([dir="rtl"]) .toggle-button-end svg,
|
||||
|
@ -2244,11 +2328,6 @@ html[dir="rtl"] .arrow svg,
|
|||
--theme-conditional-breakpoint-color: var(--theme-body-color);
|
||||
}
|
||||
|
||||
.paused .in-scope .CodeMirror-line,
|
||||
.paused .in-scope .CodeMirror-linenumber {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.paused .CodeMirror-line,
|
||||
.paused .CodeMirror-linenumber {
|
||||
opacity: 0.7;
|
||||
|
@ -2262,7 +2341,7 @@ html[dir="rtl"] .arrow svg,
|
|||
position: absolute;
|
||||
height: calc(100% - 31px);
|
||||
width: calc(100% - 1.5px);
|
||||
top: 30px;
|
||||
top: 29px;
|
||||
left: 0px;
|
||||
--editor-footer-height: 24px;
|
||||
}
|
||||
|
@ -2457,7 +2536,6 @@ html[dir="rtl"] .editor-mount {
|
|||
}
|
||||
|
||||
.breakpoints-list * {
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
|
@ -2621,8 +2699,8 @@ html .breakpoints-list .breakpoint.paused {
|
|||
position: relative;
|
||||
}
|
||||
|
||||
.expression-container .close-btn {
|
||||
display: none;
|
||||
.expression-content .tree-node {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.expression-container:hover .close-btn {
|
||||
|
@ -2679,8 +2757,9 @@ html .breakpoints-list .breakpoint.paused {
|
|||
|
||||
.why-paused .message.warning {
|
||||
font-size: 10px;
|
||||
color: var(--theme-graphs-full-red);
|
||||
color: var(--theme-graphs-red);
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
}
|
||||
.frames ul {
|
||||
list-style: none;
|
||||
|
@ -2819,7 +2898,18 @@ html .breakpoints-list .breakpoint.paused {
|
|||
.event-listeners .listener:hover .close {
|
||||
display: block;
|
||||
}
|
||||
.workers-list * {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.workers-list .worker {
|
||||
font-size: 12px;
|
||||
color: var(--theme-content-color1);
|
||||
padding: 0.5em 1em 0.5em 0.5em;
|
||||
line-height: 1em;
|
||||
position: relative;
|
||||
transition: all 0.25s ease;
|
||||
}
|
||||
:root {
|
||||
--accordion-header-background: var(--theme-toolbar-background);
|
||||
}
|
||||
|
@ -2900,10 +2990,8 @@ html .breakpoints-list .breakpoint.paused {
|
|||
flex: 0 0 29px;
|
||||
border-bottom: 1px solid var(--theme-splitter-color);
|
||||
display: flex;
|
||||
height: 29px;
|
||||
overflow: hidden;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
background-color: var(--theme-toolbar-background);
|
||||
}
|
||||
|
@ -2980,6 +3068,17 @@ html .command-bar > button:disabled {
|
|||
.command-bar button.pause-exceptions.all {
|
||||
color: var(--theme-highlight-blue);
|
||||
}
|
||||
|
||||
.bottom {
|
||||
border-bottom: none;
|
||||
background-color: var(--theme-body-background);
|
||||
border-top: 1px solid var(--theme-splitter-color);
|
||||
flex: 0 0 27px;
|
||||
}
|
||||
|
||||
.command-bar > button {
|
||||
padding: 6px 5px;
|
||||
}
|
||||
.object-node.default-property {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
@ -3062,7 +3161,7 @@ html .command-bar > button:disabled {
|
|||
color: var(--theme-comment-alt);
|
||||
background-color: var(--theme-toolbar-background);
|
||||
font-weight: lighter;
|
||||
z-index: 100;
|
||||
z-index: 10;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
|
@ -3281,45 +3380,6 @@ html[dir="rtl"] .dropdown {
|
|||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.modal-wrapper {
|
||||
position: fixed;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
transition: z-index 200ms;
|
||||
z-index: 9;
|
||||
}
|
||||
|
||||
.modal {
|
||||
top: 0;
|
||||
z-index: 10;
|
||||
width: 500px;
|
||||
height: 230px;
|
||||
background-color: var(--theme-codemirror-gutter-background);
|
||||
transform: translateY(-250px);
|
||||
transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
|
||||
box-shadow: 2px 4px 6px var(--popup-shadow-color);
|
||||
}
|
||||
|
||||
.modal.entering,
|
||||
.modal.exited {
|
||||
transform: translateY(-250px);
|
||||
}
|
||||
|
||||
.modal.entered,
|
||||
.modal.exiting {
|
||||
transform: translateY(30px);
|
||||
}
|
||||
|
||||
@media (max-width: 520px) {
|
||||
.modal {
|
||||
width: 80%;
|
||||
left: 10%;
|
||||
}
|
||||
}
|
||||
.symbol-modal-wrapper {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
|
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -31,11 +31,11 @@ DebuggerPanel.prototype = {
|
|||
tabTarget: this.toolbox.target,
|
||||
debuggerClient: this.toolbox.target.client,
|
||||
sourceMaps: this.toolbox.sourceMapService,
|
||||
// Open a link in a new browser tab.
|
||||
toolboxActions: {
|
||||
// Open a link in a new browser tab.
|
||||
openLink: this.openLink.bind(this)
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
this._actions = actions;
|
||||
this._store = store;
|
||||
|
|
|
@ -28903,6 +28903,10 @@ var _getSymbols2 = _interopRequireDefault(_getSymbols);
|
|||
|
||||
var _ast = __webpack_require__(1051);
|
||||
|
||||
var _getScopes = __webpack_require__(1186);
|
||||
|
||||
var _getScopes2 = _interopRequireDefault(_getScopes);
|
||||
|
||||
var _sources = __webpack_require__(1171);
|
||||
|
||||
var _getOutOfScopeLocations = __webpack_require__(1072);
|
||||
|
@ -28926,7 +28930,9 @@ self.onmessage = workerHandler({
|
|||
getClosestExpression: _closest.getClosestExpression,
|
||||
getOutOfScopeLocations: _getOutOfScopeLocations2.default,
|
||||
getSymbols: _getSymbols2.default,
|
||||
getScopes: _getScopes2.default,
|
||||
clearSymbols: _getSymbols.clearSymbols,
|
||||
clearScopes: _getScopes.clearScopes,
|
||||
clearASTs: _ast.clearASTs,
|
||||
hasSource: _sources.hasSource,
|
||||
setSource: _sources.setSource,
|
||||
|
@ -29397,6 +29403,15 @@ function getComments(ast) {
|
|||
}));
|
||||
}
|
||||
|
||||
function getClassName(path) {
|
||||
var classDeclaration = path.findParent(_p => _p.isClassDeclaration());
|
||||
if (!classDeclaration) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return classDeclaration.node.id.name;
|
||||
}
|
||||
|
||||
function extractSymbols(source) {
|
||||
var functions = [];
|
||||
var variables = [];
|
||||
|
@ -29414,6 +29429,7 @@ function extractSymbols(source) {
|
|||
if ((0, _helpers.isFunction)(path)) {
|
||||
functions.push({
|
||||
name: (0, _getFunctionName2.default)(path),
|
||||
klass: getClassName(path),
|
||||
location: path.node.loc,
|
||||
parameterNames: getFunctionParameterNames(path),
|
||||
identifier: path.node.id
|
||||
|
@ -29671,12 +29687,7 @@ function getSnippet(path, prevPath) {
|
|||
}
|
||||
|
||||
function formatSymbols(source) {
|
||||
var _getSymbols = getSymbols(source),
|
||||
objectProperties = _getSymbols.objectProperties,
|
||||
memberExpressions = _getSymbols.memberExpressions,
|
||||
callExpressions = _getSymbols.callExpressions,
|
||||
identifiers = _getSymbols.identifiers,
|
||||
variables = _getSymbols.variables;
|
||||
var symbols = getSymbols(source);
|
||||
|
||||
function formatLocation(loc) {
|
||||
if (!loc) {
|
||||
|
@ -29696,10 +29707,11 @@ function formatSymbols(source) {
|
|||
var exprLoc = formatLocation(symbol.expressionLocation);
|
||||
var params = symbol.parameterNames ? symbol.parameterNames.join(", ") : "";
|
||||
var expression = symbol.expression || "";
|
||||
return `${loc} ${exprLoc} ${expression} ${symbol.name} ${params}`;
|
||||
var klass = symbol.klass || "";
|
||||
return `${loc} ${exprLoc} ${expression} ${symbol.name} ${params} ${klass}`;
|
||||
}
|
||||
|
||||
return ["properties", objectProperties.map(summarize).join("\n"), "member expressions", memberExpressions.map(summarize).join("\n"), "call expressions", callExpressions.map(summarize).join("\n"), "identifiers", identifiers.map(summarize).join("\n"), "variables", variables.map(summarize).join("\n")].join("\n");
|
||||
return Object.keys(symbols).map(name => `${name}:\n ${symbols[name].map(summarize).join("\n")}`);
|
||||
}
|
||||
|
||||
function clearSymbols() {
|
||||
|
@ -33056,6 +33068,301 @@ function clearSources() {
|
|||
cachedSources = new Map();
|
||||
}
|
||||
|
||||
/***/ }),
|
||||
/* 1172 */,
|
||||
/* 1173 */,
|
||||
/* 1174 */,
|
||||
/* 1175 */,
|
||||
/* 1176 */,
|
||||
/* 1177 */,
|
||||
/* 1178 */,
|
||||
/* 1179 */,
|
||||
/* 1180 */,
|
||||
/* 1181 */,
|
||||
/* 1182 */,
|
||||
/* 1183 */,
|
||||
/* 1184 */,
|
||||
/* 1185 */,
|
||||
/* 1186 */
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = getScopes;
|
||||
exports.clearScopes = clearScopes;
|
||||
|
||||
var _ast = __webpack_require__(1051);
|
||||
|
||||
var _sources = __webpack_require__(1171);
|
||||
|
||||
var _parser = __webpack_require__(1187);
|
||||
|
||||
var parsedScopesCache = new Map();
|
||||
|
||||
function getScopes(location) {
|
||||
var sourceId = location.sourceId;
|
||||
|
||||
var parsedScopes = parsedScopesCache.get(sourceId);
|
||||
if (!parsedScopes) {
|
||||
var visitor = (0, _parser.createParseJSScopeVisitor)(sourceId);
|
||||
(0, _ast.traverseAst)((0, _sources.getSource)(sourceId), visitor.traverseVisitor);
|
||||
parsedScopes = visitor.toParsedScopes();
|
||||
parsedScopesCache.set(sourceId, parsedScopes);
|
||||
}
|
||||
return (0, _parser.findScopes)(parsedScopes, location);
|
||||
}
|
||||
|
||||
function clearScopes() {
|
||||
parsedScopesCache = new Map();
|
||||
}
|
||||
|
||||
/***/ }),
|
||||
/* 1187 */
|
||||
/***/ (function(module, exports) {
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
function createTempScope(type, parent, loc) {
|
||||
const result = {
|
||||
type,
|
||||
parent,
|
||||
children: [],
|
||||
loc: loc,
|
||||
names: Object.create(null)
|
||||
};
|
||||
if (parent) {
|
||||
parent.children.push(result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function isNode(node, type) {
|
||||
return node ? node.type === type : false;
|
||||
}
|
||||
|
||||
function getFunctionScope(scope) {
|
||||
let s = scope;
|
||||
while (s.type !== "Function" && s.type !== "Script") {
|
||||
if (!s.parent) {
|
||||
return s;
|
||||
}
|
||||
s = s.parent;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
function fromBabelLocation(location, sourceId) {
|
||||
return {
|
||||
sourceId,
|
||||
line: location.line,
|
||||
column: location.column
|
||||
};
|
||||
}
|
||||
|
||||
function parseDeclarator(declaratorId, targetScope, type) {
|
||||
if (isNode(declaratorId, "Identifier")) {
|
||||
targetScope.names[declaratorId.name] = { type, refs: [] };
|
||||
} else if (isNode(declaratorId, "ObjectPattern")) {
|
||||
declaratorId.properties.forEach(prop => {
|
||||
parseDeclarator(prop.value, targetScope, type);
|
||||
});
|
||||
} else if (isNode(declaratorId, "ArrayPattern")) {
|
||||
declaratorId.elements.forEach(item => {
|
||||
parseDeclarator(item, targetScope, type);
|
||||
});
|
||||
} else if (isNode(declaratorId, "AssignmentPattern")) {
|
||||
parseDeclarator(declaratorId.left, targetScope, type);
|
||||
} else if (isNode(declaratorId, "RestElement")) {
|
||||
parseDeclarator(declaratorId.argument, targetScope, type);
|
||||
}
|
||||
}
|
||||
|
||||
function isLetOrConst(node) {
|
||||
return node.kind === "let" || node.kind === "const";
|
||||
}
|
||||
|
||||
function hasLetOrConst(path) {
|
||||
return path.node.body.some(node => {
|
||||
if (!isNode(node, "VariableDeclaration")) {
|
||||
return false;
|
||||
}
|
||||
return isLetOrConst(node);
|
||||
});
|
||||
}
|
||||
|
||||
function findIdentifierInScopes(scope, name) {
|
||||
// Find nearest outer scope with the specifed name and add reference.
|
||||
for (let s = scope; s; s = s.parent) {
|
||||
if (name in s.names) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function toParsedScopes(children, sourceId) {
|
||||
if (!children || children.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
return children.map(scope => {
|
||||
// Removing unneed information from TempScope such as parent reference and
|
||||
// name types. We also need to convert BabelLocation to the Location type.
|
||||
const bindings = Object.keys(scope.names).reduce((_bindings, n) => {
|
||||
const nameRefs = scope.names[n];
|
||||
switch (nameRefs.type) {
|
||||
case "var":
|
||||
case "let":
|
||||
case "const":
|
||||
case "param":
|
||||
_bindings[n] = nameRefs.refs.map(location => {
|
||||
return fromBabelLocation(location, sourceId);
|
||||
});
|
||||
break;
|
||||
}
|
||||
return _bindings;
|
||||
}, Object.create(null));
|
||||
return {
|
||||
start: fromBabelLocation(scope.loc.start, sourceId),
|
||||
end: fromBabelLocation(scope.loc.end, sourceId),
|
||||
type: scope.type.toLowerCase(),
|
||||
bindings,
|
||||
children: toParsedScopes(scope.children, sourceId)
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates at visitor for babel-traverse that will parse/extract all bindings
|
||||
* information from the source. See also findScopes to perform lookup of the
|
||||
* scope information for specific location.
|
||||
*/
|
||||
function createParseJSScopeVisitor(sourceId) {
|
||||
let parent = createTempScope("Global", null, null);
|
||||
let savedParents = new WeakMap();
|
||||
const traverseVisitor = {
|
||||
enter(path) {
|
||||
const tree = path.node;
|
||||
const location = path.node.loc;
|
||||
if (path.isProgram()) {
|
||||
savedParents.set(path, parent);
|
||||
parent = createTempScope("Script", parent, location);
|
||||
return;
|
||||
}
|
||||
if (path.isFunctionDeclaration() || path.isFunctionExpression() || path.isArrowFunctionExpression()) {
|
||||
savedParents.set(path, parent);
|
||||
const scope = createTempScope("Function", parent, location);
|
||||
if (isNode(tree.id, "Identifier")) {
|
||||
const functionName = { type: "fn", refs: [] };
|
||||
getFunctionScope(parent).names[tree.id.name] = functionName;
|
||||
scope.names[tree.id.name] = functionName;
|
||||
}
|
||||
tree.params.forEach(param => parseDeclarator(param, scope, "param"));
|
||||
parent = scope;
|
||||
return;
|
||||
}
|
||||
if (path.isForInStatement() || path.isForStatement()) {
|
||||
const init = tree.init || tree.left;
|
||||
if (isNode(init, "VariableDeclaration") && isLetOrConst(init)) {
|
||||
// Debugger will create new lexical environment for the for.
|
||||
savedParents.set(path, parent);
|
||||
parent = createTempScope("For", parent, location);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (path.isCatchClause()) {
|
||||
savedParents.set(path, parent);
|
||||
parent = createTempScope("Catch", parent, location);
|
||||
parseDeclarator(tree.param, parent, "param");
|
||||
return;
|
||||
}
|
||||
if (path.isBlockStatement()) {
|
||||
if (hasLetOrConst(path)) {
|
||||
// Debugger will create new lexical environment for the block.
|
||||
savedParents.set(path, parent);
|
||||
parent = createTempScope("Block", parent, location);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (path.isVariableDeclaration()) {
|
||||
// Finds right lexical environment
|
||||
const hoistAt = !isLetOrConst(tree) ? getFunctionScope(parent) : parent;
|
||||
tree.declarations.forEach(declarator => {
|
||||
parseDeclarator(declarator.id, hoistAt, tree.kind);
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (path.isIdentifier()) {
|
||||
const scope = findIdentifierInScopes(parent, tree.name);
|
||||
if (scope) {
|
||||
scope.names[tree.name].refs.push(tree.loc.start);
|
||||
}
|
||||
}
|
||||
},
|
||||
exit(path) {
|
||||
const savedParent = savedParents.get(path);
|
||||
if (savedParent) {
|
||||
parent = savedParent;
|
||||
savedParents.delete(path);
|
||||
}
|
||||
}
|
||||
};
|
||||
return {
|
||||
traverseVisitor,
|
||||
toParsedScopes() {
|
||||
return toParsedScopes(parent.children, sourceId) || [];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function compareLocations(a, b) {
|
||||
// According to type of Location.column can be undefined, if will not be the
|
||||
// case here, ignoring flow error.
|
||||
// $FlowIgnore
|
||||
return a.line == b.line ? a.column - b.column : a.line - b.line;
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches all scopes and their bindings at the specific location.
|
||||
*/
|
||||
function findScopes(scopes, location) {
|
||||
// Find inner most in the tree structure.
|
||||
let searchInScopes = scopes;
|
||||
const found = [];
|
||||
while (searchInScopes) {
|
||||
let foundOne = searchInScopes.some(s => {
|
||||
if (compareLocations(s.start, location) <= 0 && compareLocations(location, s.end) < 0) {
|
||||
// Found the next scope, trying to search recusevly in its children.
|
||||
found.unshift(s);
|
||||
searchInScopes = s.children;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (!foundOne) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found.map(i => {
|
||||
return {
|
||||
type: i.type,
|
||||
start: i.start,
|
||||
end: i.end,
|
||||
bindings: i.bindings
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createParseJSScopeVisitor,
|
||||
findScopes
|
||||
};
|
||||
|
||||
/***/ })
|
||||
/******/ ]);
|
||||
});
|
|
@ -600,6 +600,87 @@ module.exports = {
|
|||
|
||||
/***/ }),
|
||||
|
||||
/***/ 1172:
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
const md5 = __webpack_require__(248);
|
||||
|
||||
function originalToGeneratedId(originalId) {
|
||||
const match = originalId.match(/(.*)\/originalSource/);
|
||||
return match ? match[1] : "";
|
||||
}
|
||||
|
||||
function generatedToOriginalId(generatedId, url) {
|
||||
return `${generatedId}/originalSource-${md5(url)}`;
|
||||
}
|
||||
|
||||
function isOriginalId(id) {
|
||||
return !!id.match(/\/originalSource/);
|
||||
}
|
||||
|
||||
function isGeneratedId(id) {
|
||||
return !isOriginalId(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trims the query part or reference identifier of a URL string, if necessary.
|
||||
*/
|
||||
function trimUrlQuery(url) {
|
||||
let length = url.length;
|
||||
let q1 = url.indexOf("?");
|
||||
let q2 = url.indexOf("&");
|
||||
let q3 = url.indexOf("#");
|
||||
let q = Math.min(q1 != -1 ? q1 : length, q2 != -1 ? q2 : length, q3 != -1 ? q3 : length);
|
||||
|
||||
return url.slice(0, q);
|
||||
}
|
||||
|
||||
// Map suffix to content type.
|
||||
const contentMap = {
|
||||
"js": "text/javascript",
|
||||
"jsm": "text/javascript",
|
||||
"ts": "text/typescript",
|
||||
"tsx": "text/typescript-jsx",
|
||||
"jsx": "text/jsx",
|
||||
"coffee": "text/coffeescript",
|
||||
"elm": "text/elm",
|
||||
"cljs": "text/x-clojure"
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the content type for the specified URL. If no specific
|
||||
* content type can be determined, "text/plain" is returned.
|
||||
*
|
||||
* @return String
|
||||
* The content type.
|
||||
*/
|
||||
function getContentType(url) {
|
||||
url = trimUrlQuery(url);
|
||||
let dot = url.lastIndexOf(".");
|
||||
if (dot >= 0) {
|
||||
let name = url.substring(dot + 1);
|
||||
if (name in contentMap) {
|
||||
return contentMap[name];
|
||||
}
|
||||
}
|
||||
return "text/plain";
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
originalToGeneratedId,
|
||||
generatedToOriginalId,
|
||||
isOriginalId,
|
||||
isGeneratedId,
|
||||
getContentType,
|
||||
contentMapForTesting: contentMap
|
||||
};
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 1173:
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
|
@ -907,7 +988,7 @@ function shouldPrettyPrint(source) {
|
|||
}
|
||||
|
||||
var _isPretty = isPretty(source);
|
||||
var _isJavaScript = isJavaScript(source.url);
|
||||
var _isJavaScript = isJavaScript(source);
|
||||
var isOriginal = (0, _devtoolsSourceMap.isOriginalId)(source.id);
|
||||
var hasSourceMap = source.sourceMapURL;
|
||||
|
||||
|
@ -928,10 +1009,8 @@ function shouldPrettyPrint(source) {
|
|||
* @memberof utils/source
|
||||
* @static
|
||||
*/
|
||||
function isJavaScript(url) {
|
||||
var contentType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
||||
|
||||
return url && /\.(jsm|js)?$/.test(trimUrlQuery(url)) || contentType.includes("javascript");
|
||||
function isJavaScript(source) {
|
||||
return source.url && /\.(jsm|js)?$/.test(trimUrlQuery(source.url)) || !!(source.contentType && source.contentType.includes("javascript"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2608,7 +2687,7 @@ const {
|
|||
generatedToOriginalId,
|
||||
isGeneratedId,
|
||||
isOriginalId
|
||||
} = __webpack_require__(899);
|
||||
} = __webpack_require__(1172);
|
||||
|
||||
const { workerUtils: { WorkerDispatcher } } = __webpack_require__(1165);
|
||||
|
||||
|
@ -2617,6 +2696,7 @@ const dispatcher = new WorkerDispatcher();
|
|||
const getOriginalURLs = dispatcher.task("getOriginalURLs");
|
||||
const getGeneratedLocation = dispatcher.task("getGeneratedLocation");
|
||||
const getOriginalLocation = dispatcher.task("getOriginalLocation");
|
||||
const getLocationScopes = dispatcher.task("getLocationScopes");
|
||||
const getOriginalSourceText = dispatcher.task("getOriginalSourceText");
|
||||
const applySourceMap = dispatcher.task("applySourceMap");
|
||||
const clearSourceMaps = dispatcher.task("clearSourceMaps");
|
||||
|
@ -2631,6 +2711,7 @@ module.exports = {
|
|||
getOriginalURLs,
|
||||
getGeneratedLocation,
|
||||
getOriginalLocation,
|
||||
getLocationScopes,
|
||||
getOriginalSourceText,
|
||||
applySourceMap,
|
||||
clearSourceMaps,
|
||||
|
@ -2640,87 +2721,6 @@ module.exports = {
|
|||
|
||||
/***/ }),
|
||||
|
||||
/***/ 899:
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
const md5 = __webpack_require__(248);
|
||||
|
||||
function originalToGeneratedId(originalId) {
|
||||
const match = originalId.match(/(.*)\/originalSource/);
|
||||
return match ? match[1] : "";
|
||||
}
|
||||
|
||||
function generatedToOriginalId(generatedId, url) {
|
||||
return `${generatedId}/originalSource-${md5(url)}`;
|
||||
}
|
||||
|
||||
function isOriginalId(id) {
|
||||
return !!id.match(/\/originalSource/);
|
||||
}
|
||||
|
||||
function isGeneratedId(id) {
|
||||
return !isOriginalId(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trims the query part or reference identifier of a URL string, if necessary.
|
||||
*/
|
||||
function trimUrlQuery(url) {
|
||||
let length = url.length;
|
||||
let q1 = url.indexOf("?");
|
||||
let q2 = url.indexOf("&");
|
||||
let q3 = url.indexOf("#");
|
||||
let q = Math.min(q1 != -1 ? q1 : length, q2 != -1 ? q2 : length, q3 != -1 ? q3 : length);
|
||||
|
||||
return url.slice(0, q);
|
||||
}
|
||||
|
||||
// Map suffix to content type.
|
||||
const contentMap = {
|
||||
"js": "text/javascript",
|
||||
"jsm": "text/javascript",
|
||||
"ts": "text/typescript",
|
||||
"tsx": "text/typescript-jsx",
|
||||
"jsx": "text/jsx",
|
||||
"coffee": "text/coffeescript",
|
||||
"elm": "text/elm",
|
||||
"cljs": "text/x-clojure"
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the content type for the specified URL. If no specific
|
||||
* content type can be determined, "text/plain" is returned.
|
||||
*
|
||||
* @return String
|
||||
* The content type.
|
||||
*/
|
||||
function getContentType(url) {
|
||||
url = trimUrlQuery(url);
|
||||
let dot = url.lastIndexOf(".");
|
||||
if (dot >= 0) {
|
||||
let name = url.substring(dot + 1);
|
||||
if (name in contentMap) {
|
||||
return contentMap[name];
|
||||
}
|
||||
}
|
||||
return "text/plain";
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
originalToGeneratedId,
|
||||
generatedToOriginalId,
|
||||
isOriginalId,
|
||||
isGeneratedId,
|
||||
getContentType,
|
||||
contentMapForTesting: contentMap
|
||||
};
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ 9:
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
|
|
|
@ -11,6 +11,11 @@ support-files =
|
|||
examples/sourcemaps2/main.min.js
|
||||
examples/sourcemaps2/main.js
|
||||
examples/sourcemaps2/main.js.map
|
||||
examples/wasm-sourcemaps/average.js
|
||||
examples/wasm-sourcemaps/average.wasm
|
||||
examples/wasm-sourcemaps/average.wasm.map
|
||||
examples/wasm-sourcemaps/average.c
|
||||
examples/wasm-sourcemaps/utils.js
|
||||
examples/doc-async.html
|
||||
examples/doc-asm.html
|
||||
examples/doc-scripts.html
|
||||
|
@ -26,6 +31,7 @@ support-files =
|
|||
examples/doc-sourcemap-bogus.html
|
||||
examples/doc-sources.html
|
||||
examples/doc-return-values.html
|
||||
examples/doc-wasm-sourcemaps.html
|
||||
examples/asm.js
|
||||
examples/async.js
|
||||
examples/bogus-map.js
|
||||
|
@ -44,6 +50,7 @@ support-files =
|
|||
examples/script-switching-01.js
|
||||
examples/times2.js
|
||||
|
||||
[browser_dbg-asm.js]
|
||||
[browser_dbg-async-stepping.js]
|
||||
[browser_dbg-breaking.js]
|
||||
[browser_dbg-breaking-from-console.js]
|
||||
|
@ -54,6 +61,7 @@ skip-if = true # Bug 1383576
|
|||
[browser_dbg-breakpoints-cond.js]
|
||||
[browser_dbg-call-stack.js]
|
||||
[browser_dbg-expressions.js]
|
||||
[browser_dbg-expressions-error.js]
|
||||
[browser_dbg-scopes.js]
|
||||
[browser_dbg-chrome-create.js]
|
||||
[browser_dbg-chrome-debugging.js]
|
||||
|
@ -89,3 +97,5 @@ skip-if = true # Bug 1393121, 1393299
|
|||
[browser_dbg-sources.js]
|
||||
[browser_dbg-tabs.js]
|
||||
[browser_dbg-toggling-tools.js]
|
||||
[browser_dbg-wasm-sourcemaps.js]
|
||||
skip-if = true
|
||||
|
|
|
@ -1,15 +1,25 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
add_task(async function() {
|
||||
const dbg = await initDebugger("doc-asm.html");
|
||||
await reload(dbg);
|
||||
|
||||
// Tests that asm.js AOT can be disabled and debugging of the asm.js code
|
||||
// is working.
|
||||
// After reload() we are getting getSources notifiction for old sources,
|
||||
// using the debugger statement to really stop are reloaded page.
|
||||
await waitForPaused(dbg);
|
||||
await resume(dbg);
|
||||
|
||||
const {
|
||||
setupTestRunner,
|
||||
asm
|
||||
} = require("devtools/client/debugger/new/integration-tests");
|
||||
await waitForSources(dbg, "doc-asm.html", "asm.js");
|
||||
|
||||
add_task(function*() {
|
||||
setupTestRunner(this);
|
||||
yield asm(this);
|
||||
// Expand nodes and make sure more sources appear.
|
||||
is(findAllElements(dbg, "sourceNodes").length, 2);
|
||||
|
||||
await clickElement(dbg, "sourceArrow", 2);
|
||||
is(findAllElements(dbg, "sourceNodes").length, 4);
|
||||
|
||||
await selectSource(dbg, "asm.js");
|
||||
|
||||
await addBreakpoint(dbg, "asm.js", 7);
|
||||
invokeInTab("runAsm");
|
||||
|
||||
await waitForPaused(dbg);
|
||||
assertPausedLocation(dbg, "asm.js", 7);
|
||||
});
|
||||
|
|
|
@ -39,21 +39,21 @@ add_task(async function() {
|
|||
const dbg = await initDebugger("doc-scripts.html");
|
||||
await selectSource(dbg, "simple2");
|
||||
|
||||
// Adding a conditional Breakpoint
|
||||
dump('Adding a conditional Breakpoint\n')
|
||||
await setConditionalBreakpoint(dbg, 5, "1");
|
||||
await waitForDispatch(dbg, "ADD_BREAKPOINT");
|
||||
let bp = findBreakpoint(dbg, "simple2", 5);
|
||||
is(bp.condition, "1", "breakpoint is created with the condition");
|
||||
assertEditorBreakpoint(dbg, 5, true);
|
||||
|
||||
// Editing a conditional Breakpoint
|
||||
dump('Editing a conditional breakpoint\n')
|
||||
await setConditionalBreakpoint(dbg, 5, "2");
|
||||
await waitForDispatch(dbg, "SET_BREAKPOINT_CONDITION");
|
||||
bp = findBreakpoint(dbg, "simple2", 5);
|
||||
is(bp.condition, "12", "breakpoint is created with the condition");
|
||||
assertEditorBreakpoint(dbg, 5, true);
|
||||
|
||||
// Removing a conditional breakpoint
|
||||
dump("Removing a conditional breakpoint\n")
|
||||
clickElement(dbg, "gutter", 5);
|
||||
await waitForDispatch(dbg, "REMOVE_BREAKPOINT");
|
||||
bp = findBreakpoint(dbg, "simple2", 5);
|
||||
|
|
|
@ -23,7 +23,7 @@ add_task(async function() {
|
|||
toggleCallStack(dbg);
|
||||
|
||||
const notPaused = findElement(dbg, "callStackBody").innerText;
|
||||
is(notPaused, "Not Paused", "Not paused message is shown");
|
||||
is(notPaused, "Not paused", "Not paused message is shown");
|
||||
|
||||
invokeInTab("firstCall");
|
||||
await waitForPaused(dbg);
|
||||
|
@ -47,13 +47,13 @@ add_task(async function() {
|
|||
// check to make sure that the toggle button isn't there
|
||||
let button = toggleButton(dbg);
|
||||
let frames = findAllElements(dbg, "frames");
|
||||
is(button.innerText, "Expand Rows", "toggle button should be expand");
|
||||
is(button.innerText, "Expand rows", "toggle button should be expand");
|
||||
is(frames.length, 7, "There should be at most seven frames");
|
||||
|
||||
button.click();
|
||||
|
||||
button = toggleButton(dbg);
|
||||
frames = findAllElements(dbg, "frames");
|
||||
is(button.innerText, "Collapse Rows", "toggle button should be collapsed");
|
||||
is(button.innerText, "Collapse rows", "toggle button should be collapsed");
|
||||
is(frames.length, 22, "All of the frames should be shown");
|
||||
});
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* test pausing on an errored watch expression
|
||||
* assert that you can:
|
||||
* 1. resume
|
||||
* 2. still evalutate expressions
|
||||
*/
|
||||
|
||||
const expressionSelectors = {
|
||||
input: "input.input-expression"
|
||||
};
|
||||
|
||||
function getLabel(dbg, index) {
|
||||
return findElement(dbg, "expressionNode", index).innerText;
|
||||
}
|
||||
|
||||
function getValue(dbg, index) {
|
||||
return findElement(dbg, "expressionValue", index).innerText;
|
||||
}
|
||||
|
||||
function assertEmptyValue(dbg, index) {
|
||||
const value = findElement(dbg, "expressionValue", index);
|
||||
if (value) {
|
||||
is(value.innerText, "");
|
||||
return;
|
||||
}
|
||||
|
||||
is(value, null);
|
||||
}
|
||||
|
||||
function toggleExpression(dbg, index) {
|
||||
findElement(dbg, "expressionNode", index).click();
|
||||
}
|
||||
|
||||
async function addExpression(dbg, input) {
|
||||
info("Adding an expression");
|
||||
findElementWithSelector(dbg, expressionSelectors.input).focus();
|
||||
type(dbg, input);
|
||||
pressKey(dbg, "Enter");
|
||||
|
||||
await waitForDispatch(dbg, "EVALUATE_EXPRESSION");
|
||||
}
|
||||
|
||||
async function editExpression(dbg, input) {
|
||||
info("updating the expression");
|
||||
dblClickElement(dbg, "expressionNode", 1);
|
||||
// Position cursor reliably at the end of the text.
|
||||
pressKey(dbg, "End");
|
||||
type(dbg, input);
|
||||
pressKey(dbg, "Enter");
|
||||
await waitForDispatch(dbg, "EVALUATE_EXPRESSION");
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
const dbg = await initDebugger("doc-script-switching.html");
|
||||
|
||||
await togglePauseOnExceptions(dbg, true, false);
|
||||
await addExpression(dbg, "location");
|
||||
|
||||
const paused = waitForPaused(dbg);
|
||||
addExpression(dbg, "foo.bar");
|
||||
await paused;
|
||||
ok(dbg.selectors.hasWatchExpressionErrored(dbg.getState()));
|
||||
|
||||
// Resume, and re-pause in the `foo.bar` exception
|
||||
resume(dbg);
|
||||
await waitForPaused(dbg);
|
||||
|
||||
toggleExpression(dbg, 1);
|
||||
await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES");
|
||||
is(findAllElements(dbg, "expressionNodes").length, 18);
|
||||
});
|
|
@ -6,6 +6,7 @@
|
|||
* 1. add watch expressions
|
||||
* 2. edit watch expressions
|
||||
* 3. delete watch expressions
|
||||
* 4. expanding properties when not paused
|
||||
*/
|
||||
|
||||
const expressionSelectors = {
|
||||
|
@ -61,7 +62,7 @@ add_task(async function() {
|
|||
|
||||
await addExpression(dbg, "f");
|
||||
is(getLabel(dbg, 1), "f");
|
||||
is(getValue(dbg, 1), `"ReferenceError: f is not defined"`);
|
||||
is(getValue(dbg, 1), "(unavailable)");
|
||||
|
||||
await editExpression(dbg, "oo");
|
||||
is(getLabel(dbg, 1), "foo()");
|
||||
|
@ -79,6 +80,15 @@ add_task(async function() {
|
|||
|
||||
await deleteExpression(dbg, "foo");
|
||||
await deleteExpression(dbg, "location");
|
||||
is(findAllElements(dbg, "expressionNodes").length, 0);
|
||||
|
||||
// Test expanding properties when the debuggee is active
|
||||
await resume(dbg);
|
||||
await addExpression(dbg, "location");
|
||||
toggleExpression(dbg, 1);
|
||||
await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES");
|
||||
is(findAllElements(dbg, "expressionNodes").length, 17);
|
||||
|
||||
await deleteExpression(dbg, "location");
|
||||
is(findAllElements(dbg, "expressionNodes").length, 0);
|
||||
});
|
||||
|
|
|
@ -10,7 +10,7 @@ async function waitFor(condition) {
|
|||
return condition();
|
||||
}
|
||||
|
||||
add_task(async function () {
|
||||
add_task(async function() {
|
||||
const dbg = await initDebugger("doc-minified.html");
|
||||
invokeInTab("arithmetic");
|
||||
|
||||
|
@ -19,7 +19,9 @@ add_task(async function () {
|
|||
const console = await toolbox.selectTool("webconsole");
|
||||
const hud = console.hud;
|
||||
|
||||
let node = await waitFor(() => hud.ui.outputNode.querySelector(".frame-link-source"));
|
||||
let node = await waitFor(() =>
|
||||
hud.ui.outputNode.querySelector(".frame-link-source")
|
||||
);
|
||||
const initialLocation = "math.min.js:3:65";
|
||||
is(node.textContent, initialLocation, "location is correct in minified code");
|
||||
|
||||
|
@ -43,5 +45,9 @@ add_task(async function () {
|
|||
return found;
|
||||
});
|
||||
|
||||
is(node.textContent, "math.min.js:formatted:22", "location is correct in minified code");
|
||||
is(
|
||||
node.textContent,
|
||||
"math.min.js:formatted:22",
|
||||
"location is correct in minified code"
|
||||
);
|
||||
});
|
||||
|
|
|
@ -11,6 +11,10 @@ async function waitForSourceCount(dbg, i) {
|
|||
});
|
||||
}
|
||||
|
||||
function getLabel(dbg, index) {
|
||||
return findElement(dbg, "sourceNode", index).textContent.trim();
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
const dbg = await initDebugger("doc-sources.html");
|
||||
const { selectors: { getSelectedSource }, getState } = dbg;
|
||||
|
@ -53,11 +57,7 @@ add_task(async function() {
|
|||
});
|
||||
|
||||
await waitForSourceCount(dbg, 9);
|
||||
is(
|
||||
findElement(dbg, "sourceNode", 7).textContent,
|
||||
"math.min.js",
|
||||
"The dynamic script exists"
|
||||
);
|
||||
is(getLabel(dbg, 7), "math.min.js", "The dynamic script exists");
|
||||
|
||||
// Make sure named eval sources appear in the list.
|
||||
});
|
||||
|
@ -72,20 +72,6 @@ add_task(async function() {
|
|||
content.eval("window.evaledFunc = function() {} //# sourceURL=evaled.js");
|
||||
});
|
||||
await waitForSourceCount(dbg, 3);
|
||||
is(
|
||||
findElement(dbg, "sourceNode", 3).textContent,
|
||||
"(no domain)",
|
||||
"the folder exists"
|
||||
);
|
||||
|
||||
// work around: the folder is rendered at the bottom, so we close the
|
||||
// root folder and open the (no domain) folder
|
||||
await clickElement(dbg, "sourceArrow", 3);
|
||||
await waitForSourceCount(dbg, 4);
|
||||
|
||||
is(
|
||||
findElement(dbg, "sourceNode", 4).textContent,
|
||||
"evaled.js",
|
||||
"the eval script exists"
|
||||
);
|
||||
is(getLabel(dbg, 3), "evaled.js", "the eval script exists");
|
||||
});
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* Test WebAssembly source maps
|
||||
*/
|
||||
add_task(async function() {
|
||||
const dbg = await initDebugger("doc-wasm-sourcemaps.html");
|
||||
|
||||
await reload(dbg);
|
||||
await waitForPaused(dbg);
|
||||
assertPausedLocation(dbg);
|
||||
|
||||
await addBreakpoint(dbg, "wasm-sourcemaps/average.c", 12);
|
||||
|
||||
clickElement(dbg, "resume");
|
||||
|
||||
await waitForPaused(dbg);
|
||||
assertPausedLocation(dbg);
|
||||
|
||||
const frames = findAllElements(dbg, "frames");
|
||||
const firstFrameTitle = frames[0].querySelector(".title").textContent;
|
||||
is(firstFrameTitle, "(wasmcall)", "It shall be a wasm call");
|
||||
const firstFrameLocation = frames[0].querySelector(".location").textContent;
|
||||
is(
|
||||
firstFrameLocation.includes("average.c"),
|
||||
true,
|
||||
"It shall be to avarage.c source"
|
||||
);
|
||||
});
|
|
@ -0,0 +1,59 @@
|
|||
<!-- Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Wasm+sourcemaps</title>
|
||||
<script src="wasm-sourcemaps/utils.js"></script>
|
||||
<script>
|
||||
|
||||
function test() {
|
||||
// Create memory and populate int32 array with some data.
|
||||
var buf = Module._malloc(16);
|
||||
var arr = new Int32Array(Module['buffer'], buf, 4);
|
||||
arr.set(new Int32Array([1, 2, 3, 4]));
|
||||
|
||||
var average = Module.ccall(
|
||||
'average',
|
||||
'i32',
|
||||
['*', 'u32'],
|
||||
[buf, arr.length]
|
||||
);
|
||||
console.log(average);
|
||||
}
|
||||
|
||||
// WebAssembly module is part of the emscripten generated one,
|
||||
// loading emscripten module via script tag.
|
||||
var Module = {
|
||||
wasmBinary: null,
|
||||
postRun: [],
|
||||
};
|
||||
function loadWasm(emscriptenWrapper, wasmUrl, sourceMapUrl) {
|
||||
return fetch(wasmUrl).then(res => res.arrayBuffer()).then(buffer => {
|
||||
if (!sourceMapUrl) return buffer;
|
||||
return updateSourceMappingURLSection(buffer, sourceMapUrl);
|
||||
}).then(buffer => {
|
||||
return new Promise(resolve => {
|
||||
Module.wasmBinary = buffer;
|
||||
Module.postRun.push(resolve);
|
||||
let script = document.createElement('script');
|
||||
script.src = emscriptenWrapper;
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
loadWasm('wasm-sourcemaps/average.js',
|
||||
'wasm-sourcemaps/average.wasm',
|
||||
new URL('wasm-sourcemaps/average.wasm.map', document.location).href).then(() => {
|
||||
debugger;
|
||||
|
||||
test();
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,5 @@
|
|||
# Building WebAssembly source and source maps
|
||||
|
||||
```
|
||||
emcc average.c -O2 -g4 -o average.js -s WASM=1 -s EXPORTED_FUNCTIONS="['_average','_sum']"
|
||||
```
|
|
@ -0,0 +1,21 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
extern float average(signed* numbers, unsigned length);
|
||||
extern signed sum(signed* numbers, unsigned length);
|
||||
|
||||
signed __attribute__((noinline)) sum(signed* numbers, unsigned length)
|
||||
{
|
||||
signed result;
|
||||
unsigned i;
|
||||
result = 0;
|
||||
for (i = 0; i < length; i++)
|
||||
result += numbers[i];
|
||||
return result;
|
||||
}
|
||||
|
||||
float average(signed* numbers, unsigned length)
|
||||
{
|
||||
float s = (float)sum(numbers, length);
|
||||
return s / length;
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Двоичные данные
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");
|
||||
// First expand the domain
|
||||
let domain = [...document.querySelectorAll(".tree-node")].find(node => {
|
||||
return node.textContent == "mozilla.org";
|
||||
return node.textContent.trim() == "mozilla.org";
|
||||
});
|
||||
let arrow = domain.querySelector(".arrow");
|
||||
arrow.click();
|
||||
|
|
|
@ -21,17 +21,17 @@ copySource.accesskey=y
|
|||
|
||||
# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the
|
||||
# context menu to copy the source URL of file open.
|
||||
copySourceUrl=Copy Source URL
|
||||
copySourceUrl=Copy source url
|
||||
copySourceUrl.accesskey=u
|
||||
|
||||
# LOCALIZATION NOTE (copyFunction): This is the text that appears in the
|
||||
# context menu to copy the function the user selected
|
||||
copyFunction.label=Copy Function
|
||||
copyFunction.label=Copy function
|
||||
copyFunction.accesskey=F
|
||||
|
||||
# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the
|
||||
# context menu to copy the stack trace methods, file names and row number.
|
||||
copyStackTrace=Copy Stack Trace
|
||||
copyStackTrace=Copy stack trace
|
||||
copyStackTrace.accesskey=c
|
||||
|
||||
# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button
|
||||
|
@ -52,15 +52,15 @@ resumeButtonTooltip=Resume %S
|
|||
|
||||
# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the
|
||||
# button that steps over a function call.
|
||||
stepOverTooltip=Step Over %S
|
||||
stepOverTooltip=Step over %S
|
||||
|
||||
# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the
|
||||
# button that steps into a function call.
|
||||
stepInTooltip=Step In %S
|
||||
stepInTooltip=Step in %S
|
||||
|
||||
# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the
|
||||
# button that steps out of a function call.
|
||||
stepOutTooltip=Step Out %S
|
||||
stepOutTooltip=Step out %S
|
||||
|
||||
# LOCALIZATION NOTE (workersHeader): The text to display in the events
|
||||
# header.
|
||||
|
@ -76,11 +76,11 @@ noSourcesText=This page has no sources.
|
|||
|
||||
# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab
|
||||
# when there are no events.
|
||||
noEventListenersText=No event listeners to display
|
||||
noEventListenersText=No event listeners to display.
|
||||
|
||||
# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events
|
||||
# header.
|
||||
eventListenersHeader=Event Listeners
|
||||
eventListenersHeader=Event listeners
|
||||
|
||||
# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab
|
||||
# when there are no stack frames.
|
||||
|
@ -152,6 +152,30 @@ projectTextSearch.key=CmdOrCtrl+Shift+F
|
|||
# modal for searching functions in a file.
|
||||
functionSearch.key=CmdOrCtrl+Shift+O
|
||||
|
||||
# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle
|
||||
# breakpoints.
|
||||
toggleBreakpoint.key=CmdOrCtrl+B
|
||||
|
||||
# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle
|
||||
# the conditional breakpoint panel.
|
||||
toggleCondPanel.key=CmdOrCtrl+Shift+B
|
||||
|
||||
# LOCALIZATION NOTE (stepOut.key): A key shortcut to
|
||||
# step out.
|
||||
stepOut.key=Shift+F11
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in
|
||||
# the shortcuts modal for keyboard shortcuts related to editing.
|
||||
shortcuts.header.editor=Editor
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in
|
||||
# the shortcuts modal for keyboard shortcuts related to stepping.
|
||||
shortcuts.header.stepping=Stepping
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.header.search): Sections header in
|
||||
# the shortcuts modal for keyboard shortcuts related to search.
|
||||
shortcuts.header.search=Search
|
||||
|
||||
# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown
|
||||
# when searching across all of the files in a project.
|
||||
projectTextSearch.placeholder=Find in files…
|
||||
|
@ -227,6 +251,30 @@ searchPanelVariable=Filter variables (%S)
|
|||
# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that
|
||||
# are displayed in the breakpoints menu item popup.
|
||||
breakpointMenuItem.setConditional=Configure conditional breakpoint
|
||||
breakpointMenuItem.enableSelf2.label=Enable
|
||||
breakpointMenuItem.enableSelf2.accesskey=E
|
||||
breakpointMenuItem.disableSelf2.label=Disable
|
||||
breakpointMenuItem.disableSelf2.accesskey=D
|
||||
breakpointMenuItem.deleteSelf2.label=Remove
|
||||
breakpointMenuItem.deleteSelf2.accesskey=R
|
||||
breakpointMenuItem.enableOthers2.label=Enable others
|
||||
breakpointMenuItem.enableOthers2.accesskey=o
|
||||
breakpointMenuItem.disableOthers2.label=Disable others
|
||||
breakpointMenuItem.disableOthers2.accesskey=s
|
||||
breakpointMenuItem.deleteOthers2.label=Remove others
|
||||
breakpointMenuItem.deleteOthers2.accesskey=h
|
||||
breakpointMenuItem.enableAll2.label=Enable all
|
||||
breakpointMenuItem.enableAll2.accesskey=b
|
||||
breakpointMenuItem.disableAll2.label=Disable all
|
||||
breakpointMenuItem.disableAll2.accesskey=k
|
||||
breakpointMenuItem.deleteAll2.label=Remove all
|
||||
breakpointMenuItem.deleteAll2.accesskey=a
|
||||
breakpointMenuItem.removeCondition2.label=Remove condition
|
||||
breakpointMenuItem.removeCondition2.accesskey=c
|
||||
breakpointMenuItem.addCondition2.label=Add condition
|
||||
breakpointMenuItem.addCondition2.accesskey=A
|
||||
breakpointMenuItem.editCondition2.label=Edit condition
|
||||
breakpointMenuItem.editCondition2.accesskey=n
|
||||
breakpointMenuItem.enableSelf=Enable breakpoint
|
||||
breakpointMenuItem.enableSelf.accesskey=E
|
||||
breakpointMenuItem.disableSelf=Disable breakpoint
|
||||
|
@ -255,34 +303,34 @@ breakpoints.header=Breakpoints
|
|||
|
||||
# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are
|
||||
# no breakpoints present
|
||||
breakpoints.none=No Breakpoints
|
||||
breakpoints.none=No breakpoints
|
||||
|
||||
# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip
|
||||
# when hovering over the 'disable breakpoints' switch button in right sidebar
|
||||
breakpoints.enable=Enable Breakpoints
|
||||
breakpoints.enable=Enable breakpoints
|
||||
|
||||
# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip
|
||||
# when hovering over the 'disable breakpoints' switch button in right sidebar
|
||||
breakpoints.disable=Disable Breakpoints
|
||||
breakpoints.disable=Disable breakpoints
|
||||
|
||||
# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed
|
||||
# for remove breakpoint button in right sidebar
|
||||
breakpoints.removeBreakpointTooltip=Remove Breakpoint
|
||||
breakpoints.removeBreakpointTooltip=Remove breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.
|
||||
callStack.header=Call Stack
|
||||
callStack.header=Call stack
|
||||
|
||||
# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane
|
||||
# message when not paused.
|
||||
callStack.notPaused=Not Paused
|
||||
callStack.notPaused=Not paused
|
||||
|
||||
# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane
|
||||
# message to hide some of the frames that are shown.
|
||||
callStack.collapse=Collapse Rows
|
||||
callStack.collapse=Collapse rows
|
||||
|
||||
# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane
|
||||
# message to show more of the frames.
|
||||
callStack.expand=Expand Rows
|
||||
callStack.expand=Expand rows
|
||||
|
||||
# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message
|
||||
# for the summarizing the selected search result. e.g. 5 of 10 results.
|
||||
|
@ -293,15 +341,15 @@ editor.singleResult=1 result
|
|||
|
||||
# LOCALIZATION NOTE (editor.noResults): Editor Search bar message
|
||||
# for when no results found.
|
||||
editor.noResults=no results
|
||||
editor.noResults=No results
|
||||
|
||||
# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar
|
||||
# tooltip for traversing to the Next Result
|
||||
editor.searchResults.nextResult=Next Result
|
||||
editor.searchResults.nextResult=Next result
|
||||
|
||||
# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar
|
||||
# tooltip for traversing to the Previous Result
|
||||
editor.searchResults.prevResult=Previous Result
|
||||
editor.searchResults.prevResult=Previous result
|
||||
|
||||
# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for
|
||||
# toggling search type buttons(function search, variable search)
|
||||
|
@ -309,32 +357,32 @@ editor.searchTypeToggleTitle=Search for:
|
|||
|
||||
# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context
|
||||
# menu item for jumping to a new paused location
|
||||
editor.continueToHere.label=Continue To Here
|
||||
editor.continueToHere.label=Continue to here
|
||||
editor.continueToHere.accesskey=H
|
||||
|
||||
# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item
|
||||
# for adding a breakpoint on a line.
|
||||
editor.addBreakpoint=Add Breakpoint
|
||||
editor.addBreakpoint=Add breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item
|
||||
# for disabling a breakpoint on a line.
|
||||
editor.disableBreakpoint=Disable Breakpoint
|
||||
editor.disableBreakpoint=Disable breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item
|
||||
# for enabling a breakpoint on a line.
|
||||
editor.enableBreakpoint=Enable Breakpoint
|
||||
editor.enableBreakpoint=Enable breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item
|
||||
# for removing a breakpoint on a line.
|
||||
editor.removeBreakpoint=Remove Breakpoint
|
||||
editor.removeBreakpoint=Remove breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item
|
||||
# for setting a breakpoint condition on a line.
|
||||
editor.editBreakpoint=Edit Breakpoint
|
||||
editor.editBreakpoint=Edit breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context
|
||||
# menu item for adding a breakpoint condition on a line.
|
||||
editor.addConditionalBreakpoint=Add Conditional Breakpoint
|
||||
editor.addConditionalBreakpoint=Add conditional breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for
|
||||
# input element inside ConditionalPanel component
|
||||
|
@ -346,80 +394,80 @@ editor.conditionalPanel.close=Cancel edit breakpoint and close
|
|||
|
||||
# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item
|
||||
# for navigating to a source mapped location
|
||||
editor.jumpToMappedLocation1=Jump to %S Location
|
||||
editor.jumpToMappedLocation1=Jump to %S location
|
||||
|
||||
# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the
|
||||
# context menu to disable framework grouping.
|
||||
framework.disableGrouping=Disable Framework Grouping
|
||||
framework.disableGrouping=Disable framework grouping
|
||||
framework.disableGrouping.accesskey=u
|
||||
|
||||
# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the
|
||||
# context menu to enable framework grouping.
|
||||
framework.enableGrouping=Enable Framework Grouping
|
||||
framework.enableGrouping=Enable framework grouping
|
||||
framework.enableGrouping.accesskey=u
|
||||
|
||||
# LOCALIZATION NOTE (generated): Source Map term for a server source location
|
||||
generated=Generated
|
||||
|
||||
# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location
|
||||
original=Original
|
||||
original=original
|
||||
|
||||
# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression
|
||||
# input element
|
||||
expressions.placeholder=Add Watch Expression
|
||||
expressions.placeholder=Add watch expression
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item
|
||||
# for closing the selected tab below the mouse.
|
||||
sourceTabs.closeTab=Close Tab
|
||||
sourceTabs.closeTab=Close tab
|
||||
sourceTabs.closeTab.accesskey=c
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item
|
||||
# for closing the other tabs.
|
||||
sourceTabs.closeOtherTabs=Close Other Tabs
|
||||
sourceTabs.closeOtherTabs=Close other tabs
|
||||
sourceTabs.closeOtherTabs.accesskey=o
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item
|
||||
# for closing the tabs to the end (the right for LTR languages) of the selected tab.
|
||||
sourceTabs.closeTabsToEnd=Close Tabs to the Right
|
||||
sourceTabs.closeTabsToEnd=Close tabs to the right
|
||||
sourceTabs.closeTabsToEnd.accesskey=e
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item
|
||||
# for closing all tabs.
|
||||
sourceTabs.closeAllTabs=Close All Tabs
|
||||
sourceTabs.closeAllTabs=Close all tabs
|
||||
sourceTabs.closeAllTabs.accesskey=a
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item
|
||||
# for revealing source in tree.
|
||||
sourceTabs.revealInTree=Reveal in Tree
|
||||
sourceTabs.revealInTree=Reveal in tree
|
||||
sourceTabs.revealInTree.accesskey=r
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item
|
||||
# for copying a link address.
|
||||
sourceTabs.copyLink=Copy Link Address
|
||||
sourceTabs.copyLink=Copy link address
|
||||
sourceTabs.copyLink.accesskey=l
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item
|
||||
# for pretty printing the source.
|
||||
sourceTabs.prettyPrint=Pretty Print Source
|
||||
sourceTabs.prettyPrint=Pretty print source
|
||||
sourceTabs.prettyPrint.accesskey=p
|
||||
|
||||
# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated
|
||||
# with the blackbox button
|
||||
sourceFooter.blackbox=Blackbox Source
|
||||
sourceFooter.blackbox=Blackbox source
|
||||
sourceFooter.blackbox.accesskey=B
|
||||
|
||||
# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated
|
||||
# with the blackbox button
|
||||
sourceFooter.unblackbox=Unblackbox Source
|
||||
sourceFooter.unblackbox=Unblackbox source
|
||||
sourceFooter.unblackbox.accesskey=b
|
||||
|
||||
# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated
|
||||
# with a blackboxed source
|
||||
sourceFooter.blackboxed=Blackboxed Source
|
||||
sourceFooter.blackboxed=Blackboxed source
|
||||
|
||||
# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated
|
||||
# with a code coverage button
|
||||
sourceFooter.codeCoverage=Code Coverage
|
||||
sourceFooter.codeCoverage=Code coverage
|
||||
|
||||
# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed
|
||||
# for close tab button in source tabs.
|
||||
|
@ -434,11 +482,11 @@ scopes.header=Scopes
|
|||
|
||||
# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message
|
||||
# for when the debugger is paused, but there isn't pause data.
|
||||
scopes.notAvailable=Scopes Unavailable
|
||||
scopes.notAvailable=Scopes unavailable
|
||||
|
||||
# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message
|
||||
# for when the debugger is not paused.
|
||||
scopes.notPaused=Not Paused
|
||||
scopes.notPaused=Not paused
|
||||
|
||||
# LOCALIZATION NOTE (scopes.block): Refers to a block of code in
|
||||
# the scopes pane when the debugger is paused.
|
||||
|
@ -460,7 +508,7 @@ sources.search=%S to search
|
|||
|
||||
# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar
|
||||
# pane header.
|
||||
watchExpressions.header=Watch Expressions
|
||||
watchExpressions.header=Watch expressions
|
||||
|
||||
# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header
|
||||
# button for refreshing the expressions.
|
||||
|
@ -507,7 +555,7 @@ loadingText=Loading\u2026
|
|||
|
||||
# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger
|
||||
# viewer when there is an error loading a file
|
||||
errorLoadingText2=Error loading this URL: %S
|
||||
errorLoadingText2=Error loading this url: %S
|
||||
|
||||
# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the
|
||||
# watch expressions list to add a new item.
|
||||
|
@ -639,7 +687,7 @@ variablesViewOptimizedOut=(optimized away)
|
|||
variablesViewUninitialized=(uninitialized)
|
||||
variablesViewMissingArgs=(unavailable)
|
||||
|
||||
anonymousSourcesLabel=Anonymous Sources
|
||||
anonymousSourcesLabel=Anonymous sources
|
||||
|
||||
experimental=This is an experimental feature
|
||||
|
||||
|
@ -698,3 +746,47 @@ whyPaused.other=Debugger paused
|
|||
# LOCALIZATION NOTE (ctrl): The text that is used for documenting
|
||||
# keyboard shortcuts that use the control key
|
||||
ctrl=Ctrl
|
||||
|
||||
# LOCALIZATION NOTE (anonymous): The text that is displayed when the
|
||||
# display name is null.
|
||||
anonymous=(anonymous)
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing
|
||||
# keyboard shortcut action for toggling breakpoint
|
||||
shortcuts.toggleBreakpoint=Toggle Breakpoint
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing
|
||||
# keyboard shortcut action for toggling conditional panel keyboard
|
||||
shortcuts.toggleCondPanel=Toggle Conditional Panel
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing
|
||||
# keyboard shortcut action for pause of resume
|
||||
shortcuts.pauseOrResume=Pause/Resume
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.stepOver): text describing
|
||||
# keyboard shortcut action for stepping over
|
||||
shortcuts.stepOver=Step Over
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.stepIn): text describing
|
||||
# keyboard shortcut action for stepping in
|
||||
shortcuts.stepIn=Step In
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.stepOut): text describing
|
||||
# keyboard shortcut action for stepping out
|
||||
shortcuts.stepOut=Step Out
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.fileSearch): text describing
|
||||
# keyboard shortcut action for source file search
|
||||
shortcuts.fileSearch=Source File Search
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.searchAgain): text describing
|
||||
# keyboard shortcut action for searching again
|
||||
shortcuts.searchAgain=Search Again
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.projectSearch): text describing
|
||||
# keyboard shortcut action for full project search
|
||||
shortcuts.projectSearch=Full Project Search
|
||||
|
||||
# LOCALIZATION NOTE (shortcuts.functionSearch): text describing
|
||||
# keyboard shortcut action for function search
|
||||
shortcuts.functionSearch=Function Search
|
||||
|
|
|
@ -12,6 +12,9 @@ pref("devtools.debugger.remote-timeout", 20000);
|
|||
pref("devtools.debugger.pause-on-exceptions", false);
|
||||
pref("devtools.debugger.ignore-caught-exceptions", false);
|
||||
pref("devtools.debugger.source-maps-enabled", true);
|
||||
// Temporarily leave this in place, even though it is unused, so the
|
||||
// options pane doesn't break.
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1371849
|
||||
pref("devtools.debugger.client-source-maps-enabled", true);
|
||||
pref("devtools.debugger.pretty-print-enabled", true);
|
||||
pref("devtools.debugger.auto-pretty-print", false);
|
||||
|
@ -39,5 +42,5 @@ pref("devtools.debugger.file-search-case-sensitive", false);
|
|||
pref("devtools.debugger.file-search-whole-word", false);
|
||||
pref("devtools.debugger.file-search-regex-match", false);
|
||||
pref("devtools.debugger.features.async-stepping", true);
|
||||
pref("devtools.debugger.project-text-search-enabled", true);
|
||||
pref("devtools.debugger.features.project-text-search", true);
|
||||
pref("devtools.debugger.features.wasm", true);
|
||||
|
|
|
@ -1235,7 +1235,6 @@ TimeoutManager::BudgetThrottlingEnabled(bool aIsBackground) const
|
|||
{
|
||||
// A window can be throttled using budget if
|
||||
// * It isn't active
|
||||
// * If it isn't using user media
|
||||
// * If it isn't using WebRTC
|
||||
// * If it hasn't got open WebSockets
|
||||
// * If it hasn't got active IndexedDB databases
|
||||
|
@ -1257,11 +1256,6 @@ TimeoutManager::BudgetThrottlingEnabled(bool aIsBackground) const
|
|||
return false;
|
||||
}
|
||||
|
||||
// Check if we have active GetUserMedia
|
||||
if (mWindow.AsInner()->HasActiveUserMedia()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if we have active PeerConnection
|
||||
if (mWindow.AsInner()->HasActivePeerConnections()) {
|
||||
return false;
|
||||
|
|
|
@ -1012,8 +1012,7 @@ nsPIDOMWindow<T>::nsPIDOMWindow(nsPIDOMWindowOuter *aOuterWindow)
|
|||
mLargeAllocStatus(LargeAllocStatus::NONE),
|
||||
mHasTriedToCacheTopInnerWindow(false),
|
||||
mNumOfIndexedDBDatabases(0),
|
||||
mNumOfOpenWebSockets(0),
|
||||
mNumOfActiveUserMedia(0)
|
||||
mNumOfOpenWebSockets(0)
|
||||
{
|
||||
if (aOuterWindow) {
|
||||
mTimeoutManager =
|
||||
|
@ -4387,7 +4386,6 @@ nsGlobalWindow::UpdateTopInnerWindow()
|
|||
}
|
||||
|
||||
mTopInnerWindow->UpdateWebSocketCount(-(int32_t)mNumOfOpenWebSockets);
|
||||
mTopInnerWindow->UpdateUserMediaCount(-(int32_t)mNumOfActiveUserMedia);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -4548,32 +4546,6 @@ nsPIDOMWindowInner::HasOpenWebSockets() const
|
|||
(mTopInnerWindow && mTopInnerWindow->mNumOfOpenWebSockets);
|
||||
}
|
||||
|
||||
void
|
||||
nsPIDOMWindowInner::UpdateUserMediaCount(int32_t aDelta)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
if (aDelta == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mTopInnerWindow && !IsTopInnerWindow()) {
|
||||
mTopInnerWindow->UpdateUserMediaCount(aDelta);
|
||||
}
|
||||
|
||||
MOZ_DIAGNOSTIC_ASSERT(
|
||||
aDelta > 0 || ((aDelta + mNumOfActiveUserMedia) < mNumOfActiveUserMedia));
|
||||
|
||||
mNumOfActiveUserMedia += aDelta;
|
||||
}
|
||||
|
||||
bool
|
||||
nsPIDOMWindowInner::HasActiveUserMedia() const
|
||||
{
|
||||
return (mTopInnerWindow ? mTopInnerWindow->mNumOfActiveUserMedia
|
||||
: mNumOfActiveUserMedia) > 0;
|
||||
}
|
||||
|
||||
void
|
||||
nsPIDOMWindowOuter::MaybeActiveMediaComponents()
|
||||
{
|
||||
|
|
|
@ -751,9 +751,6 @@ protected:
|
|||
|
||||
// The number of open WebSockets. Inner window only.
|
||||
uint32_t mNumOfOpenWebSockets;
|
||||
|
||||
// The number of active user media. Inner window only.
|
||||
uint32_t mNumOfActiveUserMedia;
|
||||
};
|
||||
|
||||
#define NS_PIDOMWINDOWINNER_IID \
|
||||
|
@ -942,12 +939,6 @@ public:
|
|||
// timeout-throttling.
|
||||
bool HasOpenWebSockets() const;
|
||||
|
||||
// Increase/Decrease the number of active user media.
|
||||
void UpdateUserMediaCount(int32_t aDelta);
|
||||
|
||||
// Return true if there are any currently ongoing user media.
|
||||
bool HasActiveUserMedia() const;
|
||||
|
||||
protected:
|
||||
void CreatePerformanceObjectIfNeeded();
|
||||
};
|
||||
|
|
|
@ -401,15 +401,18 @@ protected:
|
|||
|
||||
MOZ_ASSERT(!wp->GetWindow());
|
||||
|
||||
AutoSafeJSContext cx;
|
||||
AutoJSAPI jsapi;
|
||||
jsapi.Init();
|
||||
|
||||
JSContext* cx = jsapi.cx();
|
||||
|
||||
JS::Rooted<JSObject*> global(cx, mConsole->GetOrCreateSandbox(cx, wp->GetPrincipal()));
|
||||
if (NS_WARN_IF(!global)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The CreateSandbox call returns a proxy to the actual sandbox object. We
|
||||
// don't need a proxy here.
|
||||
// The GetOrCreateSandbox call returns a proxy to the actual sandbox object.
|
||||
// We don't need a proxy here.
|
||||
global = js::UncheckedUnwrap(global);
|
||||
|
||||
JSAutoCompartment ac(cx, global);
|
||||
|
|
|
@ -413,7 +413,7 @@ MutableBlobStorage::~MutableBlobStorage()
|
|||
}
|
||||
}
|
||||
|
||||
uint64_t
|
||||
void
|
||||
MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
|
||||
const nsACString& aContentType,
|
||||
MutableBlobStorageCallback* aCallback)
|
||||
|
@ -433,7 +433,7 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
|
|||
RefPtr<Runnable> runnable =
|
||||
new BlobCreationDoneRunnable(this, aCallback, nullptr, mErrorResult);
|
||||
EventTarget()->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// We want to wait until all the WriteRunnable are completed. The way we do
|
||||
|
@ -442,7 +442,7 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
|
|||
RefPtr<Runnable> runnable =
|
||||
new LastRunnable(this, aParent, aContentType, aCallback);
|
||||
DispatchToIOThread(runnable.forget());
|
||||
return mDataLen;
|
||||
return;
|
||||
}
|
||||
|
||||
// If we are waiting for the temporary file, it's better to wait...
|
||||
|
@ -450,7 +450,7 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
|
|||
mPendingParent = aParent;
|
||||
mPendingContentType = aContentType;
|
||||
mPendingCallback = aCallback;
|
||||
return mDataLen;
|
||||
return;
|
||||
}
|
||||
|
||||
RefPtr<BlobImpl> blobImpl;
|
||||
|
@ -472,10 +472,8 @@ MutableBlobStorage::GetBlobWhenReady(nsISupports* aParent,
|
|||
|
||||
nsresult error = EventTarget()->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
|
||||
if (NS_WARN_IF(NS_FAILED(error))) {
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
return mDataLen;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
|
|
@ -51,8 +51,7 @@ public:
|
|||
|
||||
// This method can be called just once.
|
||||
// The callback will be called when the Blob is ready.
|
||||
// The return value is the total size of the blob, when created.
|
||||
uint64_t GetBlobWhenReady(nsISupports* aParent,
|
||||
void GetBlobWhenReady(nsISupports* aParent,
|
||||
const nsACString& aContentType,
|
||||
MutableBlobStorageCallback* aCallback);
|
||||
|
||||
|
|
|
@ -1684,8 +1684,7 @@ TabChild::RecvRealMouseButtonEvent(const WidgetMouseEvent& aEvent,
|
|||
aInputBlockId);
|
||||
}
|
||||
|
||||
nsEventStatus unused;
|
||||
InputAPZContext context(aGuid, aInputBlockId, unused);
|
||||
InputAPZContext context(aGuid, aInputBlockId, nsEventStatus_eIgnore);
|
||||
if (pendingLayerization) {
|
||||
context.SetPendingLayerization();
|
||||
}
|
||||
|
|
|
@ -2933,11 +2933,6 @@ MediaManager::AddWindowID(uint64_t aWindowId,
|
|||
return;
|
||||
}
|
||||
|
||||
auto* window = nsGlobalWindow::GetInnerWindowWithId(aWindowId);
|
||||
if (window) {
|
||||
window->AsInner()->UpdateUserMediaCount(1);
|
||||
}
|
||||
|
||||
GetActiveWindows()->Put(aWindowId, aListener);
|
||||
}
|
||||
|
||||
|
@ -2953,8 +2948,6 @@ MediaManager::RemoveWindowID(uint64_t aWindowId)
|
|||
return;
|
||||
}
|
||||
|
||||
window->AsInner()->UpdateUserMediaCount(-1);
|
||||
|
||||
nsPIDOMWindowOuter* outer = window->AsInner()->GetOuterWindow();
|
||||
if (!outer) {
|
||||
LOG(("No outer window for inner %" PRIu64, aWindowId));
|
||||
|
|
|
@ -158,11 +158,11 @@ NS_IMPL_RELEASE_INHERITED(MediaRecorder, DOMEventTargetHelper)
|
|||
/**
|
||||
* Session is an object to represent a single recording event.
|
||||
* In original design, all recording context is stored in MediaRecorder, which causes
|
||||
* a problem if someone calls MediaRecoder::Stop and MedaiRecorder::Start quickly.
|
||||
* a problem if someone calls MediaRecorder::Stop and MediaRecorder::Start quickly.
|
||||
* To prevent blocking main thread, media encoding is executed in a second thread,
|
||||
* named as Read Thread. For the same reason, we do not wait Read Thread shutdown in
|
||||
* MediaRecorder::Stop. If someone call MediaRecoder::Start before Read Thread shutdown,
|
||||
* the same recording context in MediaRecoder might be access by two Reading Threads,
|
||||
* MediaRecorder::Stop. If someone call MediaRecorder::Start before Read Thread shutdown,
|
||||
* the same recording context in MediaRecorder might be access by two Reading Threads,
|
||||
* which cause a problem.
|
||||
* In the new design, we put recording context into Session object, including Read
|
||||
* Thread. Each Session has its own recording context and Read Thread, problem is been
|
||||
|
@ -1045,7 +1045,7 @@ private:
|
|||
}
|
||||
|
||||
private:
|
||||
// Hold reference to MediaRecoder that ensure MediaRecorder is alive
|
||||
// Hold reference to MediaRecorder that ensure MediaRecorder is alive
|
||||
// if there is an active session. Access ONLY on main thread.
|
||||
RefPtr<MediaRecorder> mRecorder;
|
||||
|
||||
|
|
|
@ -562,7 +562,7 @@ AudioContext::DecodeAudioData(const ArrayBuffer& aBuffer,
|
|||
successCallback = &aSuccessCallback.Value();
|
||||
}
|
||||
UniquePtr<WebAudioDecodeJob> job(
|
||||
new WebAudioDecodeJob(contentType, this,
|
||||
new WebAudioDecodeJob(this,
|
||||
promise, successCallback, failureCallback));
|
||||
AsyncDecodeWebAudio(contentType.get(), data, length, *job);
|
||||
// Transfer the ownership to mDecodeJobs
|
||||
|
|
|
@ -514,13 +514,11 @@ AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer,
|
|||
}
|
||||
}
|
||||
|
||||
WebAudioDecodeJob::WebAudioDecodeJob(const nsACString& aContentType,
|
||||
AudioContext* aContext,
|
||||
WebAudioDecodeJob::WebAudioDecodeJob(AudioContext* aContext,
|
||||
Promise* aPromise,
|
||||
DecodeSuccessCallback* aSuccessCallback,
|
||||
DecodeErrorCallback* aFailureCallback)
|
||||
: mContentType(aContentType)
|
||||
, mContext(aContext)
|
||||
: mContext(aContext)
|
||||
, mPromise(aPromise)
|
||||
, mSuccessCallback(aSuccessCallback)
|
||||
, mFailureCallback(aFailureCallback)
|
||||
|
@ -609,7 +607,6 @@ size_t
|
|||
WebAudioDecodeJob::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
|
||||
{
|
||||
size_t amount = 0;
|
||||
amount += mContentType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
|
||||
if (mSuccessCallback) {
|
||||
amount += mSuccessCallback->SizeOfIncludingThis(aMallocSizeOf);
|
||||
}
|
||||
|
|
|
@ -31,8 +31,7 @@ struct WebAudioDecodeJob final
|
|||
{
|
||||
// You may omit both the success and failure callback, or you must pass both.
|
||||
// The callbacks are only necessary for asynchronous operation.
|
||||
WebAudioDecodeJob(const nsACString& aContentType,
|
||||
dom::AudioContext* aContext,
|
||||
WebAudioDecodeJob(dom::AudioContext* aContext,
|
||||
dom::Promise* aPromise,
|
||||
dom::DecodeSuccessCallback* aSuccessCallback = nullptr,
|
||||
dom::DecodeErrorCallback* aFailureCallback = nullptr);
|
||||
|
@ -57,7 +56,6 @@ struct WebAudioDecodeJob final
|
|||
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
||||
|
||||
AudioChunk mBuffer;
|
||||
nsCString mContentType;
|
||||
RefPtr<dom::AudioContext> mContext;
|
||||
RefPtr<dom::Promise> mPromise;
|
||||
RefPtr<dom::DecodeSuccessCallback> mSuccessCallback;
|
||||
|
|
|
@ -47,6 +47,7 @@ run-sequentially = This will delete all existing push subscriptions.
|
|||
[test_unregister_not_found.js]
|
||||
[test_unregister_success.js]
|
||||
[test_updateRecordNoEncryptionKeys_ws.js]
|
||||
skip-if = os == "linux" # Bug 1265233
|
||||
[test_reconnect_retry.js]
|
||||
[test_retry_ws.js]
|
||||
[test_service_parent.js]
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include "mozilla/dom/Promise.h"
|
||||
#include "mozilla/dom/PromiseWorkerProxy.h"
|
||||
#include "mozilla/JSObjectHolder.h"
|
||||
|
||||
#include "ServiceWorkerClient.h"
|
||||
#include "ServiceWorkerManager.h"
|
||||
|
@ -670,6 +671,9 @@ private:
|
|||
MOZ_DIAGNOSTIC_ASSERT(aWindow);
|
||||
WorkerPrivate* workerPrivate = mPromiseProxy->GetWorkerPrivate();
|
||||
|
||||
nsCOMPtr<nsIPrincipal> triggeringPrincipal = workerPrivate->GetPrincipal();
|
||||
MOZ_DIAGNOSTIC_ASSERT(triggeringPrincipal);
|
||||
|
||||
// [[1. Let url be the result of parsing url with entry settings object's API
|
||||
// base URL.]]
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
|
@ -694,6 +698,25 @@ private:
|
|||
}
|
||||
|
||||
if (XRE_IsContentProcess()) {
|
||||
|
||||
// Let's create a sandbox in order to have a valid JSContext and correctly
|
||||
// propagate the SubjectPrincipal.
|
||||
AutoJSAPI jsapi;
|
||||
jsapi.Init();
|
||||
|
||||
JSContext* cx = jsapi.cx();
|
||||
|
||||
nsIXPConnect* xpc = nsContentUtils::XPConnect();
|
||||
MOZ_ASSERT(xpc, "This should never be null!");
|
||||
|
||||
JS::Rooted<JSObject*> sandbox(cx);
|
||||
rv = xpc->CreateSandbox(cx, triggeringPrincipal, sandbox.address());
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
JSAutoCompartment ac(cx, sandbox);
|
||||
|
||||
// ContentProcess
|
||||
nsCOMPtr<nsIWindowWatcher> wwatch =
|
||||
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
|
||||
|
@ -754,9 +777,6 @@ private:
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIPrincipal> triggeringPrincipal = workerPrivate->GetPrincipal();
|
||||
MOZ_DIAGNOSTIC_ASSERT(triggeringPrincipal);
|
||||
|
||||
nsCOMPtr<mozIDOMWindowProxy> win;
|
||||
rv = bwin->OpenURI(uri, nullptr,
|
||||
nsIBrowserDOMWindow::OPEN_DEFAULTWINDOW,
|
||||
|
|
|
@ -5,10 +5,14 @@ support-files =
|
|||
download/window.html
|
||||
download/worker.js
|
||||
file_multie10s_update.html
|
||||
file_userContextId_openWindow.js
|
||||
force_refresh_browser_worker.js
|
||||
empty.html
|
||||
server_multie10s_update.sjs
|
||||
|
||||
[browser_force_refresh.js]
|
||||
[browser_download.js]
|
||||
[browser_multie10s_update.js]
|
||||
run-if=e10s
|
||||
[browser_userContextId_openWindow.js]
|
||||
run-if=e10s
|
||||
|
|
|
@ -0,0 +1,131 @@
|
|||
let { classes: Cc, interfaces: Ci, manager: Cm, results: Cr } = Components;
|
||||
|
||||
let swm = Cc["@mozilla.org/serviceworkers/manager;1"].
|
||||
getService(Ci.nsIServiceWorkerManager);
|
||||
|
||||
const URI = "https://example.com/browser/dom/workers/test/serviceworkers/empty.html";
|
||||
const MOCK_CID = Components.ID("{2a0f83c4-8818-4914-a184-f1172b4eaaa7}");
|
||||
const ALERTS_SERVICE_CONTRACT_ID = "@mozilla.org/alerts-service;1";
|
||||
const USER_CONTEXT_ID = 3
|
||||
|
||||
let mockAlertsService = {
|
||||
showAlert: function(alert, alertListener) {
|
||||
ok(true, "Showing alert");
|
||||
setTimeout(function () {
|
||||
alertListener.observe(null, "alertshow", alert.cookie);
|
||||
}, 100);
|
||||
setTimeout(function () {
|
||||
alertListener.observe(null, "alertclickcallback", alert.cookie);
|
||||
}, 100);
|
||||
},
|
||||
|
||||
showAlertNotification: function(imageUrl, title, text, textClickable,
|
||||
cookie, alertListener, name, dir, lang, data) {
|
||||
this.showAlert();
|
||||
},
|
||||
|
||||
QueryInterface: function(aIID) {
|
||||
if (aIID.equals(Ci.nsISupports) || aIID.equals(Ci.nsIAlertsService)) {
|
||||
return this;
|
||||
}
|
||||
throw Components.results.NS_ERROR_NO_INTERFACE;
|
||||
},
|
||||
|
||||
createInstance: function(aOuter, aIID) {
|
||||
if (aOuter != null) {
|
||||
throw Cr.NS_ERROR_NO_AGGREGATION;
|
||||
}
|
||||
return this.QueryInterface(aIID);
|
||||
}
|
||||
};
|
||||
|
||||
registerCleanupFunction(() => {
|
||||
Cm.QueryInterface(Ci.nsIComponentRegistrar).
|
||||
unregisterFactory(MOCK_CID, mockAlertsService);
|
||||
});
|
||||
|
||||
add_task(async function setup() {
|
||||
// make sure userContext, SW and notifications are enabled.
|
||||
await SpecialPowers.pushPrefEnv({"set": [
|
||||
["privacy.userContext.enabled", true],
|
||||
["dom.serviceWorkers.exemptFromPerDomainMax", true],
|
||||
["dom.serviceWorkers.enabled", true],
|
||||
["dom.serviceWorkers.testing.enabled", true],
|
||||
["dom.webnotifications.workers.enabled", true],
|
||||
["dom.webnotifications.serviceworker.enabled", true],
|
||||
["notification.prompt.testing", true],
|
||||
["dom.disable_open_click_delay", 1000],
|
||||
["dom.serviceWorkers.idle_timeout", 299999],
|
||||
["dom.serviceWorkers.idle_extended_timeout", 299999],
|
||||
["browser.link.open_newwindow", 3],
|
||||
]});
|
||||
});
|
||||
|
||||
add_task(async function test() {
|
||||
Cm.QueryInterface(Ci.nsIComponentRegistrar).
|
||||
registerFactory(MOCK_CID, "alerts service", ALERTS_SERVICE_CONTRACT_ID,
|
||||
mockAlertsService);
|
||||
|
||||
// open the tab in the correct userContextId
|
||||
let tab = BrowserTestUtils.addTab(gBrowser, URI, {userContextId: USER_CONTEXT_ID});
|
||||
let browser = gBrowser.getBrowserForTab(tab);
|
||||
|
||||
// select tab and make sure its browser is focused
|
||||
gBrowser.selectedTab = tab;
|
||||
tab.ownerGlobal.focus();
|
||||
|
||||
// wait for tab load
|
||||
await BrowserTestUtils.browserLoaded(gBrowser.getBrowserForTab(tab));
|
||||
|
||||
// Waiting for new tab.
|
||||
let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser, null, true);
|
||||
|
||||
// here the test.
|
||||
let uci = await ContentTask.spawn(browser, URI, uri => {
|
||||
let uci = content.document.nodePrincipal.userContextId;
|
||||
|
||||
// Registration of the SW
|
||||
return content.navigator.serviceWorker.register("file_userContextId_openWindow.js")
|
||||
|
||||
// Activation
|
||||
.then(swr => {
|
||||
return new content.window.Promise(resolve => {
|
||||
let worker = swr.installing;
|
||||
worker.addEventListener('statechange', () => {
|
||||
if (worker.state === 'activated') {
|
||||
resolve(swr);
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
|
||||
// Ask for an openWindow.
|
||||
.then(swr => {
|
||||
swr.showNotification("testPopup");
|
||||
return uci;
|
||||
});
|
||||
});
|
||||
|
||||
is(uci, USER_CONTEXT_ID, "Tab runs with UCI " + USER_CONTEXT_ID);
|
||||
|
||||
let newTab = await newTabPromise;
|
||||
|
||||
is(newTab.getAttribute("usercontextid"), USER_CONTEXT_ID, "New tab has UCI equal " + USER_CONTEXT_ID);
|
||||
|
||||
// wait for SW unregistration
|
||||
uci = await ContentTask.spawn(browser, null, () => {
|
||||
let uci = content.document.nodePrincipal.userContextId;
|
||||
|
||||
return content.navigator.serviceWorker.getRegistration(".").then(registration => {
|
||||
return registration.unregister();
|
||||
})
|
||||
.then(() => {
|
||||
return uci;
|
||||
});
|
||||
});
|
||||
|
||||
is(uci, USER_CONTEXT_ID, "Tab runs with UCI " + USER_CONTEXT_ID);
|
||||
|
||||
await BrowserTestUtils.removeTab(newTab);
|
||||
await BrowserTestUtils.removeTab(tab);
|
||||
});
|
|
@ -0,0 +1,3 @@
|
|||
onnotificationclick = event => {
|
||||
clients.openWindow("empty.html");
|
||||
}
|
|
@ -2430,13 +2430,31 @@ EditorBase::FindBetterInsertionPoint(nsCOMPtr<nsINode>& aNode,
|
|||
// In some other cases, aNode is the anonymous DIV, and offset points to the
|
||||
// terminating mozBR. In that case, we'll adjust aInOutNode and
|
||||
// aInOutOffset to the preceding text node, if any.
|
||||
if (offset > 0 && node->GetChildAt(offset - 1) &&
|
||||
node->GetChildAt(offset - 1)->IsNodeOfType(nsINode::eTEXT)) {
|
||||
if (offset) {
|
||||
if (offset == static_cast<int32_t>(node->GetChildCount())) {
|
||||
// If offset points to the last child, use a fast path that avoids calling
|
||||
// GetChildAt() which may perform a linear search.
|
||||
nsIContent* child = node->GetLastChild();
|
||||
while (child) {
|
||||
if (child->IsNodeOfType(nsINode::eTEXT)) {
|
||||
NS_ENSURE_TRUE_VOID(node->Length() <= INT32_MAX);
|
||||
aNode = node->GetChildAt(offset - 1);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sometimes, aNode is the mozBR element itself. In that case, we'll adjust
|
||||
|
|
|
@ -1728,7 +1728,6 @@ HTMLEditor::GetCSSBackgroundColorState(bool* aMixed,
|
|||
|
||||
// get selection location
|
||||
nsCOMPtr<nsINode> parent = selection->GetRangeAt(0)->GetStartContainer();
|
||||
int32_t offset = selection->GetRangeAt(0)->StartOffset();
|
||||
NS_ENSURE_TRUE(parent, NS_ERROR_NULL_POINTER);
|
||||
|
||||
// is the selection collapsed?
|
||||
|
@ -1739,7 +1738,7 @@ HTMLEditor::GetCSSBackgroundColorState(bool* aMixed,
|
|||
} else {
|
||||
// otherwise we want to look at the first editable node after
|
||||
// {parent,offset} and its ancestors for divs with alignment on them
|
||||
nodeToExamine = parent->GetChildAt(offset);
|
||||
nodeToExamine = selection->GetRangeAt(0)->GetChildAtStartOffset();
|
||||
//GetNextNode(parent, offset, true, address_of(nodeToExamine));
|
||||
}
|
||||
|
||||
|
@ -2350,16 +2349,15 @@ HTMLEditor::GetSelectedElement(const nsAString& aTagName,
|
|||
NS_ENSURE_STATE(range);
|
||||
|
||||
nsCOMPtr<nsINode> startContainer = range->GetStartContainer();
|
||||
uint32_t startOffset = range->StartOffset();
|
||||
nsIContent* startNode = range->GetChildAtStartOffset();
|
||||
|
||||
nsCOMPtr<nsINode> endContainer = range->GetEndContainer();
|
||||
uint32_t endOffset = range->EndOffset();
|
||||
nsIContent* endNode = range->GetChildAtEndOffset();
|
||||
|
||||
// Optimization for a single selected element
|
||||
if (startContainer && startContainer == endContainer &&
|
||||
endOffset - startOffset == 1) {
|
||||
nsCOMPtr<nsINode> selectedNode =
|
||||
startContainer->GetChildAt(static_cast<int32_t>(startOffset));
|
||||
startNode && endNode && startNode->GetNextSibling() == endNode) {
|
||||
nsCOMPtr<nsINode> selectedNode = startNode;
|
||||
if (selectedNode) {
|
||||
selectedNode->AsDOMNode()->GetNodeName(domTagName);
|
||||
ToLowerCase(domTagName);
|
||||
|
|
|
@ -9,11 +9,12 @@
|
|||
|
||||
#include "nsPkgInt.h"
|
||||
|
||||
typedef enum {
|
||||
eStart = 0,
|
||||
eError = 1,
|
||||
eItsMe = 2
|
||||
} nsSMState;
|
||||
/* Apart from these 3 generic states, machine states are specific to
|
||||
* each charset prober.
|
||||
*/
|
||||
#define eStart 0
|
||||
#define eError 1
|
||||
#define eItsMe 2
|
||||
|
||||
#define GETCLASS(c) GETFROMPCK(((unsigned char)(c)), mModel->classTable)
|
||||
|
||||
|
@ -33,7 +34,7 @@ typedef struct
|
|||
class nsCodingStateMachine {
|
||||
public:
|
||||
explicit nsCodingStateMachine(const SMModel* sm) : mModel(sm) { mCurrentState = eStart; }
|
||||
nsSMState NextState(char c){
|
||||
uint32_t NextState(char c){
|
||||
//for each byte we get its class , if it is first byte, we also get byte length
|
||||
uint32_t byteCls = GETCLASS(c);
|
||||
if (mCurrentState == eStart)
|
||||
|
@ -43,7 +44,7 @@ public:
|
|||
mCurrentCharLen = mModel->charLenTable[byteCls];
|
||||
}
|
||||
//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);
|
||||
mCurrentBytePos++;
|
||||
return mCurrentState;
|
||||
|
@ -53,7 +54,7 @@ public:
|
|||
const char * GetCodingStateMachine() {return mModel->name;}
|
||||
|
||||
protected:
|
||||
nsSMState mCurrentState;
|
||||
uint32_t mCurrentState;
|
||||
uint32_t mCurrentCharLen;
|
||||
uint32_t mCurrentBytePos;
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ void nsEUCJPProber::Reset(void)
|
|||
nsProbingState nsEUCJPProber::HandleData(const char* aBuf, uint32_t aLen)
|
||||
{
|
||||
NS_ASSERTION(aLen, "HandleData called with empty buffer");
|
||||
nsSMState codingState;
|
||||
uint32_t codingState;
|
||||
|
||||
for (uint32_t i = 0; i < aLen; i++)
|
||||
{
|
||||
|
|
|
@ -27,7 +27,7 @@ void nsEscCharSetProber::Reset(void)
|
|||
|
||||
nsProbingState nsEscCharSetProber::HandleData(const char* aBuf, uint32_t aLen)
|
||||
{
|
||||
nsSMState codingState;
|
||||
uint32_t codingState;
|
||||
uint32_t i;
|
||||
|
||||
for ( i = 0; i < aLen && mState == eDetecting; i++)
|
||||
|
|
|
@ -22,7 +22,7 @@ void nsSJISProber::Reset(void)
|
|||
nsProbingState nsSJISProber::HandleData(const char* aBuf, uint32_t aLen)
|
||||
{
|
||||
NS_ASSERTION(aLen, "HandleData called with empty buffer");
|
||||
nsSMState codingState;
|
||||
uint32_t codingState;
|
||||
|
||||
for (uint32_t i = 0; i < aLen; i++)
|
||||
{
|
||||
|
|
|
@ -14,7 +14,7 @@ void nsUTF8Prober::Reset(void)
|
|||
|
||||
nsProbingState nsUTF8Prober::HandleData(const char* aBuf, uint32_t aLen)
|
||||
{
|
||||
nsSMState codingState;
|
||||
uint32_t codingState;
|
||||
|
||||
for (uint32_t i = 0; i < aLen; i++)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<script type="application/javascript" src="apz_test_native_event_utils.js"></script>
|
||||
<script type="application/javascript" src="apz_test_utils.js"></script>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/paint_listener.js"></script>
|
||||
<script type="application/javascript">
|
||||
function* test(testDriver) {
|
||||
var subframe = document.getElementById('content-wrapper');
|
||||
|
||||
// scroll over the middle of the subframe, to make sure it scrolls,
|
||||
// not the page
|
||||
var scrollPos = subframe.scrollTop;
|
||||
yield moveMouseAndScrollWheelOver(subframe, 100, 100, testDriver);
|
||||
ok(subframe.scrollTop > scrollPos, "subframe scrolled after wheeling over it");
|
||||
}
|
||||
|
||||
waitUntilApzStable()
|
||||
.then(runContinuation(test))
|
||||
.then(subtestDone);
|
||||
|
||||
</script>
|
||||
<style>
|
||||
html {
|
||||
perspective:1000px;
|
||||
overflow: hidden;
|
||||
}
|
||||
#fullscreen-wrapper {
|
||||
display:table;
|
||||
visibility:hidden;
|
||||
width:100%;
|
||||
height:100%;
|
||||
position:fixed;
|
||||
top:0;
|
||||
left:0;
|
||||
overflow:hidden;
|
||||
z-index:9999;
|
||||
perspective:1000px;
|
||||
}
|
||||
#content-wrapper {
|
||||
overflow-y:auto;
|
||||
height: 100vh;
|
||||
}
|
||||
#content-content {
|
||||
min-height: 10000px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="fullscreen-wrapper">
|
||||
<div></div>
|
||||
</div>
|
||||
<div id="content-wrapper">
|
||||
<div id="content-content">
|
||||
A<br>
|
||||
B<br>
|
||||
C<br>
|
||||
D<br>
|
||||
E<br>
|
||||
f<br>
|
||||
g<br>
|
||||
h<br>
|
||||
i<br>
|
||||
j<br>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</head>
|
|
@ -25,6 +25,7 @@
|
|||
helper_scroll_inactive_zindex.html
|
||||
helper_scroll_on_position_fixed.html
|
||||
helper_scroll_over_scrollbar.html
|
||||
helper_scroll_tables_perspective.html
|
||||
helper_scrollto_tap.html
|
||||
helper_subframe_style.css
|
||||
helper_tall.html
|
||||
|
|
|
@ -31,7 +31,8 @@ var subtests = [
|
|||
{'file': 'helper_bug1271432.html', 'prefs': prefs},
|
||||
{'file': 'helper_scroll_inactive_perspective.html', 'prefs': prefs},
|
||||
{'file': 'helper_scroll_inactive_zindex.html', 'prefs': prefs},
|
||||
{'file': 'helper_scroll_over_scrollbar.html', 'prefs': scrollbar_prefs}
|
||||
{'file': 'helper_scroll_over_scrollbar.html', 'prefs': scrollbar_prefs},
|
||||
{'file': 'helper_scroll_tables_perspective.html', 'prefs': prefs},
|
||||
];
|
||||
|
||||
if (isApzEnabled()) {
|
||||
|
|
|
@ -142,6 +142,13 @@ if os_bsd or os_linux:
|
|||
'src/base/message_pump_glib.cc',
|
||||
]
|
||||
|
||||
if os_solaris:
|
||||
SOURCES += [
|
||||
'src/base/atomicops_internals_x86_gcc.cc',
|
||||
'src/base/process_util_linux.cc',
|
||||
'src/base/time_posix.cc',
|
||||
]
|
||||
|
||||
ost = CONFIG['OS_TEST']
|
||||
if '86' not in ost and 'arm' not in ost and 'aarch64' != ost and 'mips' not in ost:
|
||||
SOURCES += [
|
||||
|
|
|
@ -2431,7 +2431,7 @@ CopyArray(JSContext* cx, HandleArrayObject arr, MutableHandleValue result)
|
|||
if (!nobj)
|
||||
return false;
|
||||
EnsureArrayGroupAnalyzed(cx, nobj); //XXX
|
||||
CopyBoxedOrUnboxedDenseElements(cx, nobj, arr, 0, 0, length);
|
||||
nobj->initDenseElements(arr, 0, length);
|
||||
|
||||
result.setObject(*nobj);
|
||||
return true;
|
||||
|
|
|
@ -8713,11 +8713,10 @@ CodeGenerator::visitFallibleStoreElementV(LFallibleStoreElementV* lir)
|
|||
masm.bind(&isFrozen);
|
||||
}
|
||||
|
||||
typedef bool (*SetDenseOrUnboxedArrayElementFn)(JSContext*, HandleObject, int32_t,
|
||||
HandleValue, bool strict);
|
||||
static const VMFunction SetDenseOrUnboxedArrayElementInfo =
|
||||
FunctionInfo<SetDenseOrUnboxedArrayElementFn>(SetDenseOrUnboxedArrayElement,
|
||||
"SetDenseOrUnboxedArrayElement");
|
||||
typedef bool (*SetDenseElementFn)(JSContext*, HandleNativeObject, int32_t, HandleValue,
|
||||
bool strict);
|
||||
static const VMFunction SetDenseElementInfo =
|
||||
FunctionInfo<SetDenseElementFn>(jit::SetDenseElement, "SetDenseElement");
|
||||
|
||||
void
|
||||
CodeGenerator::visitOutOfLineStoreElementHole(OutOfLineStoreElementHole* ool)
|
||||
|
@ -8826,7 +8825,7 @@ CodeGenerator::visitOutOfLineStoreElementHole(OutOfLineStoreElementHole* ool)
|
|||
else
|
||||
pushArg(ToRegister(index));
|
||||
pushArg(object);
|
||||
callVM(SetDenseOrUnboxedArrayElementInfo, ins);
|
||||
callVM(SetDenseElementInfo, ins);
|
||||
|
||||
restoreLive(ins);
|
||||
masm.jump(ool->rejoin());
|
||||
|
@ -9015,7 +9014,7 @@ CodeGenerator::visitArrayPopShiftT(LArrayPopShiftT* lir)
|
|||
emitArrayPopShift(lir, lir->mir(), obj, elements, length, out);
|
||||
}
|
||||
|
||||
typedef bool (*ArrayPushDenseFn)(JSContext*, HandleObject, HandleValue, uint32_t*);
|
||||
typedef bool (*ArrayPushDenseFn)(JSContext*, HandleArrayObject, HandleValue, uint32_t*);
|
||||
static const VMFunction ArrayPushDenseInfo =
|
||||
FunctionInfo<ArrayPushDenseFn>(jit::ArrayPushDense, "ArrayPushDense");
|
||||
|
||||
|
|
|
@ -350,11 +350,10 @@ ArrayPopDense(JSContext* cx, HandleObject obj, MutableHandleValue rval)
|
|||
}
|
||||
|
||||
bool
|
||||
ArrayPushDense(JSContext* cx, HandleObject obj, HandleValue v, uint32_t* length)
|
||||
ArrayPushDense(JSContext* cx, HandleArrayObject arr, HandleValue v, uint32_t* length)
|
||||
{
|
||||
*length = obj->as<ArrayObject>().length();
|
||||
DenseElementResult result =
|
||||
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, *length, v.address(), 1,
|
||||
*length = arr->length();
|
||||
DenseElementResult result = arr->setOrExtendDenseElements(cx, *length, v.address(), 1,
|
||||
ShouldUpdateTypes::DontUpdate);
|
||||
if (result != DenseElementResult::Incomplete) {
|
||||
(*length)++;
|
||||
|
@ -362,9 +361,9 @@ ArrayPushDense(JSContext* cx, HandleObject obj, HandleValue v, uint32_t* length)
|
|||
}
|
||||
|
||||
// AutoDetectInvalidation uses GetTopJitJSScript(cx)->ionScript(), but it's
|
||||
// possible the SetOrExtendAnyBoxedOrUnboxedDenseElements call already
|
||||
// invalidated the IonScript. JSJitFrameIter::ionScript works when the
|
||||
// script is invalidated so we use that instead.
|
||||
// possible the setOrExtendDenseElements call already invalidated the
|
||||
// IonScript. JSJitFrameIter::ionScript works when the script is invalidated
|
||||
// so we use that instead.
|
||||
JSJitFrameIter frame(cx);
|
||||
MOZ_ASSERT(frame.type() == JitFrame_Exit);
|
||||
++frame;
|
||||
|
@ -373,7 +372,7 @@ ArrayPushDense(JSContext* cx, HandleObject obj, HandleValue v, uint32_t* length)
|
|||
JS::AutoValueArray<3> argv(cx);
|
||||
AutoDetectInvalidation adi(cx, argv[0], ionScript);
|
||||
argv[0].setUndefined();
|
||||
argv[1].setObject(*obj);
|
||||
argv[1].setObject(*arr);
|
||||
argv[2].set(v);
|
||||
if (!js::array_push(cx, 1, argv.begin()))
|
||||
return false;
|
||||
|
@ -1050,8 +1049,7 @@ InitRestParameter(JSContext* cx, uint32_t length, Value* rest, HandleObject temp
|
|||
if (length > 0) {
|
||||
if (!arrRes->ensureElements(cx, length))
|
||||
return nullptr;
|
||||
arrRes->setDenseInitializedLength(length);
|
||||
arrRes->initDenseElements(0, rest, length);
|
||||
arrRes->initDenseElements(rest, length);
|
||||
arrRes->setLengthInt32(length);
|
||||
}
|
||||
return arrRes;
|
||||
|
@ -1297,15 +1295,14 @@ Recompile(JSContext* cx)
|
|||
}
|
||||
|
||||
bool
|
||||
SetDenseOrUnboxedArrayElement(JSContext* cx, HandleObject obj, int32_t index,
|
||||
HandleValue value, bool strict)
|
||||
SetDenseElement(JSContext* cx, HandleNativeObject obj, int32_t index, HandleValue value,
|
||||
bool strict)
|
||||
{
|
||||
// This function is called from Ion code for StoreElementHole's OOL path.
|
||||
// In this case we know the object is native or an unboxed array and that
|
||||
// no type changes are needed.
|
||||
// In this case we know the object is native and that no type changes are
|
||||
// needed.
|
||||
|
||||
DenseElementResult result =
|
||||
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, index, value.address(), 1,
|
||||
DenseElementResult result = obj->setOrExtendDenseElements(cx, index, value.address(), 1,
|
||||
ShouldUpdateTypes::DontUpdate);
|
||||
if (result != DenseElementResult::Incomplete)
|
||||
return result == DenseElementResult::Success;
|
||||
|
|
|
@ -662,7 +662,8 @@ MOZ_MUST_USE bool StringSplitHelper(JSContext* cx, HandleString str, HandleStrin
|
|||
MutableHandleValue result);
|
||||
|
||||
MOZ_MUST_USE bool ArrayPopDense(JSContext* cx, HandleObject obj, MutableHandleValue rval);
|
||||
MOZ_MUST_USE bool ArrayPushDense(JSContext* cx, HandleObject obj, HandleValue v, uint32_t* length);
|
||||
MOZ_MUST_USE bool ArrayPushDense(JSContext* cx, HandleArrayObject arr, HandleValue v,
|
||||
uint32_t* length);
|
||||
MOZ_MUST_USE bool ArrayShiftDense(JSContext* cx, HandleObject obj, MutableHandleValue rval);
|
||||
JSString* ArrayJoin(JSContext* cx, HandleObject array, HandleString sep);
|
||||
MOZ_MUST_USE bool SetArrayLength(JSContext* cx, HandleObject obj, HandleValue value, bool strict);
|
||||
|
@ -796,7 +797,7 @@ ForcedRecompile(JSContext* cx);
|
|||
JSString* StringReplace(JSContext* cx, HandleString string, HandleString pattern,
|
||||
HandleString repl);
|
||||
|
||||
MOZ_MUST_USE bool SetDenseOrUnboxedArrayElement(JSContext* cx, HandleObject obj, int32_t index,
|
||||
MOZ_MUST_USE bool SetDenseElement(JSContext* cx, HandleNativeObject obj, int32_t index,
|
||||
HandleValue value, bool strict);
|
||||
|
||||
void AssertValidObjectPtr(JSContext* cx, JSObject* obj);
|
||||
|
|
|
@ -2272,24 +2272,44 @@ Assembler::PatchConstantPoolLoad(void* loadAddr, void* constPoolAddr)
|
|||
|
||||
// Atomic instruction stuff:
|
||||
|
||||
BufferOffset
|
||||
Assembler::as_ldrexd(Register rt, Register rt2, Register rn, Condition c)
|
||||
{
|
||||
MOZ_ASSERT(!(rt.code() & 1) && rt2.code() == rt.code()+1);
|
||||
MOZ_ASSERT(rt.code() != 14 && rn.code() != 15);
|
||||
return writeInst(0x01b00f9f | (int)c | RT(rt) | RN(rn));
|
||||
}
|
||||
|
||||
BufferOffset
|
||||
Assembler::as_ldrex(Register rt, Register rn, Condition c)
|
||||
{
|
||||
MOZ_ASSERT(rt.code() != 15 && rn.code() != 15);
|
||||
return writeInst(0x01900f9f | (int)c | RT(rt) | RN(rn));
|
||||
}
|
||||
|
||||
BufferOffset
|
||||
Assembler::as_ldrexh(Register rt, Register rn, Condition c)
|
||||
{
|
||||
MOZ_ASSERT(rt.code() != 15 && rn.code() != 15);
|
||||
return writeInst(0x01f00f9f | (int)c | RT(rt) | RN(rn));
|
||||
}
|
||||
|
||||
BufferOffset
|
||||
Assembler::as_ldrexb(Register rt, Register rn, Condition c)
|
||||
{
|
||||
MOZ_ASSERT(rt.code() != 15 && rn.code() != 15);
|
||||
return writeInst(0x01d00f9f | (int)c | RT(rt) | RN(rn));
|
||||
}
|
||||
|
||||
BufferOffset
|
||||
Assembler::as_strexd(Register rd, Register rt, Register rt2, Register rn, Condition c)
|
||||
{
|
||||
MOZ_ASSERT(!(rt.code() & 1) && rt2.code() == rt.code()+1);
|
||||
MOZ_ASSERT(rt.code() != 14 && rn.code() != 15 && rd.code() != 15);
|
||||
MOZ_ASSERT(rd != rn && rd != rt && rd != rt2);
|
||||
return writeInst(0x01a00f90 | (int)c | RD(rd) | RN(rn) | rt.code());
|
||||
}
|
||||
|
||||
BufferOffset
|
||||
Assembler::as_strex(Register rd, Register rt, Register rn, Condition c)
|
||||
{
|
||||
|
@ -2311,6 +2331,12 @@ Assembler::as_strexb(Register rd, Register rt, Register rn, Condition c)
|
|||
return writeInst(0x01c00f90 | (int)c | RD(rd) | RN(rn) | rt.code());
|
||||
}
|
||||
|
||||
BufferOffset
|
||||
Assembler::as_clrex()
|
||||
{
|
||||
return writeInst(0xf57ff01f);
|
||||
}
|
||||
|
||||
// Memory barrier stuff:
|
||||
|
||||
BufferOffset
|
||||
|
|
|
@ -1560,23 +1560,32 @@ class Assembler : public AssemblerShared
|
|||
// Load a 32 bit floating point immediate from a pool into a register.
|
||||
BufferOffset as_FImm32Pool(VFPRegister dest, float value, Condition c = Always);
|
||||
|
||||
// Atomic instructions: ldrex, ldrexh, ldrexb, strex, strexh, strexb.
|
||||
// Atomic instructions: ldrexd, ldrex, ldrexh, ldrexb, strexd, strex, strexh, strexb.
|
||||
//
|
||||
// The halfword and byte versions are available from ARMv6K forward.
|
||||
// The doubleword, halfword, and byte versions are available from ARMv6K forward.
|
||||
//
|
||||
// The word versions are available from ARMv6 forward and can be used to
|
||||
// implement the halfword and byte versions on older systems.
|
||||
|
||||
// LDREXD rt, rt2, [rn]. Constraint: rt even register, rt2=rt+1.
|
||||
BufferOffset as_ldrexd(Register rt, Register rt2, Register rn, Condition c = Always);
|
||||
|
||||
// LDREX rt, [rn]
|
||||
BufferOffset as_ldrex(Register rt, Register rn, Condition c = Always);
|
||||
BufferOffset as_ldrexh(Register rt, Register rn, Condition c = Always);
|
||||
BufferOffset as_ldrexb(Register rt, Register rn, Condition c = Always);
|
||||
|
||||
// STREXD rd, rt, rt2, [rn]. Constraint: rt even register, rt2=rt+1.
|
||||
BufferOffset as_strexd(Register rd, Register rt, Register rt2, Register rn, Condition c = Always);
|
||||
|
||||
// STREX rd, rt, [rn]. Constraint: rd != rn, rd != rt.
|
||||
BufferOffset as_strex(Register rd, Register rt, Register rn, Condition c = Always);
|
||||
BufferOffset as_strexh(Register rd, Register rt, Register rn, Condition c = Always);
|
||||
BufferOffset as_strexb(Register rd, Register rt, Register rn, Condition c = Always);
|
||||
|
||||
// CLREX
|
||||
BufferOffset as_clrex();
|
||||
|
||||
// Memory synchronization.
|
||||
// These are available from ARMv7 forward.
|
||||
BufferOffset as_dmb(BarrierOption option = BarrierSY);
|
||||
|
|
|
@ -1986,33 +1986,33 @@ Simulator::writeDW(int32_t addr, int32_t value1, int32_t value2)
|
|||
int32_t
|
||||
Simulator::readExDW(int32_t addr, int32_t* hibits)
|
||||
{
|
||||
#if defined(__clang__) && defined(__i386)
|
||||
// This is OK for now, we don't yet generate LDREXD.
|
||||
MOZ_CRASH("Unimplemented - 8-byte atomics are unsupported in Clang on i386");
|
||||
#else
|
||||
if ((addr & 3) == 0) {
|
||||
SharedMem<uint64_t*> ptr = SharedMem<uint64_t*>::shared(reinterpret_cast<uint64_t*>(addr));
|
||||
// The spec says that the low part of value shall be read from addr and
|
||||
// the high part shall be read from addr+4. On a little-endian system
|
||||
// where we read a 64-bit quadword the low part of the value will be in
|
||||
// the low part of the quadword, and the high part of the value in the
|
||||
// high part of the quadword.
|
||||
uint64_t value = loadRelaxed(ptr);
|
||||
exclusiveMonitorSet(value);
|
||||
*hibits = int32_t(value);
|
||||
return int32_t(value >> 32);
|
||||
*hibits = int32_t(value >> 32);
|
||||
return int32_t(value);
|
||||
}
|
||||
printf("Unaligned read at 0x%08x\n", addr);
|
||||
MOZ_CRASH();
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int32_t
|
||||
Simulator::writeExDW(int32_t addr, int32_t value1, int32_t value2)
|
||||
{
|
||||
#if defined(__clang__) && defined(__i386)
|
||||
// This is OK for now, we don't yet generate STREXD.
|
||||
MOZ_CRASH("Unimplemented - 8-byte atomics are unsupported in Clang on i386");
|
||||
#else
|
||||
if ((addr & 3) == 0) {
|
||||
SharedMem<uint64_t*> ptr = SharedMem<uint64_t*>::shared(reinterpret_cast<uint64_t*>(addr));
|
||||
uint64_t value = (uint64_t(value1) << 32) | uint32_t(value2);
|
||||
// The spec says that value1 shall be stored at addr and value2 at
|
||||
// addr+4. On a little-endian system that means constructing a 64-bit
|
||||
// value where value1 is in the low half of a 64-bit quadword and value2
|
||||
// is in the high half of the quadword.
|
||||
uint64_t value = (uint64_t(value2) << 32) | uint32_t(value1);
|
||||
bool held;
|
||||
uint64_t expected = exclusiveMonitorGetAndClear(&held);
|
||||
if (!held)
|
||||
|
@ -2023,7 +2023,6 @@ Simulator::writeExDW(int32_t addr, int32_t value1, int32_t value2)
|
|||
printf("Unaligned write at 0x%08x\n", addr);
|
||||
MOZ_CRASH();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
uintptr_t
|
||||
|
@ -4689,6 +4688,9 @@ Simulator::decodeSpecialCondition(SimInstruction* instr)
|
|||
case 0xA:
|
||||
if (instr->bits(31,20) == 0xf57) {
|
||||
switch (instr->bits(7,4)) {
|
||||
case 1: // CLREX
|
||||
exclusiveMonitorClear();
|
||||
break;
|
||||
case 5: // DMB
|
||||
AtomicOperations::fenceSeqCst();
|
||||
break;
|
||||
|
|
|
@ -1891,6 +1891,9 @@ Decoder::DecodeSpecialCondition(Instruction* instr)
|
|||
case 15: option = "sy"; break;
|
||||
}
|
||||
switch (instr->Bits(7, 4)) {
|
||||
case 1:
|
||||
Print("clrex");
|
||||
break;
|
||||
case 4:
|
||||
out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
|
||||
"dsb %s", option);
|
||||
|
|
|
@ -3677,7 +3677,7 @@ CloneFunctionObject(JSContext* cx, HandleObject funobj, HandleObject env, Handle
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
if (IsAsmJSModule(fun)) {
|
||||
if (IsAsmJSModule(fun) || wasm::IsExportedFunction(fun)) {
|
||||
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_CANT_CLONE_OBJECT);
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -338,8 +338,8 @@ ElementAdder::append(JSContext* cx, HandleValue v)
|
|||
{
|
||||
MOZ_ASSERT(index_ < length_);
|
||||
if (resObj_) {
|
||||
DenseElementResult result =
|
||||
SetOrExtendBoxedOrUnboxedDenseElements(cx, resObj_, index_, v.address(), 1);
|
||||
NativeObject* resObj = &resObj_->as<NativeObject>();
|
||||
DenseElementResult result = resObj->setOrExtendDenseElements(cx, index_, v.address(), 1);
|
||||
if (result == DenseElementResult::Failure)
|
||||
return false;
|
||||
if (result == DenseElementResult::Incomplete) {
|
||||
|
@ -1491,9 +1491,9 @@ SetArrayElements(JSContext* cx, HandleObject obj, uint64_t start,
|
|||
return true;
|
||||
|
||||
if (!ObjectMayHaveExtraIndexedProperties(obj) && start <= UINT32_MAX) {
|
||||
DenseElementResult result =
|
||||
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, uint32_t(start), vector, count,
|
||||
updateTypes);
|
||||
NativeObject* nobj = &obj->as<NativeObject>();
|
||||
DenseElementResult result = nobj->setOrExtendDenseElements(cx, uint32_t(start), vector,
|
||||
count, updateTypes);
|
||||
if (result != DenseElementResult::Incomplete)
|
||||
return result == DenseElementResult::Success;
|
||||
}
|
||||
|
@ -2283,7 +2283,7 @@ js::array_push(JSContext* cx, unsigned argc, Value* vp)
|
|||
|
||||
if (!ObjectMayHaveExtraIndexedProperties(obj) && length <= UINT32_MAX) {
|
||||
DenseElementResult result =
|
||||
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, uint32_t(length),
|
||||
obj->as<NativeObject>().setOrExtendDenseElements(cx, uint32_t(length),
|
||||
args.array(), args.length());
|
||||
if (result != DenseElementResult::Incomplete) {
|
||||
if (result == DenseElementResult::Failure)
|
||||
|
@ -2292,9 +2292,8 @@ js::array_push(JSContext* cx, unsigned argc, Value* vp)
|
|||
uint32_t newlength = uint32_t(length) + args.length();
|
||||
args.rval().setNumber(newlength);
|
||||
|
||||
// SetOrExtendAnyBoxedOrUnboxedDenseElements takes care of updating the
|
||||
// length for boxed and unboxed arrays. Handle updates to the length of
|
||||
// non-arrays here.
|
||||
// setOrExtendDenseElements takes care of updating the length for
|
||||
// arrays. Handle updates to the length of non-arrays here.
|
||||
if (!obj->is<ArrayObject>()) {
|
||||
MOZ_ASSERT(obj->is<NativeObject>());
|
||||
return SetLengthProperty(cx, obj, newlength);
|
||||
|
@ -2381,6 +2380,20 @@ SetInitializedLength(JSContext* cx, NativeObject* obj, size_t initlen)
|
|||
obj->shrinkElements(cx, initlen);
|
||||
}
|
||||
|
||||
static DenseElementResult
|
||||
MoveDenseElements(JSContext* cx, NativeObject* obj, uint32_t dstStart, uint32_t srcStart,
|
||||
uint32_t length)
|
||||
{
|
||||
if (obj->denseElementsAreFrozen())
|
||||
return DenseElementResult::Incomplete;
|
||||
|
||||
if (!obj->maybeCopyElementsForWrite(cx))
|
||||
return DenseElementResult::Failure;
|
||||
obj->moveDenseElements(dstStart, srcStart, length);
|
||||
|
||||
return DenseElementResult::Success;
|
||||
}
|
||||
|
||||
static DenseElementResult
|
||||
ArrayShiftDenseKernel(JSContext* cx, HandleObject obj, MutableHandleValue rval)
|
||||
{
|
||||
|
@ -2401,7 +2414,7 @@ ArrayShiftDenseKernel(JSContext* cx, HandleObject obj, MutableHandleValue rval)
|
|||
if (obj->as<NativeObject>().tryShiftDenseElements(1))
|
||||
return DenseElementResult::Success;
|
||||
|
||||
DenseElementResult result = MoveBoxedOrUnboxedDenseElements(cx, obj, 0, 1, initlen - 1);
|
||||
DenseElementResult result = MoveDenseElements(cx, &obj->as<NativeObject>(), 0, 1, initlen - 1);
|
||||
if (result != DenseElementResult::Success)
|
||||
return result;
|
||||
|
||||
|
@ -2661,14 +2674,12 @@ CopyDenseArrayElements(JSContext* cx, HandleNativeObject obj, uint32_t begin, ui
|
|||
if (!narr)
|
||||
return nullptr;
|
||||
|
||||
MOZ_ASSERT(count >= narr->as<ArrayObject>().length());
|
||||
narr->as<ArrayObject>().setLength(cx, count);
|
||||
MOZ_ASSERT(count >= narr->length());
|
||||
narr->setLength(cx, count);
|
||||
|
||||
if (newlength > 0)
|
||||
narr->initDenseElements(obj, begin, newlength);
|
||||
|
||||
if (newlength) {
|
||||
DebugOnly<DenseElementResult> result =
|
||||
CopyBoxedOrUnboxedDenseElements(cx, narr, obj, 0, begin, newlength);
|
||||
MOZ_ASSERT(result.value == DenseElementResult::Success);
|
||||
}
|
||||
return narr;
|
||||
}
|
||||
|
||||
|
@ -2856,14 +2867,14 @@ array_splice_impl(JSContext* cx, unsigned argc, Value* vp, bool returnValueIsUse
|
|||
MOZ_ASSERT(sourceIndex <= len && targetIndex <= len && len <= UINT32_MAX,
|
||||
"sourceIndex and targetIndex are uint32 array indices");
|
||||
MOZ_ASSERT(finalLength < len, "finalLength is strictly less than len");
|
||||
MOZ_ASSERT(obj->isNative());
|
||||
|
||||
/* Steps 15.a-b. */
|
||||
if (targetIndex != 0 ||
|
||||
!obj->is<NativeObject>() ||
|
||||
!obj->as<NativeObject>().tryShiftDenseElements(sourceIndex))
|
||||
{
|
||||
DenseElementResult result =
|
||||
MoveBoxedOrUnboxedDenseElements(cx, obj, uint32_t(targetIndex),
|
||||
DenseElementResult result = MoveDenseElements(cx, &obj->as<NativeObject>(),
|
||||
uint32_t(targetIndex),
|
||||
uint32_t(sourceIndex),
|
||||
uint32_t(len - sourceIndex));
|
||||
MOZ_ASSERT(result != DenseElementResult::Incomplete);
|
||||
|
@ -2962,8 +2973,8 @@ array_splice_impl(JSContext* cx, unsigned argc, Value* vp, bool returnValueIsUse
|
|||
uint32_t start = uint32_t(actualStart);
|
||||
uint32_t length = uint32_t(len);
|
||||
|
||||
DenseElementResult result =
|
||||
MoveBoxedOrUnboxedDenseElements(cx, obj, start + itemCount,
|
||||
DenseElementResult result = MoveDenseElements(cx, &obj->as<NativeObject>(),
|
||||
start + itemCount,
|
||||
start + deleteCount,
|
||||
length - (start + deleteCount));
|
||||
MOZ_ASSERT(result != DenseElementResult::Incomplete);
|
||||
|
@ -3336,10 +3347,10 @@ ArraySliceDenseKernel(JSContext* cx, ArrayObject* arr, int32_t beginArg, int32_t
|
|||
size_t initlen = arr->getDenseInitializedLength();
|
||||
if (initlen > begin) {
|
||||
uint32_t newlength = Min<uint32_t>(initlen - begin, count);
|
||||
if (newlength) {
|
||||
if (newlength > 0) {
|
||||
if (!result->ensureElements(cx, newlength))
|
||||
return false;
|
||||
CopyBoxedOrUnboxedDenseElements(cx, result, arr, 0, begin, newlength);
|
||||
result->initDenseElements(arr, begin, newlength);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3844,11 +3855,10 @@ js::NewDenseCopiedArray(JSContext* cx, uint32_t length, const Value* values,
|
|||
return nullptr;
|
||||
|
||||
MOZ_ASSERT(arr->getDenseCapacity() >= length);
|
||||
|
||||
arr->setDenseInitializedLength(values ? length : 0);
|
||||
MOZ_ASSERT(arr->getDenseInitializedLength() == 0);
|
||||
|
||||
if (values)
|
||||
arr->initDenseElements(0, values, length);
|
||||
arr->initDenseElements(values, length);
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
@ -4005,8 +4015,7 @@ js::NewCopiedArrayTryUseGroup(JSContext* cx, HandleObjectGroup group,
|
|||
if (!obj)
|
||||
return nullptr;
|
||||
|
||||
DenseElementResult result =
|
||||
SetOrExtendBoxedOrUnboxedDenseElements(cx, obj, 0, vp, length, updateTypes);
|
||||
DenseElementResult result = obj->setOrExtendDenseElements(cx, 0, vp, length, updateTypes);
|
||||
if (result == DenseElementResult::Failure)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -102,12 +102,6 @@ NewFullyAllocatedArrayForCallingAllocationSite(JSContext* cx, size_t length,
|
|||
extern ArrayObject*
|
||||
NewPartlyAllocatedArrayForCallingAllocationSite(JSContext* cx, size_t length, HandleObject proto);
|
||||
|
||||
enum class ShouldUpdateTypes
|
||||
{
|
||||
Update,
|
||||
DontUpdate
|
||||
};
|
||||
|
||||
extern ArrayObject*
|
||||
NewCopiedArrayTryUseGroup(JSContext* cx, HandleObjectGroup group,
|
||||
const Value* vp, size_t length,
|
||||
|
|
|
@ -646,6 +646,13 @@ if CONFIG['NIGHTLY_BUILD']:
|
|||
if CONFIG['NIGHTLY_BUILD']:
|
||||
DEFINES['ENABLE_WASM_THREAD_OPS'] = True
|
||||
|
||||
# Wasm code should use WASM_HUGE_MEMORY instead of JS_CODEGEN_X64
|
||||
# so that it is easy to use the huge-mapping optimization for other
|
||||
# 64-bit platforms in the future.
|
||||
|
||||
if CONFIG['JS_CODEGEN_X64']:
|
||||
DEFINES['WASM_HUGE_MEMORY'] = True
|
||||
|
||||
if CONFIG['MOZ_DEBUG'] or CONFIG['NIGHTLY_BUILD']:
|
||||
DEFINES['JS_CACHEIR_SPEW'] = True
|
||||
|
||||
|
|
|
@ -3047,14 +3047,13 @@ static bool
|
|||
Clone(JSContext* cx, unsigned argc, Value* vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
RootedObject parent(cx);
|
||||
RootedObject funobj(cx);
|
||||
|
||||
if (!args.length()) {
|
||||
if (args.length() == 0) {
|
||||
JS_ReportErrorASCII(cx, "Invalid arguments to clone");
|
||||
return false;
|
||||
}
|
||||
|
||||
RootedObject funobj(cx);
|
||||
{
|
||||
Maybe<JSAutoCompartment> ac;
|
||||
RootedObject obj(cx, args[0].isPrimitive() ? nullptr : &args[0].toObject());
|
||||
|
@ -3074,19 +3073,20 @@ Clone(JSContext* cx, unsigned argc, Value* vp)
|
|||
}
|
||||
}
|
||||
|
||||
RootedObject env(cx);
|
||||
if (args.length() > 1) {
|
||||
if (!JS_ValueToObject(cx, args[1], &parent))
|
||||
if (!JS_ValueToObject(cx, args[1], &env))
|
||||
return false;
|
||||
} else {
|
||||
parent = js::GetGlobalForObjectCrossCompartment(&args.callee());
|
||||
env = js::GetGlobalForObjectCrossCompartment(&args.callee());
|
||||
}
|
||||
|
||||
// Should it worry us that we might be getting with wrappers
|
||||
// around with wrappers here?
|
||||
JS::AutoObjectVector scopeChain(cx);
|
||||
if (!parent->is<GlobalObject>() && !scopeChain.append(parent))
|
||||
JS::AutoObjectVector envChain(cx);
|
||||
if (env && !env->is<GlobalObject>() && !envChain.append(env))
|
||||
return false;
|
||||
JSObject* clone = JS::CloneFunctionObject(cx, funobj, scopeChain);
|
||||
JSObject* clone = JS::CloneFunctionObject(cx, funobj, envChain);
|
||||
if (!clone)
|
||||
return false;
|
||||
args.rval().setObject(*clone);
|
||||
|
@ -6213,6 +6213,10 @@ WasmLoop(JSContext* cx, unsigned argc, Value* vp)
|
|||
}
|
||||
|
||||
static const JSFunctionSpecWithHelp shell_functions[] = {
|
||||
JS_FN_HELP("clone", Clone, 1, 0,
|
||||
"clone(fun[, scope])",
|
||||
" Clone function object."),
|
||||
|
||||
JS_FN_HELP("version", Version, 0, 0,
|
||||
"version([number])",
|
||||
" Get or force a script compilation version number."),
|
||||
|
@ -6694,10 +6698,6 @@ static const JSFunctionSpecWithHelp shell_functions[] = {
|
|||
};
|
||||
|
||||
static const JSFunctionSpecWithHelp fuzzing_unsafe_functions[] = {
|
||||
JS_FN_HELP("clone", Clone, 1, 0,
|
||||
"clone(fun[, scope])",
|
||||
" Clone function object."),
|
||||
|
||||
JS_FN_HELP("getSelfHostedValue", GetSelfHostedValue, 1, 0,
|
||||
"getSelfHostedValue()",
|
||||
" Get a self-hosted value by its name. Note that these values don't get \n"
|
||||
|
|
|
@ -158,17 +158,31 @@ NativeObject::copyDenseElements(uint32_t dstStart, const Value* src, uint32_t co
|
|||
}
|
||||
|
||||
inline void
|
||||
NativeObject::initDenseElements(uint32_t dstStart, const Value* src, uint32_t count)
|
||||
NativeObject::initDenseElements(NativeObject* src, uint32_t srcStart, uint32_t count)
|
||||
{
|
||||
MOZ_ASSERT(dstStart + count <= getDenseCapacity());
|
||||
MOZ_ASSERT(src->getDenseInitializedLength() >= srcStart + count);
|
||||
|
||||
const Value* vp = src->getDenseElements() + srcStart;
|
||||
initDenseElements(vp, count);
|
||||
}
|
||||
|
||||
inline void
|
||||
NativeObject::initDenseElements(const Value* src, uint32_t count)
|
||||
{
|
||||
MOZ_ASSERT(getDenseInitializedLength() == 0);
|
||||
MOZ_ASSERT(count <= getDenseCapacity());
|
||||
MOZ_ASSERT(!denseElementsAreCopyOnWrite());
|
||||
MOZ_ASSERT(!denseElementsAreFrozen());
|
||||
|
||||
setDenseInitializedLength(count);
|
||||
|
||||
#ifdef DEBUG
|
||||
for (uint32_t i = 0; i < count; ++i)
|
||||
checkStoredValue(src[i]);
|
||||
#endif
|
||||
memcpy(&elements_[dstStart], src, count * sizeof(HeapSlot));
|
||||
elementsRangeWriteBarrierPost(dstStart, count);
|
||||
|
||||
memcpy(elements_, src, count * sizeof(HeapSlot));
|
||||
elementsRangeWriteBarrierPost(0, count);
|
||||
}
|
||||
|
||||
inline bool
|
||||
|
@ -382,6 +396,38 @@ NativeObject::ensureDenseElements(JSContext* cx, uint32_t index, uint32_t extra)
|
|||
return DenseElementResult::Success;
|
||||
}
|
||||
|
||||
inline DenseElementResult
|
||||
NativeObject::setOrExtendDenseElements(JSContext* cx, uint32_t start, const Value* vp,
|
||||
uint32_t count,
|
||||
ShouldUpdateTypes updateTypes)
|
||||
{
|
||||
if (denseElementsAreFrozen())
|
||||
return DenseElementResult::Incomplete;
|
||||
|
||||
if (is<ArrayObject>() &&
|
||||
!as<ArrayObject>().lengthIsWritable() &&
|
||||
start + count >= as<ArrayObject>().length())
|
||||
{
|
||||
return DenseElementResult::Incomplete;
|
||||
}
|
||||
|
||||
DenseElementResult result = ensureDenseElements(cx, start, count);
|
||||
if (result != DenseElementResult::Success)
|
||||
return result;
|
||||
|
||||
if (is<ArrayObject>() && start + count >= as<ArrayObject>().length())
|
||||
as<ArrayObject>().setLengthInt32(start + count);
|
||||
|
||||
if (updateTypes == ShouldUpdateTypes::DontUpdate && !shouldConvertDoubleElements()) {
|
||||
copyDenseElements(start, vp, count);
|
||||
} else {
|
||||
for (size_t i = 0; i < count; i++)
|
||||
setDenseElementWithType(cx, start + i, vp[i]);
|
||||
}
|
||||
|
||||
return DenseElementResult::Success;
|
||||
}
|
||||
|
||||
inline Value
|
||||
NativeObject::getDenseOrTypedArrayElement(uint32_t idx)
|
||||
{
|
||||
|
|
|
@ -406,6 +406,11 @@ enum class DenseElementResult {
|
|||
Incomplete
|
||||
};
|
||||
|
||||
enum class ShouldUpdateTypes {
|
||||
Update,
|
||||
DontUpdate
|
||||
};
|
||||
|
||||
/*
|
||||
* NativeObject specifies the internal implementation of a native object.
|
||||
*
|
||||
|
@ -1224,10 +1229,15 @@ class NativeObject : public ShapedObject
|
|||
inline Value getDenseOrTypedArrayElement(uint32_t idx);
|
||||
|
||||
inline void copyDenseElements(uint32_t dstStart, const Value* src, uint32_t count);
|
||||
inline void initDenseElements(uint32_t dstStart, const Value* src, uint32_t count);
|
||||
inline void initDenseElements(const Value* src, uint32_t count);
|
||||
inline void initDenseElements(NativeObject* src, uint32_t srcStart, uint32_t count);
|
||||
inline void moveDenseElements(uint32_t dstStart, uint32_t srcStart, uint32_t count);
|
||||
inline void moveDenseElementsNoPreBarrier(uint32_t dstStart, uint32_t srcStart, uint32_t count);
|
||||
|
||||
inline DenseElementResult
|
||||
setOrExtendDenseElements(JSContext* cx, uint32_t start, const Value* vp, uint32_t count,
|
||||
ShouldUpdateTypes updateTypes = ShouldUpdateTypes::Update);
|
||||
|
||||
bool shouldConvertDoubleElements() {
|
||||
return getElementsHeader()->shouldConvertDoubleElements();
|
||||
}
|
||||
|
|
|
@ -168,78 +168,6 @@ UnboxedPlainObject::layout() const
|
|||
return group()->unboxedLayout();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Template methods for NativeObject and UnboxedArrayObject accesses.
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
static inline DenseElementResult
|
||||
SetOrExtendBoxedOrUnboxedDenseElements(JSContext* cx, JSObject* obj,
|
||||
uint32_t start, const Value* vp, uint32_t count,
|
||||
ShouldUpdateTypes updateTypes = ShouldUpdateTypes::Update)
|
||||
{
|
||||
NativeObject* nobj = &obj->as<NativeObject>();
|
||||
|
||||
if (nobj->denseElementsAreFrozen())
|
||||
return DenseElementResult::Incomplete;
|
||||
|
||||
if (obj->is<ArrayObject>() &&
|
||||
!obj->as<ArrayObject>().lengthIsWritable() &&
|
||||
start + count >= obj->as<ArrayObject>().length())
|
||||
{
|
||||
return DenseElementResult::Incomplete;
|
||||
}
|
||||
|
||||
DenseElementResult result = nobj->ensureDenseElements(cx, start, count);
|
||||
if (result != DenseElementResult::Success)
|
||||
return result;
|
||||
|
||||
if (obj->is<ArrayObject>() && start + count >= obj->as<ArrayObject>().length())
|
||||
obj->as<ArrayObject>().setLengthInt32(start + count);
|
||||
|
||||
if (updateTypes == ShouldUpdateTypes::DontUpdate && !nobj->shouldConvertDoubleElements()) {
|
||||
nobj->copyDenseElements(start, vp, count);
|
||||
} else {
|
||||
for (size_t i = 0; i < count; i++)
|
||||
nobj->setDenseElementWithType(cx, start + i, vp[i]);
|
||||
}
|
||||
|
||||
return DenseElementResult::Success;
|
||||
}
|
||||
|
||||
static inline DenseElementResult
|
||||
MoveBoxedOrUnboxedDenseElements(JSContext* cx, JSObject* obj, uint32_t dstStart, uint32_t srcStart,
|
||||
uint32_t length)
|
||||
{
|
||||
MOZ_ASSERT(obj->isNative());
|
||||
|
||||
if (obj->as<NativeObject>().denseElementsAreFrozen())
|
||||
return DenseElementResult::Incomplete;
|
||||
|
||||
if (!obj->as<NativeObject>().maybeCopyElementsForWrite(cx))
|
||||
return DenseElementResult::Failure;
|
||||
obj->as<NativeObject>().moveDenseElements(dstStart, srcStart, length);
|
||||
|
||||
return DenseElementResult::Success;
|
||||
}
|
||||
|
||||
static inline DenseElementResult
|
||||
CopyBoxedOrUnboxedDenseElements(JSContext* cx, JSObject* dst, JSObject* src,
|
||||
uint32_t dstStart, uint32_t srcStart, uint32_t length)
|
||||
{
|
||||
MOZ_ASSERT(src->isNative());
|
||||
MOZ_ASSERT(dst->isNative());
|
||||
MOZ_ASSERT(dst->as<NativeObject>().getDenseInitializedLength() == dstStart);
|
||||
MOZ_ASSERT(src->as<NativeObject>().getDenseInitializedLength() >= srcStart + length);
|
||||
MOZ_ASSERT(dst->as<NativeObject>().getDenseCapacity() >= dstStart + length);
|
||||
|
||||
dst->as<NativeObject>().setDenseInitializedLength(dstStart + length);
|
||||
|
||||
const Value* vp = src->as<NativeObject>().getDenseElements() + srcStart;
|
||||
dst->as<NativeObject>().initDenseElements(dstStart, vp, length);
|
||||
|
||||
return DenseElementResult::Success;
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
|
||||
#endif // vm_UnboxedObject_inl_h
|
||||
|
|
|
@ -30,6 +30,13 @@ using namespace js::wasm;
|
|||
|
||||
using mozilla::IsPowerOfTwo;
|
||||
|
||||
// A sanity check. We have only tested WASM_HUGE_MEMORY on x64, and only tested
|
||||
// x64 with WASM_HUGE_MEMORY.
|
||||
|
||||
#if defined(WASM_HUGE_MEMORY) != defined(JS_CODEGEN_X64)
|
||||
# error "Not an expected configuration"
|
||||
#endif
|
||||
|
||||
void
|
||||
Val::writePayload(uint8_t* dst) const
|
||||
{
|
||||
|
|
|
@ -1650,12 +1650,7 @@ static const unsigned PageSize = 64 * 1024;
|
|||
|
||||
static const unsigned MaxMemoryAccessSize = sizeof(Val);
|
||||
|
||||
#ifdef JS_CODEGEN_X64
|
||||
|
||||
// All other code should use WASM_HUGE_MEMORY instead of JS_CODEGEN_X64 so that
|
||||
// it is easy to use the huge-mapping optimization for other 64-bit platforms in
|
||||
// the future.
|
||||
# define WASM_HUGE_MEMORY
|
||||
#ifdef WASM_HUGE_MEMORY
|
||||
|
||||
// On WASM_HUGE_MEMORY platforms, every asm.js or WebAssembly memory
|
||||
// unconditionally allocates a huge region of virtual memory of size
|
||||
|
|
|
@ -78,6 +78,12 @@ ExpectedOwnerForChild(const nsIFrame& aFrame)
|
|||
return parent;
|
||||
}
|
||||
|
||||
if (aFrame.IsLetterFrame()) {
|
||||
// Ditto for ::first-letter. A first-letter always arrives here via its
|
||||
// direct parent, except when it's parented to a ::first-line.
|
||||
return parent->IsLineFrame() ? parent->GetParent() : parent;
|
||||
}
|
||||
|
||||
parent = FirstContinuationOrPartOfIBSplit(parent);
|
||||
|
||||
// We've handled already anon boxes and bullet frames, so now we're looking at
|
||||
|
@ -567,6 +573,8 @@ UpdateBackdropIfNeeded(nsIFrame* aFrame,
|
|||
static void
|
||||
UpdateFirstLetterIfNeeded(nsIFrame* aFrame, ServoRestyleState& aRestyleState)
|
||||
{
|
||||
MOZ_ASSERT(!aFrame->IsFrameOfType(nsIFrame::eBlockFrame),
|
||||
"You're probably duplicating work with UpdatePseudoElementStyles!");
|
||||
if (!aFrame->HasFirstLetterChild()) {
|
||||
return;
|
||||
}
|
||||
|
@ -574,10 +582,11 @@ UpdateFirstLetterIfNeeded(nsIFrame* aFrame, ServoRestyleState& aRestyleState)
|
|||
// We need to find the block the first-letter is associated with so we can
|
||||
// find the right element for the first-letter's style resolution. Might as
|
||||
// well just delegate the whole thing to that block.
|
||||
nsIFrame* block = aFrame;
|
||||
nsIFrame* block = aFrame->GetParent();
|
||||
while (!block->IsFrameOfType(nsIFrame::eBlockFrame)) {
|
||||
block = block->GetParent();
|
||||
}
|
||||
|
||||
static_cast<nsBlockFrame*>(block->FirstContinuation())->
|
||||
UpdateFirstLetterStyle(aRestyleState);
|
||||
}
|
||||
|
@ -638,12 +647,10 @@ static void
|
|||
UpdateFramePseudoElementStyles(nsIFrame* aFrame,
|
||||
ServoRestyleState& aRestyleState)
|
||||
{
|
||||
// first-letter needs to be updated before first-line, because first-line can
|
||||
// change the style of the first-letter.
|
||||
UpdateFirstLetterIfNeeded(aFrame, aRestyleState);
|
||||
|
||||
if (aFrame->IsFrameOfType(nsIFrame::eBlockFrame)) {
|
||||
static_cast<nsBlockFrame*>(aFrame)->UpdatePseudoElementStyles(aRestyleState);
|
||||
} else {
|
||||
UpdateFirstLetterIfNeeded(aFrame, aRestyleState);
|
||||
}
|
||||
|
||||
UpdateBackdropIfNeeded(
|
||||
|
|
|
@ -7581,6 +7581,12 @@ nsBlockFrame::ResolveBidi()
|
|||
void
|
||||
nsBlockFrame::UpdatePseudoElementStyles(ServoRestyleState& aRestyleState)
|
||||
{
|
||||
// first-letter needs to be updated before first-line, because first-line can
|
||||
// change the style of the first-letter.
|
||||
if (HasFirstLetterChild()) {
|
||||
UpdateFirstLetterStyle(aRestyleState);
|
||||
}
|
||||
|
||||
if (nsBulletFrame* bullet = GetBullet()) {
|
||||
CSSPseudoElementType type = bullet->StyleContext()->GetPseudoType();
|
||||
RefPtr<nsStyleContext> newBulletStyle =
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
text::first-letter {
|
||||
font-size: 3em;
|
||||
}
|
||||
text {
|
||||
font-size: 15px;
|
||||
}
|
||||
</style>
|
||||
<svg width="500px" height="50px">
|
||||
<text x="0" y="40">The first-letter size should be 45px</text>
|
||||
</svg>
|
|
@ -0,0 +1,16 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
text::first-letter {
|
||||
font-size: 3em;
|
||||
}
|
||||
text {
|
||||
font-size: 10px;
|
||||
}
|
||||
</style>
|
||||
<svg width="500px" height="50px">
|
||||
<text x="0" y="40">The first-letter size should be 45px</text>
|
||||
</svg>
|
||||
<script>
|
||||
document.body.offsetTop;
|
||||
document.querySelector('text').style.fontSize = "15px";
|
||||
</script>
|
|
@ -0,0 +1,13 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
td::first-letter {
|
||||
border: inherit;
|
||||
}
|
||||
</style>
|
||||
<table>
|
||||
<tr>
|
||||
<td style="border: 10px solid green">
|
||||
This text should have a green border on the first letter.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
|
@ -0,0 +1,18 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
td::first-letter {
|
||||
border: inherit;
|
||||
}
|
||||
</style>
|
||||
<table>
|
||||
<tr>
|
||||
<td style="border: 10px solid red">
|
||||
This text should have a green border on the first letter.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<script>
|
||||
document.body.offsetTop;
|
||||
document.querySelector('td').style.borderColor = "green";
|
||||
document.body.offsetTop;
|
||||
</script>
|
|
@ -0,0 +1,9 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
fieldset::first-letter {
|
||||
border: inherit;
|
||||
}
|
||||
</style>
|
||||
<fieldset style="border: 10px solid green;">
|
||||
This text should have a green border on the first letter.
|
||||
</fieldset>
|
|
@ -0,0 +1,14 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
fieldset::first-letter {
|
||||
border: inherit;
|
||||
}
|
||||
</style>
|
||||
<fieldset style="border: 10px solid red;">
|
||||
This text should have a green border on the first letter.
|
||||
</fieldset>
|
||||
<script>
|
||||
document.body.offsetTop;
|
||||
document.querySelector('fieldset').style.borderColor = "green";
|
||||
document.body.offsetTop;
|
||||
</script>
|
|
@ -0,0 +1,11 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
div::first-letter {
|
||||
color: green;
|
||||
}
|
||||
|
||||
div::first-line {
|
||||
color: blue;
|
||||
}
|
||||
</style>
|
||||
<div style="font-size: 20px">My first letter should be green, and the whole line 20px in size</div>
|
|
@ -0,0 +1,16 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
div::first-letter {
|
||||
color: green;
|
||||
}
|
||||
|
||||
div::first-line {
|
||||
color: blue;
|
||||
}
|
||||
</style>
|
||||
<div>My first letter should be green, and the whole line 20px in size</div>
|
||||
<script>
|
||||
document.body.offsetTop;
|
||||
document.querySelector('div').style.fontSize = "20px";
|
||||
document.body.offsetTop;
|
||||
</script>
|
|
@ -75,3 +75,7 @@ HTTP(..) == indic-clusters-1.html indic-clusters-1-ref.html
|
|||
== overflow-inline-overflow.html overflow-inline-overflow-ref.html
|
||||
|
||||
== 1385656.html 1385656-ref.html
|
||||
== 1404167-1.html 1404167-1-ref.html
|
||||
== 1404167-2.html 1404167-2-ref.html
|
||||
== 1404167-3.html 1404167-3-ref.html
|
||||
== 1404167-4.html 1404167-4-ref.html
|
||||
|
|
|
@ -6,6 +6,7 @@ from contextlib import closing
|
|||
import sys
|
||||
import logging
|
||||
import os
|
||||
import psutil
|
||||
import signal
|
||||
import time
|
||||
import tempfile
|
||||
|
@ -14,7 +15,6 @@ import urllib2
|
|||
|
||||
import mozdevice
|
||||
import mozinfo
|
||||
import mozprocess
|
||||
from automation import Automation
|
||||
from remoteautomation import RemoteAutomation, fennecLogcatFilters
|
||||
|
||||
|
@ -240,34 +240,25 @@ class RemoteReftest(RefTest):
|
|||
def stopWebServer(self, options):
|
||||
self.server.stop()
|
||||
|
||||
def killNamedProc(self, pname):
|
||||
def killNamedProc(self, pname, orphans=True):
|
||||
""" Kill processes matching the given command name """
|
||||
self.log.info("Checking for %s processes..." % pname)
|
||||
|
||||
def _psInfo(line):
|
||||
if pname in line:
|
||||
self.log.info(line)
|
||||
process = mozprocess.ProcessHandler(['ps', '-f'],
|
||||
processOutputLine=_psInfo)
|
||||
process.run()
|
||||
process.wait()
|
||||
|
||||
def _psKill(line):
|
||||
parts = line.split()
|
||||
if len(parts) == 3 and parts[0].isdigit():
|
||||
pid = int(parts[0])
|
||||
if parts[2] == pname:
|
||||
self.log.info("killing %s with pid %d" % (pname, pid))
|
||||
for proc in psutil.process_iter():
|
||||
try:
|
||||
os.kill(
|
||||
pid, getattr(signal, "SIGKILL", signal.SIGTERM))
|
||||
if proc.name() == pname:
|
||||
procd = proc.as_dict(attrs=['pid', 'ppid', 'name', 'username'])
|
||||
if proc.ppid() == 1 or not orphans:
|
||||
self.log.info("killing %s" % procd)
|
||||
try:
|
||||
os.kill(proc.pid, getattr(signal, "SIGKILL", signal.SIGTERM))
|
||||
except Exception as e:
|
||||
self.log.info("Failed to kill process %d: %s" %
|
||||
(pid, str(e)))
|
||||
process = mozprocess.ProcessHandler(['ps', '-o', 'pid,ppid,comm'],
|
||||
processOutputLine=_psKill)
|
||||
process.run()
|
||||
process.wait()
|
||||
self.log.info("Failed to kill process %d: %s" % (proc.pid, str(e)))
|
||||
else:
|
||||
self.log.info("NOT killing %s (not an orphan?)" % procd)
|
||||
except:
|
||||
# may not be able to access process info for all processes
|
||||
continue
|
||||
|
||||
def createReftestProfile(self, options, manifest, startAfter=None):
|
||||
profile = RefTest.createReftestProfile(self,
|
||||
|
|
|
@ -274,6 +274,8 @@ void PlatformUIThread::Stop() {
|
|||
|
||||
PostMessage(hwnd_, WM_CLOSE, 0, 0);
|
||||
|
||||
hwnd_ = NULL;
|
||||
|
||||
PlatformThread::Stop();
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -563,7 +563,7 @@ private:
|
|||
rbp_r_p->SetRight(rbp_r_t);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
}
|
||||
/* This is the node we want to delete, but we
|
||||
* will instead swap it with its successor
|
||||
* and delete the successor. Record enough
|
||||
|
@ -571,7 +571,6 @@ private:
|
|||
* rbp_r_xp is aNode's parent. */
|
||||
rbp_r_xp = rbp_r_p;
|
||||
}
|
||||
}
|
||||
rbp_r_t = rbp_r_c->Right();
|
||||
rbp_r_u = rbp_r_t->Left();
|
||||
if (rbp_r_u->IsBlack()) {
|
||||
|
|
|
@ -5906,5 +5906,9 @@ pref("toolkit.crashreporter.include_context_heap", true);
|
|||
// Open noopener links in a new process
|
||||
pref("dom.noopener.newprocess.enabled", true);
|
||||
|
||||
#ifdef XP_WIN
|
||||
pref("layers.omtp.enabled", true);
|
||||
#else
|
||||
pref("layers.omtp.enabled", false);
|
||||
#endif
|
||||
pref("layers.omtp.force-sync", false);
|
||||
|
|
|
@ -1140,4 +1140,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
|||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1515000916175000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1515173442818000);
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include "SharedSSLState.h"
|
||||
#include "cert.h"
|
||||
#include "certdb.h"
|
||||
#include "mozStorageCID.h"
|
||||
#include "mozilla/ArrayUtils.h"
|
||||
#include "mozilla/Assertions.h"
|
||||
#include "mozilla/Casting.h"
|
||||
|
@ -2263,14 +2262,6 @@ nsNSSComponent::Init()
|
|||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
// To avoid a sqlite3_config race in NSS init, as a workaround for
|
||||
// bug 730495, we require the storage service to get initialized first.
|
||||
nsCOMPtr<nsISupports> storageService =
|
||||
do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID);
|
||||
if (!storageService) {
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("Beginning NSS initialization\n"));
|
||||
|
||||
nsresult rv = InitializePIPNSSBundle();
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -8,7 +8,7 @@
|
|||
/*****************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
|
||||
const PRTime gPreloadListExpirationTime = INT64_C(1517592632694000);
|
||||
%%
|
||||
0-1.party, 1
|
||||
0.me.uk, 1
|
||||
|
@ -34,7 +34,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
|
|||
040fitvitality.nl, 1
|
||||
046569.com, 1
|
||||
04sun.com, 1
|
||||
050508.com, 1
|
||||
050media.nl, 1
|
||||
0513c.com, 1
|
||||
0573wk.com, 1
|
||||
|
@ -44,7 +43,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
|
|||
0c3.de, 1
|
||||
0cdn.ga, 1
|
||||
0day.agency, 1
|
||||
0day.su, 1
|
||||
0fl.com, 1
|
||||
0i0.nl, 1
|
||||
0ik.de, 1
|
||||
|
@ -116,7 +114,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
|
|||
132kv.ch, 1
|
||||
13318522.com, 1
|
||||
1359826938.rsc.cdn77.org, 1
|
||||
1391kj.com, 1
|
||||
1395kj.com, 1
|
||||
1396.cc, 1
|
||||
1453914078.rsc.cdn77.org, 1
|
||||
|
@ -186,7 +183,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
|
|||
247a.co.uk, 1
|
||||
247healthshop.com, 1
|
||||
247medplan.com, 1
|
||||
247quickbooks.com, 1
|
||||
2488.ch, 1
|
||||
24hrs.shopping, 1
|
||||
24ip.com, 1
|
||||
|
@ -230,7 +226,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
|
|||
2ulcceria.nl, 1
|
||||
300mbmovie24.com, 1
|
||||
3133780x.com, 1
|
||||
314166.com, 1
|
||||
314chan.org, 1
|
||||
31klabs.com, 1
|
||||
31tv.ru, 1
|
||||
|
@ -329,8 +324,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1517420106404000);
|
|||
500p.xyz, 1
|
||||
50plusnet.nl, 1
|
||||
513vpn.net, 1
|
||||
517vpn.cn, 1
|
||||
518maicai.com, 0
|
||||
518maicai.com, 1
|
||||
525.info, 1
|
||||
52neptune.com, 1
|
||||
5432.cc, 1
|
||||
|
@ -593,7 +587,7 @@ aciksite.com, 1
|
|||
acksoft.fr, 1
|
||||
acksoftdemo.fr, 1
|
||||
aclu.org, 0
|
||||
acluva.org, 1
|
||||
acluva.org, 0
|
||||
acme.beer, 1
|
||||
acmexyz123.info, 1
|
||||
acnpacific.com, 1
|
||||
|
@ -609,7 +603,6 @@ acsc.gov.au, 1
|
|||
acsemb.org, 1
|
||||
acsihostingsolutions.com, 1
|
||||
acsports.ca, 1
|
||||
actgruppe.de, 1
|
||||
actilove.ch, 1
|
||||
actionmadagascar.ch, 1
|
||||
actionsack.com, 1
|
||||
|
@ -856,6 +849,7 @@ agrekov.ru, 1
|
|||
agreor.com, 1
|
||||
agrias.com.br, 1
|
||||
agridir.site, 1
|
||||
agroglass.com.br, 1
|
||||
agroline.by, 1
|
||||
agroyard.com.ua, 1
|
||||
agsb.ch, 1
|
||||
|
@ -1384,7 +1378,6 @@ angelinahair.com, 1
|
|||
angeloventuri.com, 1
|
||||
anginf.de, 1
|
||||
anglertanke.de, 1
|
||||
anglesya.win, 1
|
||||
anglictina-sojcak.cz, 1
|
||||
anglictinasojcak.cz, 1
|
||||
angrapa.ru, 1
|
||||
|
@ -1396,12 +1389,14 @@ angusmak.com, 1
|
|||
animacurse.moe, 1
|
||||
animaemundi.be, 1
|
||||
animal-liberation.com, 1
|
||||
animal-nature-human.com, 1
|
||||
animal-rights.com, 1
|
||||
animalnet.de, 0
|
||||
animalstropic.com, 1
|
||||
animationsmusicales.ch, 1
|
||||
anime.my, 0
|
||||
anime1.me, 1
|
||||
anime1.moe, 1
|
||||
anime1.top, 1
|
||||
animeai.com, 1
|
||||
animefluxxx.com, 1
|
||||
|
@ -1745,6 +1740,7 @@ armstrongsengineering.com, 1
|
|||
army24.cz, 1
|
||||
armyofbane.com, 1
|
||||
armyprodej.cz, 1
|
||||
arnaudb.net, 1
|
||||
arnaudfeld.de, 1
|
||||
arnaudminable.net, 1
|
||||
arne-petersen.net, 1
|
||||
|
@ -1899,6 +1895,7 @@ astec-informatica.com, 1
|
|||
astengox.com, 1
|
||||
astenretail.com, 1
|
||||
asthon.cn, 1
|
||||
astraalivankila.net, 1
|
||||
astral.gq, 1
|
||||
astrea-voetbal-groningen.nl, 1
|
||||
astronomie-fulda.de, 1
|
||||
|
@ -2486,6 +2483,7 @@ bearcosports.com.br, 1
|
|||
bearded.sexy, 1
|
||||
bearden.io, 1
|
||||
bearingworks.com, 1
|
||||
beasel.biz, 1
|
||||
beastowner.li, 1
|
||||
beatnikbreaks.com, 1
|
||||
beaute-eternelle.ch, 1
|
||||
|
@ -2633,7 +2631,6 @@ bentley.link, 1
|
|||
bentrask.com, 1
|
||||
benzou-space.com, 1
|
||||
beoordelingen.be, 1
|
||||
bep362.vn, 1
|
||||
beranovi.com, 1
|
||||
berasavocate.com, 1
|
||||
beraten-entwickeln-steuern.de, 1
|
||||
|
@ -2641,7 +2638,6 @@ berdu.id, 1
|
|||
berduri.com, 1
|
||||
bergenhave.nl, 1
|
||||
bergevoet-fa.nl, 1
|
||||
bergland-seefeld.at, 1
|
||||
bergstoneware.com, 1
|
||||
berlin-flirt.de, 1
|
||||
berlin-kohlefrei.de, 1
|
||||
|
@ -2752,7 +2748,6 @@ beyours.be, 1
|
|||
bezoomnyville.com, 1
|
||||
bezpecnostsiti.cf, 1
|
||||
bfam.tv, 1
|
||||
bfd.vodka, 1
|
||||
bfi.wien, 0
|
||||
bfrailwayclub.cf, 1
|
||||
bftbradio.com, 1
|
||||
|
@ -2862,7 +2857,6 @@ binaryabstraction.com, 1
|
|||
binaryapparatus.com, 1
|
||||
binaryappdev.com, 1
|
||||
binaryevolved.com, 1
|
||||
binaryfigments.com, 1
|
||||
binarystud.io, 1
|
||||
binding-problem.com, 1
|
||||
binfind.com, 1
|
||||
|
@ -3184,6 +3178,7 @@ bm-i.ch, 1
|
|||
bm-immo.ch, 1
|
||||
bmet.de, 1
|
||||
bmoattachments.org, 1
|
||||
bmone.net, 1
|
||||
bmros.com.ar, 1
|
||||
bn1digital.co.uk, 1
|
||||
bnb-buddy.nl, 1
|
||||
|
@ -3194,6 +3189,7 @@ boatme.de, 1
|
|||
bobancoamigo.com, 1
|
||||
bobazar.com, 1
|
||||
bobcopeland.com, 1
|
||||
bobep.ru, 1
|
||||
bobiji.com, 0
|
||||
bobisec.cz, 1
|
||||
bobkoetsier.nl, 1
|
||||
|
@ -3469,6 +3465,7 @@ brentacampbell.com, 1
|
|||
bress.cloud, 1
|
||||
bressier.fr, 1
|
||||
bretcarmichael.com, 1
|
||||
brettabel.com, 1
|
||||
brettcornwall.com, 1
|
||||
brettelliff.com, 1
|
||||
bretzner.fr, 1
|
||||
|
@ -3672,7 +3669,7 @@ burke.services, 1
|
|||
burlapsac.ca, 1
|
||||
burlesquemakeup.com, 1
|
||||
burnerfitness.com, 1
|
||||
burningflipside.com, 1
|
||||
burningflipside.com, 0
|
||||
burntfish.com, 1
|
||||
burnworks.com, 1
|
||||
buronwater.com, 1
|
||||
|
@ -4091,6 +4088,7 @@ catmoose.ca, 1
|
|||
catnet.dk, 0
|
||||
catnmeow.com, 1
|
||||
catsmagic.pp.ua, 1
|
||||
cattivo.nl, 0
|
||||
caughtredhanded.co.nz, 1
|
||||
caulfieldeastapartments.com.au, 1
|
||||
caulfieldracecourseapartments.com.au, 1
|
||||
|
@ -4590,6 +4588,7 @@ cimballa.com, 1
|
|||
cimfax.com, 1
|
||||
cinafilm.com, 1
|
||||
cine-music.de, 1
|
||||
cinefilia.tk, 1
|
||||
cinefilzonen.se, 1
|
||||
cinema5.ru, 1
|
||||
cinemaclub.co, 1
|
||||
|
@ -4637,6 +4636,7 @@ cittadesign.com, 0
|
|||
citya.com, 1
|
||||
citybusexpress.com, 1
|
||||
citylights.eu, 1
|
||||
citymoobel.ee, 1
|
||||
cityoftitans.com, 1
|
||||
cityoftitansmmo.com, 1
|
||||
citysportapp.com, 1
|
||||
|
@ -4831,7 +4831,6 @@ cnwage.com, 1
|
|||
co-factor.ro, 1
|
||||
co-yutaka.com, 1
|
||||
co.search.yahoo.com, 0
|
||||
coach-sportif.paris, 1
|
||||
coachezmoi.ch, 1
|
||||
coaching-impulse.ch, 1
|
||||
coachingconsultancy.com, 1
|
||||
|
@ -4844,6 +4843,7 @@ cobalt.io, 1
|
|||
cobaltgp.com, 1
|
||||
cobaltlp.com, 1
|
||||
cocaine-import.agency, 1
|
||||
cocaine.ninja, 1
|
||||
cocalc.com, 1
|
||||
coccinellaskitchen.com, 1
|
||||
coccinellaskitchen.de, 1
|
||||
|
@ -4973,7 +4973,6 @@ collaboracloudsuite.com, 1
|
|||
collaboraoffice.co.uk, 1
|
||||
collaboraoffice.com, 1
|
||||
collabornation.net, 1
|
||||
collabra.email, 1
|
||||
collaction.hk, 1
|
||||
collada.org, 1
|
||||
collbox.co, 1
|
||||
|
@ -5399,7 +5398,6 @@ creditkarma.com, 1
|
|||
creditos-rapidos.com, 1
|
||||
creditproautos.com, 0
|
||||
creditstar.es, 1
|
||||
creditstar.lt, 1
|
||||
creeks-coworking.com, 1
|
||||
creep.im, 1
|
||||
creepycraft.nl, 1
|
||||
|
@ -5892,7 +5890,6 @@ dashboard.run, 1
|
|||
dashboard.yt, 1
|
||||
dashnearby.com, 1
|
||||
data.gov, 1
|
||||
data.qld.gov.au, 0
|
||||
data.world, 1
|
||||
databeam.de, 1
|
||||
databionix.com, 1
|
||||
|
@ -5906,6 +5903,7 @@ datacentrenews.eu, 1
|
|||
datacubed.com, 1
|
||||
datadit.hu, 1
|
||||
datadyne.technology, 1
|
||||
dataformers.at, 1
|
||||
datahove.no, 0
|
||||
dataisme.com, 1
|
||||
datajapan.co.jp, 1
|
||||
|
@ -6105,6 +6103,7 @@ dee.su, 1
|
|||
deep.club, 1
|
||||
deeparamaraj.com, 1
|
||||
deepbluecrafting.co.uk, 1
|
||||
deepcreampie.com, 1
|
||||
deeprecce.com, 1
|
||||
deepserve.info, 1
|
||||
deepsouthsounds.com, 1
|
||||
|
@ -6154,7 +6153,6 @@ dejure.org, 1
|
|||
dejw.cz, 1
|
||||
delahrzolder.nl, 1
|
||||
delbecqvo.be, 1
|
||||
delbrouck.ch, 1
|
||||
deleidscheflesch.nl, 1
|
||||
delfic.org, 1
|
||||
delhionlinegifts.com, 1
|
||||
|
@ -6513,6 +6511,7 @@ dimonb.com, 1
|
|||
din-tools.com, 1
|
||||
dineachook.com.au, 1
|
||||
dinepont.fr, 1
|
||||
dingcc.com, 1
|
||||
dingcc.org, 1
|
||||
dingcc.xyz, 1
|
||||
dinge.xyz, 1
|
||||
|
@ -6559,7 +6558,7 @@ discofitta.com, 1
|
|||
disconformity.net, 1
|
||||
discord-chan.net, 1
|
||||
discordapp.com, 1
|
||||
discotek.club, 0
|
||||
discotek.club, 1
|
||||
discountmetaux.fr, 1
|
||||
discover-mercure.com, 1
|
||||
discoverhealthage.com, 0
|
||||
|
@ -6714,7 +6713,6 @@ dogfi.sh, 1
|
|||
dogft.com, 1
|
||||
doggroomingcourse.com, 1
|
||||
dogmap.jp, 1
|
||||
dognlife.com, 1
|
||||
dogoo.com, 1
|
||||
dogworld.com.br, 1
|
||||
dohanews.co, 1
|
||||
|
@ -6724,6 +6722,7 @@ doku-gilde.de, 1
|
|||
dokuboard.com, 1
|
||||
dokuraum.de, 1
|
||||
dolarcanadense.com.br, 1
|
||||
dolcevitatech.education, 1
|
||||
doleta.gov, 1
|
||||
doli.se, 1
|
||||
dolice.net, 1
|
||||
|
@ -6795,6 +6794,7 @@ donthedragonwilson.com, 1
|
|||
dontpayfull.com, 1
|
||||
donttrust.me, 1
|
||||
donutcompany.co.jp, 1
|
||||
dooby.fr, 1
|
||||
doodlefinder.de, 1
|
||||
dooleylabs.com, 1
|
||||
dooleytackaberry.com, 1
|
||||
|
@ -7074,6 +7074,7 @@ dustri.org, 1
|
|||
dustygroove.com, 1
|
||||
dustyspokesbnb.ca, 1
|
||||
dutch1.nl, 1
|
||||
dutchessuganda.com, 1
|
||||
dutchrank.nl, 1
|
||||
dutchwanderers.nl, 1
|
||||
dutchweballiance.nl, 1
|
||||
|
@ -8454,7 +8455,6 @@ feel.aero, 1
|
|||
feelgood-workouts.de, 1
|
||||
feen.us, 1
|
||||
fefelovalex.ru, 1
|
||||
fegans.org.uk, 1
|
||||
fehngarten.de, 1
|
||||
fehnladen.de, 1
|
||||
feigling.net, 1
|
||||
|
@ -8592,6 +8592,7 @@ film-tutorial.com, 1
|
|||
film.photography, 1
|
||||
film.photos, 1
|
||||
filmatiporno.xxx, 1
|
||||
filme-online.eu.com, 1
|
||||
filme-onlines.com, 1
|
||||
filmreviewonline.com, 1
|
||||
filmserver.de, 1
|
||||
|
@ -8625,7 +8626,6 @@ finsprings.org, 1
|
|||
finstererlebnis.de, 1
|
||||
finsterlebnis.de, 1
|
||||
fintandunleavy.com, 1
|
||||
fintechnics.com, 1
|
||||
finvantage.com, 1
|
||||
fionamcbride.com, 1
|
||||
fire-wolf.com, 1
|
||||
|
@ -9178,7 +9178,7 @@ frogatto.com, 1
|
|||
frogeye.fr, 1
|
||||
froggitt.com, 1
|
||||
frogsonamission.de, 1
|
||||
froh.co.jp, 0
|
||||
froh.co.jp, 1
|
||||
frokenblomma.se, 1
|
||||
frolov.net, 1
|
||||
frolova.org, 1
|
||||
|
@ -9305,6 +9305,7 @@ futuresonline.com, 1
|
|||
futurezone.at, 1
|
||||
futuristarchitecture.com, 1
|
||||
futurope.com, 1
|
||||
fuwafuwa.moe, 1
|
||||
fuyu.moe, 1
|
||||
fuzoku-sodan.com, 1
|
||||
fuzzing-project.org, 1
|
||||
|
@ -9474,6 +9475,7 @@ gaytorrent.ru, 1
|
|||
gayxsite.com, 1
|
||||
gazee.net, 1
|
||||
gazellegames.net, 1
|
||||
gbc-radio.nl, 1
|
||||
gbcsummercamps.com, 1
|
||||
gbl.selfip.net, 1
|
||||
gc-mc.de, 1
|
||||
|
@ -9536,6 +9538,7 @@ geekzone.fr, 1
|
|||
geertdegraaf.nl, 1
|
||||
geertswei.nl, 1
|
||||
gegeco.ch, 1
|
||||
geh.li, 1
|
||||
gehaowu.com, 1
|
||||
gehreslaw.com, 1
|
||||
gehrke.nrw, 1
|
||||
|
@ -9842,6 +9845,7 @@ globalnomadvintage.com, 1
|
|||
globalonetechnology.com, 1
|
||||
globalperspectivescanada.com, 1
|
||||
globalprojetores.com.br, 1
|
||||
globaltennis.ca, 1
|
||||
globalventil.com, 1
|
||||
globalvisions-events.ch, 1
|
||||
globalvisions-events.com, 1
|
||||
|
@ -10965,7 +10969,6 @@ holoxplor.space, 1
|
|||
holydragoon.jp, 1
|
||||
holyhiphopdatabase.com, 1
|
||||
holymolycasinos.com, 1
|
||||
holytransaction.com, 1
|
||||
holywhite.com, 1
|
||||
holz.nu, 1
|
||||
holzheizer-forum.de, 1
|
||||
|
@ -11366,7 +11369,7 @@ iclinic.ua, 1
|
|||
icmhd.ch, 1
|
||||
icmp2018.org, 1
|
||||
icodeconnect.com, 1
|
||||
icodesign.me, 0
|
||||
icodesign.me, 1
|
||||
iconomi.net, 1
|
||||
icpc.pp.ua, 1
|
||||
icpc2016.in.th, 1
|
||||
|
@ -11413,7 +11416,6 @@ idexxpublicationportal.com, 1
|
|||
idgard.de, 1
|
||||
idhosts.co.id, 1
|
||||
idid.tk, 1
|
||||
idinby.dk, 1
|
||||
idiopolis.org, 1
|
||||
idiotentruppe.de, 1
|
||||
idmanagement.gov, 1
|
||||
|
@ -11553,6 +11555,7 @@ imaginary.ca, 1
|
|||
imaginarymakings.me, 1
|
||||
imagine-programming.com, 1
|
||||
imagr.io, 1
|
||||
imanageproducts.uk, 1
|
||||
imanhearts.com, 1
|
||||
imanudin.net, 1
|
||||
imawhale.com, 1
|
||||
|
@ -11740,6 +11743,7 @@ initramfs.io, 1
|
|||
initrd.net, 1
|
||||
injust.eu.org, 1
|
||||
ink.horse, 1
|
||||
inkable.com.au, 1
|
||||
inkbunny.net, 0
|
||||
inkhor.se, 1
|
||||
inkontriamoci.com, 1
|
||||
|
@ -12057,6 +12061,7 @@ iskaron.de, 1
|
|||
iskogen.nu, 1
|
||||
islam.si, 1
|
||||
islandhosting.com, 1
|
||||
islandinthenet.com, 1
|
||||
islandpumpandtank.com, 1
|
||||
islandzero.net, 1
|
||||
islazia.fr, 1
|
||||
|
@ -12194,7 +12199,6 @@ ivanpolchenko.com, 1
|
|||
ivaoru.org, 1
|
||||
ivfausland.de, 1
|
||||
ivfmeds.com, 1
|
||||
ivi-co.com, 1
|
||||
ivi-fertilite.fr, 1
|
||||
ivi-fruchtbarkeit.de, 1
|
||||
ivi.com.ar, 1
|
||||
|
@ -12286,6 +12290,7 @@ jahner.xyz, 1
|
|||
jahofmann.de, 1
|
||||
jailbreakingisnotacrime.org, 1
|
||||
jaimechanaga.com, 1
|
||||
jaion.ml, 1
|
||||
jaispirit.com, 1
|
||||
jaitnetworking.com, 0
|
||||
jakarta.dating, 1
|
||||
|
@ -12400,7 +12405,6 @@ jayfreestone.com, 1
|
|||
jayharris.ca, 1
|
||||
jaymecd.rocks, 1
|
||||
jayna.design, 1
|
||||
jayxon.com, 1
|
||||
jayxu.com, 1
|
||||
jazz-alliance.com, 1
|
||||
jazz-alliance.org, 1
|
||||
|
@ -12570,7 +12574,6 @@ jlhmedia.com, 1
|
|||
jlkhosting.com, 1
|
||||
jlr-luxembourg.com, 1
|
||||
jm-bea.net, 1
|
||||
jm06.com, 1
|
||||
jmarciniak.it, 1
|
||||
jmb.lc, 1
|
||||
jmbelloteau.com, 1
|
||||
|
@ -12591,6 +12594,7 @@ jnjdj.com, 1
|
|||
jnm-art.com, 1
|
||||
joa-ebert.com, 1
|
||||
joaosampaio.com.br, 1
|
||||
job-offer.de, 1
|
||||
jobbkk.com, 1
|
||||
joblife.co.za, 1
|
||||
jobmedic.com, 1
|
||||
|
@ -12902,6 +12906,7 @@ kabat-fans.cz, 1
|
|||
kabeuchi.com, 1
|
||||
kaboom.pw, 1
|
||||
kabu-abc.com, 1
|
||||
kabus.org, 1
|
||||
kachlikova2.cz, 1
|
||||
kack.website, 1
|
||||
kadmec.com, 1
|
||||
|
@ -13310,7 +13315,6 @@ kinozal-tv.appspot.com, 1
|
|||
kinsights.com, 0
|
||||
kinsmenhomelottery.com, 1
|
||||
kintawifi.com, 0
|
||||
kintoandar.com, 1
|
||||
kintone.com, 1
|
||||
kintore.tv, 1
|
||||
kintzingerfilm.de, 1
|
||||
|
@ -13364,7 +13368,6 @@ kiwipayments.com, 1
|
|||
kiwiplace.com, 1
|
||||
kj1391.com, 1
|
||||
kj1396.net, 1
|
||||
kj1397.com, 1
|
||||
kjaer.io, 1
|
||||
kjarni.cc, 1
|
||||
kjarrval.is, 1
|
||||
|
@ -13852,7 +13855,6 @@ lampenwelt.ch, 1
|
|||
lan2k.org, 1
|
||||
lanbroa.eu, 1
|
||||
lanbyte.se, 1
|
||||
lancehoteis.com, 1
|
||||
lancejames.com, 1
|
||||
lancelafontaine.com, 1
|
||||
lanceyip.com, 1
|
||||
|
@ -13880,6 +13882,7 @@ lantian.pub, 1
|
|||
lanuovariviera.it, 1
|
||||
lanyang.tk, 1
|
||||
lanzamientovirtual.es, 1
|
||||
lanzarote-online.info, 1
|
||||
laos.dating, 1
|
||||
laospage.com, 1
|
||||
laozhu.me, 1
|
||||
|
@ -14002,7 +14005,6 @@ lbgconsultores.com, 1
|
|||
lbihrhelpdesk.com, 1
|
||||
lbs-logics.com, 1
|
||||
lca-pv.de, 1
|
||||
lcht.ch, 1
|
||||
lcti.biz, 1
|
||||
ld-begunjscica.si, 1
|
||||
ldc.com.br, 0
|
||||
|
@ -14615,7 +14617,6 @@ logostock.jp, 1
|
|||
logue.be, 1
|
||||
lohanaflores.com.br, 1
|
||||
loichot.ch, 1
|
||||
loisircreatif.net, 1
|
||||
lojadamimo.com.br, 1
|
||||
lojadanidrea.com.br, 1
|
||||
lojadewhisky.com.br, 1
|
||||
|
@ -14932,7 +14933,7 @@ maces-net.de, 1
|
|||
mach-politik.ch, 1
|
||||
macha.cloud, 1
|
||||
machbach.com, 1
|
||||
machikka.com, 1
|
||||
machikka.com, 0
|
||||
machon.biz, 0
|
||||
macht-elektro.de, 1
|
||||
machtweb.de, 1
|
||||
|
@ -14999,6 +15000,7 @@ magenda.sk, 1
|
|||
magentaize.net, 1
|
||||
magi.systems, 1
|
||||
magicball.co, 1
|
||||
magicbroccoli.de, 0
|
||||
magiclen.org, 1
|
||||
magicspaceninjapirates.de, 0
|
||||
magictable.com, 1
|
||||
|
@ -15259,7 +15261,6 @@ markow.io, 1
|
|||
markprof.ru, 1
|
||||
markrego.com, 1
|
||||
markri.nl, 0
|
||||
markrobin.de, 1
|
||||
marksouthall.com, 1
|
||||
markspres.org, 1
|
||||
markt-heiligenstadt.de, 0
|
||||
|
@ -15411,6 +15412,7 @@ mattli.us, 1
|
|||
mattmccutchen.net, 1
|
||||
mattonline.me, 1
|
||||
mattwb65.com, 1
|
||||
mattwservices.co.uk, 1
|
||||
matviet.vn, 1
|
||||
matze.co, 1
|
||||
matze.org, 1
|
||||
|
@ -15538,7 +15540,6 @@ mdcloudps.com, 1
|
|||
mdek.at, 1
|
||||
mdewendt.de, 1
|
||||
mdf-bis.com, 1
|
||||
mdkr.nl, 1
|
||||
mdma.net, 1
|
||||
mdmed.clinic, 1
|
||||
mdosch.de, 1
|
||||
|
@ -15797,6 +15798,7 @@ mflodin.se, 1
|
|||
mfrsgb45.org, 1
|
||||
mft.global, 1
|
||||
mghiorzi.com.ar, 0
|
||||
mgknet.com, 1
|
||||
mgoessel.de, 1
|
||||
mgrossklaus.de, 1
|
||||
mgrt.net, 1
|
||||
|
@ -15895,6 +15897,7 @@ mikedugan.org, 1
|
|||
mikegarnett.co.uk, 1
|
||||
mikegerwitz.com, 1
|
||||
mikehamburg.com, 1
|
||||
mikek.work, 1
|
||||
mikes.tk, 1
|
||||
miketabor.com, 1
|
||||
miketheuer.com, 1
|
||||
|
@ -15970,7 +15973,6 @@ minenash.com, 1
|
|||
minepay.net, 1
|
||||
minepic.org, 1
|
||||
minepod.fr, 1
|
||||
minesouls.fr, 1
|
||||
minez-nightswatch.com, 0
|
||||
minf3-games.de, 1
|
||||
mingo.nl, 1
|
||||
|
@ -15978,6 +15980,7 @@ mingram.net, 1
|
|||
mingwah.ch, 1
|
||||
mingy.ddns.net, 1
|
||||
minhanossasenhora.com.br, 1
|
||||
mini2.fi, 1
|
||||
minigolf-reisinger.com, 1
|
||||
minikidz.es, 1
|
||||
minikneet.com, 1
|
||||
|
@ -16478,6 +16481,7 @@ mts-server.com, 1
|
|||
mtsolar.es, 1
|
||||
muabannhanh.com, 0
|
||||
mubiflex.nl, 1
|
||||
muchohentai.com, 1
|
||||
muckingabout.eu, 1
|
||||
muehlemann.net, 1
|
||||
muellapp.com, 1
|
||||
|
@ -17394,6 +17398,7 @@ nikksno.io, 1
|
|||
niklasbabel.com, 1
|
||||
nikobradshaw.com, 1
|
||||
nikolaichik.photo, 1
|
||||
nikolasbradshaw.com, 1
|
||||
nikolasgrottendieck.com, 1
|
||||
nikomo.fi, 0
|
||||
nikz.in, 1
|
||||
|
@ -17849,6 +17854,7 @@ oftamedic.com, 1
|
|||
oftn.org, 1
|
||||
oge.ch, 1
|
||||
ogis.gov, 1
|
||||
ogkw.de, 1
|
||||
oglen.ca, 1
|
||||
ogocare.com, 1
|
||||
oguya.ch, 1
|
||||
|
@ -18373,9 +18379,7 @@ panascais.com, 1
|
|||
panascais.de, 1
|
||||
panascais.eu, 1
|
||||
panascais.host, 1
|
||||
panascais.io, 1
|
||||
panascais.me, 1
|
||||
panascais.net, 1
|
||||
panascais.pw, 1
|
||||
panascais.site, 1
|
||||
panascais.tech, 1
|
||||
|
@ -18559,6 +18563,7 @@ pauladamsmith.com, 1
|
|||
paulbakaus.com, 1
|
||||
paulbdelaat.nl, 1
|
||||
paulbramhall.uk, 1
|
||||
paulchen.at, 1
|
||||
pauldcox.com, 1
|
||||
paulerhof.com, 1
|
||||
paulewen.ca, 1
|
||||
|
@ -19149,6 +19154,7 @@ playkh.com, 1
|
|||
playmaza.live, 1
|
||||
playmfe.com, 1
|
||||
playpirates.com, 1
|
||||
playsharp.com, 1
|
||||
playsnake.org, 1
|
||||
playsoundevents.be, 1
|
||||
playsource.co, 1
|
||||
|
@ -19570,6 +19576,8 @@ prodsim.ninja, 1
|
|||
productbarcodes.com, 1
|
||||
productdesignsoftware.com.au, 1
|
||||
productgap.com, 1
|
||||
productived.net, 1
|
||||
productpeo.pl, 1
|
||||
proefteksten.nl, 0
|
||||
prof.ch, 1
|
||||
profection.biz, 1
|
||||
|
@ -19754,7 +19762,6 @@ public-g.de, 1
|
|||
public-projects.com, 1
|
||||
public-projects.de, 1
|
||||
public-vocals.de, 1
|
||||
publications.qld.gov.au, 0
|
||||
publiccarauctionscalifornia.com, 1
|
||||
publicintegrity.org, 1
|
||||
publicintelligence.net, 1
|
||||
|
@ -19979,7 +19986,6 @@ r-core.org, 1
|
|||
r-cut.fr, 1
|
||||
r-rwebdesign.com, 1
|
||||
r0t.co, 1
|
||||
r0uzic.net, 1
|
||||
r2d2pc.com, 1
|
||||
r3nt3r.com, 1
|
||||
r3s1stanc3.me, 1
|
||||
|
@ -20325,7 +20331,6 @@ regionale.org, 1
|
|||
regiosalland.nl, 1
|
||||
regiovertrieb.de, 0
|
||||
register.gov.uk, 1
|
||||
registertovoteflorida.gov, 1
|
||||
registrar.io, 1
|
||||
regmyr.se, 1
|
||||
regnix.net, 1
|
||||
|
@ -20837,7 +20842,6 @@ rothkranz.net, 1
|
|||
rothnater.ch, 1
|
||||
rotol.me, 1
|
||||
rotozen.com, 1
|
||||
rotter-dam.nl, 1
|
||||
rotterdamjazz.info, 1
|
||||
rottweil-hilft.de, 1
|
||||
rotunneling.net, 1
|
||||
|
@ -21333,7 +21337,6 @@ sbit.com.br, 1
|
|||
sblum.de, 1
|
||||
sbm.cloud, 1
|
||||
sbo-dresden.de, 1
|
||||
sbobetfun.com, 1
|
||||
sbr.red, 1
|
||||
sbsavings.bank, 1
|
||||
sbssoft.ru, 1
|
||||
|
@ -21359,6 +21362,7 @@ schaper-sport.com, 1
|
|||
schatmeester.be, 1
|
||||
schatzibaers.de, 1
|
||||
schau-rein.co.at, 1
|
||||
schawe.me, 1
|
||||
schd.io, 1
|
||||
scheduleme.io, 1
|
||||
scheemadigital.com, 1
|
||||
|
@ -21589,6 +21593,7 @@ seconfig.sytes.net, 1
|
|||
secpatrol.de, 1
|
||||
secretar.is, 1
|
||||
secretofanah.com, 1
|
||||
secretpanties.com, 1
|
||||
secretsanta.fr, 1
|
||||
secretserveronline.com, 1
|
||||
secretum.tech, 1
|
||||
|
@ -21762,6 +21767,7 @@ seosof.com, 1
|
|||
seoul.dating, 1
|
||||
seouniversity.org, 1
|
||||
sep23.ru, 1
|
||||
sepalandseed.com, 1
|
||||
sephr.com, 1
|
||||
sepie.gob.es, 1
|
||||
seppelec.com, 1
|
||||
|
@ -22463,6 +22469,7 @@ slrd-isperih.com, 1
|
|||
slse.ca, 1
|
||||
sluitkampzeist.nl, 0
|
||||
sluplift.com, 1
|
||||
slvh.fr, 1
|
||||
slwilde.ca, 1
|
||||
slxh.eu, 1
|
||||
slxh.nl, 1
|
||||
|
@ -22508,6 +22515,7 @@ smartpolicingplatform.com, 1
|
|||
smartrade.tech, 1
|
||||
smartshiftme.com, 1
|
||||
smartship.co.jp, 1
|
||||
smartshoppers.es, 1
|
||||
smartsparrow.com, 1
|
||||
smartvideo.io, 1
|
||||
smartviewing.com, 1
|
||||
|
@ -22981,6 +22989,7 @@ squido.ch, 1
|
|||
squidparty.com, 1
|
||||
squids.space, 1
|
||||
squirtlesbians.net, 1
|
||||
sqzryang.com, 1
|
||||
sr-cs.net, 1
|
||||
srandom.com, 1
|
||||
srbija-nekretnine.org, 1
|
||||
|
@ -23225,7 +23234,6 @@ stichtingliab.nl, 1
|
|||
stichtingscholierenvervoerzeeland.nl, 1
|
||||
stichtingsticky.nl, 1
|
||||
stick2bike.de, 1
|
||||
stickies.io, 1
|
||||
stickswag.cf, 1
|
||||
stift-kremsmuenster.at, 1
|
||||
stig.io, 1
|
||||
|
@ -23453,11 +23461,12 @@ sundaycooks.com, 1
|
|||
sundayfundayjapan.com, 1
|
||||
suneilpatel.com, 1
|
||||
sunfireshop.com.br, 1
|
||||
sunflyer.cn, 0
|
||||
sunfox.cz, 1
|
||||
sunfulong.me, 1
|
||||
sungo.wtf, 1
|
||||
sunjaydhama.com, 1
|
||||
sunn.ie, 1
|
||||
sunsetwx.com, 1
|
||||
sunshinesf.org, 1
|
||||
sunsmartresorts.com, 1
|
||||
sunstar.bg, 1
|
||||
|
@ -23597,7 +23606,6 @@ swissid.ch, 1
|
|||
swisslinux.org, 1
|
||||
swisswebhelp.ch, 1
|
||||
swissxperts.ch, 1
|
||||
swite.com, 1
|
||||
swordfeng.xyz, 1
|
||||
swuosa.org, 1
|
||||
swvaux.com, 1
|
||||
|
@ -24039,7 +24047,7 @@ tenberg.com, 1
|
|||
tenbos.ch, 1
|
||||
tendermaster.com.ua, 1
|
||||
tenderstem.co.uk, 1
|
||||
tendoryu-aikido.org, 0
|
||||
tendoryu-aikido.org, 1
|
||||
tenenz.com, 1
|
||||
tengu.cloud, 1
|
||||
tenispopular.com, 1
|
||||
|
@ -24333,6 +24341,7 @@ theploughharborne.co.uk, 1
|
|||
theposhfudgecompany.co.uk, 1
|
||||
thepostoffice.ro, 1
|
||||
theprincegame.com, 1
|
||||
theprivacysolution.com, 1
|
||||
thepromisemusic.com, 1
|
||||
thequillmagazine.org, 1
|
||||
theragran.co.id, 1
|
||||
|
@ -24622,6 +24631,7 @@ tjl.rocks, 1
|
|||
tjp.ch, 1
|
||||
tjs.me, 1
|
||||
tkacz.pro, 1
|
||||
tkarstens.de, 0
|
||||
tkat.ch, 1
|
||||
tkgpm.com, 1
|
||||
tkjg.fi, 1
|
||||
|
@ -25719,7 +25729,6 @@ vacuumreviewcenter.com, 1
|
|||
vadennissanofhiltonheadparts.com, 1
|
||||
vadennissanofhinesvilleparts.com, 1
|
||||
vadik.me, 1
|
||||
vadodesign.nl, 1
|
||||
vaeplatform.com, 1
|
||||
vaew.com, 1
|
||||
vagabond.fr, 1
|
||||
|
@ -26140,6 +26149,7 @@ vm-0.com, 1
|
|||
vm-co.ch, 1
|
||||
vmc.co.id, 1
|
||||
vmem.jp, 1
|
||||
vmgirls.com, 1
|
||||
vmis.nl, 1
|
||||
vmoagents.com, 0
|
||||
vmug.pl, 1
|
||||
|
@ -26336,6 +26346,7 @@ wangql.net, 1
|
|||
wangqr.tk, 1
|
||||
wangyue.blog, 1
|
||||
wantshow.com.br, 1
|
||||
wanybug.cn, 1
|
||||
wapking.live, 1
|
||||
wardow.com, 1
|
||||
warekon.com, 1
|
||||
|
@ -26377,7 +26388,6 @@ waterfedpole.com, 1
|
|||
watermonitor.gov, 1
|
||||
watertrails.io, 1
|
||||
watsonwork.me, 1
|
||||
wattechweb.com, 1
|
||||
wave-ola.es, 1
|
||||
wavesboardshop.com, 1
|
||||
wavesoftime.com, 1
|
||||
|
@ -26387,6 +26397,7 @@ waylaydesign.com, 1
|
|||
wayne.cloud, 0
|
||||
wayohoo.com, 1
|
||||
wayohoo.net, 1
|
||||
waytt.cf, 1
|
||||
waze.com, 1
|
||||
wbci.us, 1
|
||||
wbg-vs.de, 1
|
||||
|
@ -26795,7 +26806,6 @@ wilane.org, 1
|
|||
wild-emotion-events.de, 1
|
||||
wildboaratvparts.com, 1
|
||||
wildcard.hu, 1
|
||||
wilddog.com, 1
|
||||
wilddogdesign.co.uk, 1
|
||||
wildewood.ca, 1
|
||||
wildnisfamilie.net, 1
|
||||
|
@ -27124,6 +27134,7 @@ www-8887999.com, 0
|
|||
www.aclu.org, 0
|
||||
www.airbnb.com, 1
|
||||
www.amazon.ca, 1
|
||||
www.amazon.cn, 1
|
||||
www.amazon.co.jp, 1
|
||||
www.amazon.co.uk, 1
|
||||
www.amazon.com, 1
|
||||
|
@ -27275,6 +27286,7 @@ xichuangke.com, 0
|
|||
xicreative.net, 1
|
||||
xight.org, 1
|
||||
xilef.org, 1
|
||||
xiliant.com, 1
|
||||
xilkoi.net, 1
|
||||
ximage.me, 0
|
||||
ximbo.net, 1
|
||||
|
@ -27661,7 +27673,6 @@ yourself.today, 1
|
|||
yourticketbooking.com, 1
|
||||
youruseragent.info, 1
|
||||
yourznc.com, 1
|
||||
youss.cc, 0
|
||||
yout.com, 1
|
||||
youtous.me, 1
|
||||
youtubedownloader.com, 1
|
||||
|
@ -27675,6 +27686,7 @@ ypid.de, 1
|
|||
yplanapp.com, 1
|
||||
yr166166.com, 1
|
||||
yryz.net, 1
|
||||
ys-shop.biz, 1
|
||||
ysicorp.com, 1
|
||||
yslbeauty.com, 1
|
||||
ytec.ca, 1
|
||||
|
@ -27685,6 +27697,7 @@ ytreza.fr, 1
|
|||
ytuquelees.net, 1
|
||||
yu.gg, 0
|
||||
yu.vc, 1
|
||||
yuan.ga, 1
|
||||
yuanben.io, 1
|
||||
yuanbenlian.com, 1
|
||||
yubi.co, 1
|
||||
|
@ -27734,6 +27747,8 @@ yukonlip.com, 1
|
|||
yukontec.com, 1
|
||||
yum.beer, 1
|
||||
yumeconcert.com, 1
|
||||
yuna.love, 1
|
||||
yuna.tg, 1
|
||||
yunity.org, 1
|
||||
yunjishou.pro, 1
|
||||
yuricarlenzoli.it, 1
|
||||
|
@ -27875,7 +27890,6 @@ zfree.co.nz, 1
|
|||
zgrep.org, 1
|
||||
zhang-hao.com, 1
|
||||
zhangfangzhou.com, 1
|
||||
zhangge.net, 1
|
||||
zhanghao.me, 1
|
||||
zhangsidan.com, 1
|
||||
zhangsir.net, 1
|
||||
|
@ -27940,7 +27954,6 @@ zojadravai.com, 1
|
|||
zoki.art, 1
|
||||
zokster.net, 1
|
||||
zolokar.xyz, 1
|
||||
zolotoy-standart.com.ua, 1
|
||||
zombiesecured.com, 1
|
||||
zomerschoen.nl, 1
|
||||
zone39.com, 1
|
||||
|
@ -27967,6 +27980,7 @@ zor.com, 1
|
|||
zorgclustertool.nl, 1
|
||||
zorium.org, 1
|
||||
zorntt.fr, 1
|
||||
zorz.info, 1
|
||||
zotero.org, 1
|
||||
zouk.info, 1
|
||||
zqwqz.com, 1
|
||||
|
@ -28021,13 +28035,13 @@ zxity.co.uk, 1
|
|||
zxity.ltd, 1
|
||||
zxity.uk, 1
|
||||
zxtcode.com, 1
|
||||
zybbo.com, 1
|
||||
zymmm.com, 1
|
||||
zypern-firma.com, 1
|
||||
zypr.pw, 1
|
||||
zyria.de, 1
|
||||
zyul.ddns.net, 1
|
||||
zyx.im, 0
|
||||
zyzardx.com, 1
|
||||
zzb510.com, 1
|
||||
zzb6688.com, 1
|
||||
zzsec.org, 1
|
||||
|
|
|
@ -834,6 +834,11 @@ xNextSystemCall(sqlite3_vfs *vfs, const char *zName)
|
|||
namespace mozilla {
|
||||
namespace storage {
|
||||
|
||||
const char *GetVFSName()
|
||||
{
|
||||
return "telemetry-vfs";
|
||||
}
|
||||
|
||||
sqlite3_vfs* ConstructTelemetryVFS()
|
||||
{
|
||||
#if defined(XP_WIN)
|
||||
|
@ -867,7 +872,7 @@ sqlite3_vfs* ConstructTelemetryVFS()
|
|||
MOZ_ASSERT(vfs->iVersion <= LAST_KNOWN_VFS_VERSION);
|
||||
tvfs->szOsFile = sizeof(telemetry_file) - sizeof(sqlite3_file) + vfs->szOsFile;
|
||||
tvfs->mxPathname = vfs->mxPathname;
|
||||
tvfs->zName = "telemetry-vfs";
|
||||
tvfs->zName = GetVFSName();
|
||||
tvfs->pAppData = vfs;
|
||||
tvfs->xOpen = xOpen;
|
||||
tvfs->xDelete = xDelete;
|
||||
|
|
|
@ -73,6 +73,8 @@ namespace storage {
|
|||
|
||||
using mozilla::dom::quota::QuotaObject;
|
||||
|
||||
const char *GetVFSName();
|
||||
|
||||
namespace {
|
||||
|
||||
int
|
||||
|
@ -627,7 +629,7 @@ Connection::initialize()
|
|||
AUTO_PROFILER_LABEL("Connection::initialize", STORAGE);
|
||||
|
||||
// in memory database requested, sqlite uses a magic file name
|
||||
int srv = ::sqlite3_open_v2(":memory:", &mDBConn, mFlags, nullptr);
|
||||
int srv = ::sqlite3_open_v2(":memory:", &mDBConn, mFlags, GetVFSName());
|
||||
if (srv != SQLITE_OK) {
|
||||
mDBConn = nullptr;
|
||||
return convertResultCode(srv);
|
||||
|
@ -660,7 +662,7 @@ Connection::initialize(nsIFile *aDatabaseFile)
|
|||
#else
|
||||
static const char* sIgnoreLockingVFS = "unix-none";
|
||||
#endif
|
||||
const char* vfs = mIgnoreLockingMode ? sIgnoreLockingVFS : nullptr;
|
||||
const char* vfs = mIgnoreLockingMode ? sIgnoreLockingVFS : GetVFSName();
|
||||
|
||||
int srv = ::sqlite3_open_v2(NS_ConvertUTF16toUTF8(path).get(), &mDBConn,
|
||||
mFlags, vfs);
|
||||
|
@ -694,7 +696,7 @@ Connection::initialize(nsIFileURL *aFileURL)
|
|||
rv = aFileURL->GetSpec(spec);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
int srv = ::sqlite3_open_v2(spec.get(), &mDBConn, mFlags, nullptr);
|
||||
int srv = ::sqlite3_open_v2(spec.get(), &mDBConn, mFlags, GetVFSName());
|
||||
if (srv != SQLITE_OK) {
|
||||
mDBConn = nullptr;
|
||||
return convertResultCode(srv);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "mozIStoragePendingStatement.h"
|
||||
|
||||
#include "sqlite3.h"
|
||||
#include "mozilla/AutoSQLiteLifetime.h"
|
||||
|
||||
#ifdef SQLITE_OS_WIN
|
||||
// "windows.h" was included and it can #define lots of things we care about...
|
||||
|
@ -32,13 +33,6 @@
|
|||
|
||||
#include "nsIPromptService.h"
|
||||
|
||||
#ifdef MOZ_STORAGE_MEMORY
|
||||
# include "mozmemory.h"
|
||||
# ifdef MOZ_DMD
|
||||
# include "DMD.h"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//// Defines
|
||||
|
||||
|
@ -282,12 +276,6 @@ Service::~Service()
|
|||
if (rc != SQLITE_OK)
|
||||
NS_WARNING("Failed to unregister sqlite vfs wrapper.");
|
||||
|
||||
// Shutdown the sqlite3 API. Warn if shutdown did not turn out okay, but
|
||||
// there is nothing actionable we can do in that case.
|
||||
rc = ::sqlite3_shutdown();
|
||||
if (rc != SQLITE_OK)
|
||||
NS_WARNING("sqlite3 did not shutdown cleanly.");
|
||||
|
||||
shutdown(); // To release sXPConnect.
|
||||
|
||||
gService = nullptr;
|
||||
|
@ -400,121 +388,7 @@ Service::shutdown()
|
|||
}
|
||||
|
||||
sqlite3_vfs *ConstructTelemetryVFS();
|
||||
|
||||
#ifdef MOZ_STORAGE_MEMORY
|
||||
|
||||
namespace {
|
||||
|
||||
// By default, SQLite tracks the size of all its heap blocks by adding an extra
|
||||
// 8 bytes at the start of the block to hold the size. Unfortunately, this
|
||||
// causes a lot of 2^N-sized allocations to be rounded up by jemalloc
|
||||
// allocator, wasting memory. For example, a request for 1024 bytes has 8
|
||||
// bytes added, becoming a request for 1032 bytes, and jemalloc rounds this up
|
||||
// to 2048 bytes, wasting 1012 bytes. (See bug 676189 for more details.)
|
||||
//
|
||||
// So we register jemalloc as the malloc implementation, which avoids this
|
||||
// 8-byte overhead, and thus a lot of waste. This requires us to provide a
|
||||
// function, sqliteMemRoundup(), which computes the actual size that will be
|
||||
// allocated for a given request. SQLite uses this function before all
|
||||
// allocations, and may be able to use any excess bytes caused by the rounding.
|
||||
//
|
||||
// Note: the wrappers for malloc, realloc and moz_malloc_usable_size are
|
||||
// necessary because the sqlite_mem_methods type signatures differ slightly
|
||||
// from the standard ones -- they use int instead of size_t. But we don't need
|
||||
// a wrapper for free.
|
||||
|
||||
#ifdef MOZ_DMD
|
||||
|
||||
// sqlite does its own memory accounting, and we use its numbers in our memory
|
||||
// reporters. But we don't want sqlite's heap blocks to show up in DMD's
|
||||
// output as unreported, so we mark them as reported when they're allocated and
|
||||
// mark them as unreported when they are freed.
|
||||
//
|
||||
// In other words, we are marking all sqlite heap blocks as reported even
|
||||
// though we're not reporting them ourselves. Instead we're trusting that
|
||||
// sqlite is fully and correctly accounting for all of its heap blocks via its
|
||||
// own memory accounting. Well, we don't have to trust it entirely, because
|
||||
// it's easy to keep track (while doing this DMD-specific marking) of exactly
|
||||
// how much memory SQLite is using. And we can compare that against what
|
||||
// SQLite reports it is using.
|
||||
|
||||
MOZ_DEFINE_MALLOC_SIZE_OF_ON_ALLOC(SqliteMallocSizeOfOnAlloc)
|
||||
MOZ_DEFINE_MALLOC_SIZE_OF_ON_FREE(SqliteMallocSizeOfOnFree)
|
||||
|
||||
#endif
|
||||
|
||||
static void *sqliteMemMalloc(int n)
|
||||
{
|
||||
void* p = ::malloc(n);
|
||||
#ifdef MOZ_DMD
|
||||
gSqliteMemoryUsed += SqliteMallocSizeOfOnAlloc(p);
|
||||
#endif
|
||||
return p;
|
||||
}
|
||||
|
||||
static void sqliteMemFree(void *p)
|
||||
{
|
||||
#ifdef MOZ_DMD
|
||||
gSqliteMemoryUsed -= SqliteMallocSizeOfOnFree(p);
|
||||
#endif
|
||||
::free(p);
|
||||
}
|
||||
|
||||
static void *sqliteMemRealloc(void *p, int n)
|
||||
{
|
||||
#ifdef MOZ_DMD
|
||||
gSqliteMemoryUsed -= SqliteMallocSizeOfOnFree(p);
|
||||
void *pnew = ::realloc(p, n);
|
||||
if (pnew) {
|
||||
gSqliteMemoryUsed += SqliteMallocSizeOfOnAlloc(pnew);
|
||||
} else {
|
||||
// realloc failed; undo the SqliteMallocSizeOfOnFree from above
|
||||
gSqliteMemoryUsed += SqliteMallocSizeOfOnAlloc(p);
|
||||
}
|
||||
return pnew;
|
||||
#else
|
||||
return ::realloc(p, n);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int sqliteMemSize(void *p)
|
||||
{
|
||||
return ::moz_malloc_usable_size(p);
|
||||
}
|
||||
|
||||
static int sqliteMemRoundup(int n)
|
||||
{
|
||||
n = malloc_good_size(n);
|
||||
|
||||
// jemalloc can return blocks of size 2 and 4, but SQLite requires that all
|
||||
// allocations be 8-aligned. So we round up sub-8 requests to 8. This
|
||||
// wastes a small amount of memory but is obviously safe.
|
||||
return n <= 8 ? 8 : n;
|
||||
}
|
||||
|
||||
static int sqliteMemInit(void *p)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sqliteMemShutdown(void *p)
|
||||
{
|
||||
}
|
||||
|
||||
const sqlite3_mem_methods memMethods = {
|
||||
&sqliteMemMalloc,
|
||||
&sqliteMemFree,
|
||||
&sqliteMemRealloc,
|
||||
&sqliteMemSize,
|
||||
&sqliteMemRoundup,
|
||||
&sqliteMemInit,
|
||||
&sqliteMemShutdown,
|
||||
nullptr
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // MOZ_STORAGE_MEMORY
|
||||
const char *GetVFSName();
|
||||
|
||||
static const char* sObserverTopics[] = {
|
||||
"memory-pressure",
|
||||
|
@ -527,28 +401,13 @@ Service::initialize()
|
|||
{
|
||||
MOZ_ASSERT(NS_IsMainThread(), "Must be initialized on the main thread");
|
||||
|
||||
int rc;
|
||||
|
||||
#ifdef MOZ_STORAGE_MEMORY
|
||||
rc = ::sqlite3_config(SQLITE_CONFIG_MALLOC, &memMethods);
|
||||
if (rc != SQLITE_OK)
|
||||
return convertResultCode(rc);
|
||||
#endif
|
||||
|
||||
// TODO (bug 1191405): do not preallocate the connections caches until we
|
||||
// have figured the impact on our consumers and memory.
|
||||
sqlite3_config(SQLITE_CONFIG_PAGECACHE, NULL, 0, 0);
|
||||
|
||||
// Explicitly initialize sqlite3. Although this is implicitly called by
|
||||
// various sqlite3 functions (and the sqlite3_open calls in our case),
|
||||
// the documentation suggests calling this directly. So we do.
|
||||
rc = ::sqlite3_initialize();
|
||||
int rc = AutoSQLiteLifetime::getInitResult();
|
||||
if (rc != SQLITE_OK)
|
||||
return convertResultCode(rc);
|
||||
|
||||
mSqliteVFS = ConstructTelemetryVFS();
|
||||
if (mSqliteVFS) {
|
||||
rc = sqlite3_vfs_register(mSqliteVFS, 1);
|
||||
rc = sqlite3_vfs_register(mSqliteVFS, 0);
|
||||
if (rc != SQLITE_OK)
|
||||
return convertResultCode(rc);
|
||||
} else {
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче