зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central to autoland. a=merge CLOSED TREE
This commit is contained in:
Коммит
b114c48532
|
@ -601,6 +601,10 @@
|
|||
<prefs/>
|
||||
<versionRange minVersion="0" maxVersion="*" severity="1"/>
|
||||
</emItem>
|
||||
<emItem blockID="2104a522-bb2f-4b04-ad0d-b0c571644552" id="{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de}">
|
||||
<prefs/>
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||
</emItem>
|
||||
<emItem blockID="510bbd9b-b883-4837-90ab-8e353e27e1be" id="{3B4DE07A-DE43-4DBC-873F-05835FF67DCE}">
|
||||
<prefs/>
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3"/>
|
||||
|
|
|
@ -14,6 +14,8 @@ CustomTypeAnnotation NonHeapClass =
|
|||
CustomTypeAnnotation HeapClass = CustomTypeAnnotation("moz_heap_class", "heap");
|
||||
CustomTypeAnnotation NonTemporaryClass =
|
||||
CustomTypeAnnotation("moz_non_temporary_class", "non-temporary");
|
||||
CustomTypeAnnotation TemporaryClass =
|
||||
CustomTypeAnnotation("moz_temporary_class", "temporary");
|
||||
|
||||
void CustomTypeAnnotation::dumpAnnotationReason(BaseCheck &Check, QualType T,
|
||||
SourceLocation Loc) {
|
||||
|
|
|
@ -68,5 +68,6 @@ extern CustomTypeAnnotation GlobalClass;
|
|||
extern CustomTypeAnnotation NonHeapClass;
|
||||
extern CustomTypeAnnotation HeapClass;
|
||||
extern CustomTypeAnnotation NonTemporaryClass;
|
||||
extern CustomTypeAnnotation TemporaryClass;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -123,6 +123,7 @@ void ScopeChecker::check(const MatchFinder::MatchResult &Result) {
|
|||
const char *Heap = "variable of type %0 only valid on the heap";
|
||||
const char *NonHeap = "variable of type %0 is not valid on the heap";
|
||||
const char *NonTemporary = "variable of type %0 is not valid in a temporary";
|
||||
const char *Temporary = "variable of type %0 is only valid as a temporary";
|
||||
|
||||
const char *StackNote =
|
||||
"value incorrectly allocated in an automatic variable";
|
||||
|
@ -138,11 +139,13 @@ void ScopeChecker::check(const MatchFinder::MatchResult &Result) {
|
|||
case AV_Global:
|
||||
StackClass.reportErrorIfPresent(*this, T, Loc, Stack, GlobalNote);
|
||||
HeapClass.reportErrorIfPresent(*this, T, Loc, Heap, GlobalNote);
|
||||
TemporaryClass.reportErrorIfPresent(*this, T, Loc, Temporary, GlobalNote);
|
||||
break;
|
||||
|
||||
case AV_Automatic:
|
||||
GlobalClass.reportErrorIfPresent(*this, T, Loc, Global, StackNote);
|
||||
HeapClass.reportErrorIfPresent(*this, T, Loc, Heap, StackNote);
|
||||
TemporaryClass.reportErrorIfPresent(*this, T, Loc, Temporary, StackNote);
|
||||
break;
|
||||
|
||||
case AV_Temporary:
|
||||
|
@ -156,6 +159,7 @@ void ScopeChecker::check(const MatchFinder::MatchResult &Result) {
|
|||
GlobalClass.reportErrorIfPresent(*this, T, Loc, Global, HeapNote);
|
||||
StackClass.reportErrorIfPresent(*this, T, Loc, Stack, HeapNote);
|
||||
NonHeapClass.reportErrorIfPresent(*this, T, Loc, NonHeap, HeapNote);
|
||||
TemporaryClass.reportErrorIfPresent(*this, T, Loc, Temporary, HeapNote);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
#define MOZ_TEMPORARY_CLASS __attribute__((annotate("moz_temporary_class")))
|
||||
#define MOZ_IMPLICIT __attribute__((annotate("moz_implicit")))
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
struct MOZ_TEMPORARY_CLASS Temporary {
|
||||
int i;
|
||||
Temporary() {}
|
||||
MOZ_IMPLICIT Temporary(int a) {}
|
||||
Temporary(int a, int b) {}
|
||||
void *operator new(size_t x) throw() { return 0; }
|
||||
void *operator new(size_t blah, char *buffer) { return buffer; }
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct MOZ_TEMPORARY_CLASS TemplateClass {
|
||||
T i;
|
||||
};
|
||||
|
||||
void gobble(void *) { }
|
||||
|
||||
void gobbleref(const Temporary&) { }
|
||||
|
||||
template <class T>
|
||||
void gobbleanyref(const T&) { }
|
||||
|
||||
void misuseNonTemporaryClass(int len) {
|
||||
// All of these should error.
|
||||
Temporary invalid; // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated in an automatic variable}}
|
||||
Temporary alsoInvalid[2]; // expected-error {{variable of type 'Temporary [2]' is only valid as a temporary}} expected-note {{value incorrectly allocated in an automatic variable}} expected-note {{'Temporary [2]' is a temporary type because it is an array of temporary type 'Temporary'}}
|
||||
static Temporary invalidStatic; // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated in a global variable}}
|
||||
static Temporary alsoInvalidStatic[2]; // expected-error {{variable of type 'Temporary [2]' is only valid as a temporary}} expected-note {{value incorrectly allocated in a global variable}} expected-note {{'Temporary [2]' is a temporary type because it is an array of temporary type 'Temporary'}}
|
||||
|
||||
gobble(&invalid);
|
||||
gobble(&invalidStatic);
|
||||
gobble(&alsoInvalid[0]);
|
||||
|
||||
// All of these should be fine.
|
||||
gobbleref(Temporary());
|
||||
gobbleref(Temporary(10, 20));
|
||||
gobbleref(Temporary(10));
|
||||
gobbleref(10);
|
||||
gobbleanyref(TemplateClass<int>());
|
||||
|
||||
// All of these should error.
|
||||
gobble(new Temporary); // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated on the heap}}
|
||||
gobble(new Temporary[10]); // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated on the heap}}
|
||||
gobble(new TemplateClass<int>); // expected-error {{variable of type 'TemplateClass<int>' is only valid as a temporary}} expected-note {{value incorrectly allocated on the heap}}
|
||||
gobble(len <= 5 ? &invalid : new Temporary); // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated on the heap}}
|
||||
|
||||
// Placement new is odd, but okay.
|
||||
char buffer[sizeof(Temporary)];
|
||||
gobble(new (buffer) Temporary);
|
||||
}
|
||||
|
||||
void defaultArg(const Temporary& arg = Temporary()) { // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated in an automatic variable}}
|
||||
}
|
||||
|
||||
// Can't be a global, this should error.
|
||||
Temporary invalidStatic; // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated in a global variable}}
|
||||
|
||||
struct RandomClass {
|
||||
Temporary nonstaticMember; // This is okay if RandomClass is only used as a temporary.
|
||||
static Temporary staticMember; // expected-error {{variable of type 'Temporary' is only valid as a temporary}} expected-note {{value incorrectly allocated in a global variable}}
|
||||
};
|
||||
|
||||
struct BadInherit : Temporary {};
|
||||
|
||||
void useStuffWrongly() {
|
||||
gobbleanyref(BadInherit());
|
||||
gobbleanyref(RandomClass());
|
||||
}
|
|
@ -43,6 +43,7 @@ SOURCES += [
|
|||
'TestRefCountedCopyConstructor.cpp',
|
||||
'TestSprintfLiteral.cpp',
|
||||
'TestStackClass.cpp',
|
||||
'TestTemporaryClass.cpp',
|
||||
'TestTrivialCtorDtor.cpp',
|
||||
]
|
||||
|
||||
|
|
|
@ -13,8 +13,8 @@ var { ConsoleAPIListener } = require("devtools/server/actors/webconsole/listener
|
|||
var DevToolsUtils = require("devtools/shared/DevToolsUtils");
|
||||
var { assert, update } = DevToolsUtils;
|
||||
|
||||
loader.lazyRequireGetter(this, "AddonThreadActor", "devtools/server/actors/script", true);
|
||||
loader.lazyRequireGetter(this, "unwrapDebuggerObjectGlobal", "devtools/server/actors/script", true);
|
||||
loader.lazyRequireGetter(this, "AddonThreadActor", "devtools/server/actors/thread", true);
|
||||
loader.lazyRequireGetter(this, "unwrapDebuggerObjectGlobal", "devtools/server/actors/thread", true);
|
||||
loader.lazyRequireGetter(this, "mapURIToAddonID", "devtools/server/actors/utils/map-uri-to-addon-id");
|
||||
loader.lazyRequireGetter(this, "WebConsoleActor", "devtools/server/actors/webconsole", true);
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
const { Cc, Ci, Cu } = require("chrome");
|
||||
const Services = require("Services");
|
||||
|
||||
const { ChromeDebuggerActor } = require("devtools/server/actors/script");
|
||||
const { ChromeDebuggerActor } = require("devtools/server/actors/thread");
|
||||
const { WebConsoleActor } = require("devtools/server/actors/webconsole");
|
||||
const makeDebugger = require("devtools/server/actors/utils/make-debugger");
|
||||
const { ActorPool } = require("devtools/server/main");
|
||||
|
|
|
@ -42,6 +42,7 @@ DevToolsModules(
|
|||
'memory.js',
|
||||
'monitor.js',
|
||||
'object.js',
|
||||
'pause-scoped.js',
|
||||
'perf.js',
|
||||
'performance-recording.js',
|
||||
'performance.js',
|
||||
|
@ -51,13 +52,13 @@ DevToolsModules(
|
|||
'promises.js',
|
||||
'reflow.js',
|
||||
'root.js',
|
||||
'script.js',
|
||||
'source.js',
|
||||
'storage.js',
|
||||
'string.js',
|
||||
'styles.js',
|
||||
'stylesheets.js',
|
||||
'tab.js',
|
||||
'thread.js',
|
||||
'timeline.js',
|
||||
'webaudio.js',
|
||||
'webbrowser.js',
|
||||
|
|
|
@ -0,0 +1,128 @@
|
|||
/* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
|
||||
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const { ObjectActor } = require("devtools/server/actors/object");
|
||||
|
||||
/**
|
||||
* A base actor for any actors that should only respond receive messages in the
|
||||
* paused state. Subclasses may expose a `threadActor` which is used to help
|
||||
* determine when we are in a paused state. Subclasses should set their own
|
||||
* "constructor" property if they want better error messages. You should never
|
||||
* instantiate a PauseScopedActor directly, only through subclasses.
|
||||
*/
|
||||
function PauseScopedActor() {
|
||||
}
|
||||
|
||||
/**
|
||||
* A function decorator for creating methods to handle protocol messages that
|
||||
* should only be received while in the paused state.
|
||||
*
|
||||
* @param method Function
|
||||
* The function we are decorating.
|
||||
*/
|
||||
PauseScopedActor.withPaused = function (method) {
|
||||
return function () {
|
||||
if (this.isPaused()) {
|
||||
return method.apply(this, arguments);
|
||||
}
|
||||
return this._wrongState();
|
||||
};
|
||||
};
|
||||
|
||||
PauseScopedActor.prototype = {
|
||||
|
||||
/**
|
||||
* Returns true if we are in the paused state.
|
||||
*/
|
||||
isPaused: function () {
|
||||
// When there is not a ThreadActor available (like in the webconsole) we
|
||||
// have to be optimistic and assume that we are paused so that we can
|
||||
// respond to requests.
|
||||
return this.threadActor ? this.threadActor.state === "paused" : true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the wrongState response packet for this actor.
|
||||
*/
|
||||
_wrongState: function () {
|
||||
return {
|
||||
error: "wrongState",
|
||||
message: this.constructor.name +
|
||||
" actors can only be accessed while the thread is paused."
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a pause-scoped actor for the specified object.
|
||||
* @see ObjectActor
|
||||
*/
|
||||
function PauseScopedObjectActor(obj, hooks) {
|
||||
ObjectActor.call(this, obj, hooks);
|
||||
this.hooks.promote = hooks.promote;
|
||||
this.hooks.isThreadLifetimePool = hooks.isThreadLifetimePool;
|
||||
}
|
||||
|
||||
PauseScopedObjectActor.prototype = Object.create(PauseScopedActor.prototype);
|
||||
|
||||
Object.assign(PauseScopedObjectActor.prototype, ObjectActor.prototype);
|
||||
|
||||
Object.assign(PauseScopedObjectActor.prototype, {
|
||||
constructor: PauseScopedObjectActor,
|
||||
actorPrefix: "pausedobj",
|
||||
|
||||
onOwnPropertyNames:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onOwnPropertyNames),
|
||||
|
||||
onPrototypeAndProperties:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onPrototypeAndProperties),
|
||||
|
||||
onPrototype: PauseScopedActor.withPaused(ObjectActor.prototype.onPrototype),
|
||||
onProperty: PauseScopedActor.withPaused(ObjectActor.prototype.onProperty),
|
||||
onDecompile: PauseScopedActor.withPaused(ObjectActor.prototype.onDecompile),
|
||||
|
||||
onDisplayString:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onDisplayString),
|
||||
|
||||
onParameterNames:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onParameterNames),
|
||||
|
||||
/**
|
||||
* Handle a protocol request to promote a pause-lifetime grip to a
|
||||
* thread-lifetime grip.
|
||||
*
|
||||
* @param request object
|
||||
* The protocol request object.
|
||||
*/
|
||||
onThreadGrip: PauseScopedActor.withPaused(function (request) {
|
||||
this.hooks.promote();
|
||||
return {};
|
||||
}),
|
||||
|
||||
/**
|
||||
* Handle a protocol request to release a thread-lifetime grip.
|
||||
*
|
||||
* @param request object
|
||||
* The protocol request object.
|
||||
*/
|
||||
onRelease: PauseScopedActor.withPaused(function (request) {
|
||||
if (this.hooks.isThreadLifetimePool()) {
|
||||
return { error: "notReleasable",
|
||||
message: "Only thread-lifetime actors can be released." };
|
||||
}
|
||||
|
||||
this.release();
|
||||
return {};
|
||||
}),
|
||||
});
|
||||
|
||||
Object.assign(PauseScopedObjectActor.prototype.requestTypes, {
|
||||
"threadGrip": PauseScopedObjectActor.prototype.onThreadGrip,
|
||||
});
|
||||
|
||||
exports.PauseScopedObjectActor = PauseScopedObjectActor;
|
|
@ -27,8 +27,8 @@ const EventEmitter = require("devtools/shared/event-emitter");
|
|||
|
||||
const EXTENSION_CONTENT_JSM = "resource://gre/modules/ExtensionContent.jsm";
|
||||
|
||||
loader.lazyRequireGetter(this, "ThreadActor", "devtools/server/actors/script", true);
|
||||
loader.lazyRequireGetter(this, "unwrapDebuggerObjectGlobal", "devtools/server/actors/script", true);
|
||||
loader.lazyRequireGetter(this, "ThreadActor", "devtools/server/actors/thread", true);
|
||||
loader.lazyRequireGetter(this, "unwrapDebuggerObjectGlobal", "devtools/server/actors/thread", true);
|
||||
loader.lazyRequireGetter(this, "WorkerActorList", "devtools/server/actors/worker-list", true);
|
||||
loader.lazyImporter(this, "ExtensionContent", EXTENSION_CONTENT_JSM);
|
||||
|
||||
|
|
|
@ -8,14 +8,13 @@
|
|||
|
||||
const Services = require("Services");
|
||||
const { Cc, Ci, Cr } = require("chrome");
|
||||
const { ActorPool, OriginalLocation, GeneratedLocation } = require("devtools/server/actors/common");
|
||||
const { ObjectActor, createValueGrip, longStringGrip } = require("devtools/server/actors/object");
|
||||
const { ActorPool, GeneratedLocation } = require("devtools/server/actors/common");
|
||||
const { createValueGrip, longStringGrip } = require("devtools/server/actors/object");
|
||||
const { ActorClassWithSpec } = require("devtools/shared/protocol");
|
||||
const DevToolsUtils = require("devtools/shared/DevToolsUtils");
|
||||
const flags = require("devtools/shared/flags");
|
||||
const { assert, dumpn } = DevToolsUtils;
|
||||
const promise = require("promise");
|
||||
const xpcInspector = require("xpcInspector");
|
||||
const { DevToolsWorker } = require("devtools/shared/worker/worker");
|
||||
const { threadSpec } = require("devtools/shared/specs/script");
|
||||
|
||||
|
@ -26,372 +25,17 @@ loader.lazyGetter(this, "Debugger", () => {
|
|||
hackDebugger(Debugger);
|
||||
return Debugger;
|
||||
});
|
||||
loader.lazyRequireGetter(this, "CssLogic", "devtools/server/css-logic", true);
|
||||
loader.lazyRequireGetter(this, "findCssSelector", "devtools/shared/inspector/css-logic", true);
|
||||
loader.lazyRequireGetter(this, "mapURIToAddonID", "devtools/server/actors/utils/map-uri-to-addon-id");
|
||||
loader.lazyRequireGetter(this, "BreakpointActor", "devtools/server/actors/breakpoint", true);
|
||||
loader.lazyRequireGetter(this, "setBreakpointAtEntryPoints", "devtools/server/actors/breakpoint", true);
|
||||
loader.lazyRequireGetter(this, "getSourceURL", "devtools/server/actors/source", true);
|
||||
loader.lazyRequireGetter(this, "EnvironmentActor", "devtools/server/actors/environment", true);
|
||||
loader.lazyRequireGetter(this, "SourceActorStore", "devtools/server/actors/utils/source-actor-store", true);
|
||||
loader.lazyRequireGetter(this, "BreakpointActorMap", "devtools/server/actors/utils/breakpoint-actor-map", true);
|
||||
loader.lazyRequireGetter(this, "PauseScopedObjectActor", "devtools/server/actors/pause-scoped", true);
|
||||
loader.lazyRequireGetter(this, "EventLoopStack", "devtools/server/actors/utils/event-loop", true);
|
||||
loader.lazyRequireGetter(this, "FrameActor", "devtools/server/actors/frame", true);
|
||||
loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
|
||||
|
||||
/**
|
||||
* A BreakpointActorMap is a map from locations to instances of BreakpointActor.
|
||||
*/
|
||||
function BreakpointActorMap() {
|
||||
this._size = 0;
|
||||
this._actors = {};
|
||||
}
|
||||
|
||||
BreakpointActorMap.prototype = {
|
||||
/**
|
||||
* Return the number of BreakpointActors in this BreakpointActorMap.
|
||||
*
|
||||
* @returns Number
|
||||
* The number of BreakpointActor in this BreakpointActorMap.
|
||||
*/
|
||||
get size() {
|
||||
return this._size;
|
||||
},
|
||||
|
||||
/**
|
||||
* Generate all BreakpointActors that match the given location in
|
||||
* this BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location for which matching BreakpointActors should be generated.
|
||||
*/
|
||||
findActors: function* (location = new OriginalLocation()) {
|
||||
// Fast shortcut for when we know we won't find any actors. Surprisingly
|
||||
// enough, this speeds up refreshing when there are no breakpoints set by
|
||||
// about 2x!
|
||||
if (this.size === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
function* findKeys(obj, key) {
|
||||
if (key !== undefined) {
|
||||
if (key in obj) {
|
||||
yield key;
|
||||
}
|
||||
} else {
|
||||
for (key of Object.keys(obj)) {
|
||||
yield key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let query = {
|
||||
sourceActorID: location.originalSourceActor
|
||||
? location.originalSourceActor.actorID
|
||||
: undefined,
|
||||
line: location.originalLine,
|
||||
};
|
||||
|
||||
// If location contains a line, assume we are searching for a whole line
|
||||
// breakpoint, and set begin/endColumn accordingly. Otherwise, we are
|
||||
// searching for all breakpoints, so begin/endColumn should be left unset.
|
||||
if (location.originalLine) {
|
||||
query.beginColumn = location.originalColumn ? location.originalColumn : 0;
|
||||
query.endColumn = location.originalColumn ? location.originalColumn + 1 : Infinity;
|
||||
} else {
|
||||
query.beginColumn = location.originalColumn ? query.originalColumn : undefined;
|
||||
query.endColumn = location.originalColumn ? query.originalColumn + 1 : undefined;
|
||||
}
|
||||
|
||||
for (let sourceActorID of findKeys(this._actors, query.sourceActorID)) {
|
||||
let actor = this._actors[sourceActorID];
|
||||
for (let line of findKeys(actor, query.line)) {
|
||||
for (let beginColumn of findKeys(actor[line], query.beginColumn)) {
|
||||
for (let endColumn of findKeys(actor[line][beginColumn],
|
||||
query.endColumn)) {
|
||||
yield actor[line][beginColumn][endColumn];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Return the BreakpointActor at the given location in this
|
||||
* BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location for which the BreakpointActor should be returned.
|
||||
*
|
||||
* @returns BreakpointActor actor
|
||||
* The BreakpointActor at the given location.
|
||||
*/
|
||||
getActor: function (originalLocation) {
|
||||
for (let actor of this.findActors(originalLocation)) {
|
||||
return actor;
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the given BreakpointActor to the given location in this
|
||||
* BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location to which the given BreakpointActor should be set.
|
||||
*
|
||||
* @param BreakpointActor actor
|
||||
* The BreakpointActor to be set to the given location.
|
||||
*/
|
||||
setActor: function (location, actor) {
|
||||
let { originalSourceActor, originalLine, originalColumn } = location;
|
||||
|
||||
let sourceActorID = originalSourceActor.actorID;
|
||||
let line = originalLine;
|
||||
let beginColumn = originalColumn ? originalColumn : 0;
|
||||
let endColumn = originalColumn ? originalColumn + 1 : Infinity;
|
||||
|
||||
if (!this._actors[sourceActorID]) {
|
||||
this._actors[sourceActorID] = [];
|
||||
}
|
||||
if (!this._actors[sourceActorID][line]) {
|
||||
this._actors[sourceActorID][line] = [];
|
||||
}
|
||||
if (!this._actors[sourceActorID][line][beginColumn]) {
|
||||
this._actors[sourceActorID][line][beginColumn] = [];
|
||||
}
|
||||
if (!this._actors[sourceActorID][line][beginColumn][endColumn]) {
|
||||
++this._size;
|
||||
}
|
||||
this._actors[sourceActorID][line][beginColumn][endColumn] = actor;
|
||||
},
|
||||
|
||||
/**
|
||||
* Delete the BreakpointActor from the given location in this
|
||||
* BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location from which the BreakpointActor should be deleted.
|
||||
*/
|
||||
deleteActor: function (location) {
|
||||
let { originalSourceActor, originalLine, originalColumn } = location;
|
||||
|
||||
let sourceActorID = originalSourceActor.actorID;
|
||||
let line = originalLine;
|
||||
let beginColumn = originalColumn ? originalColumn : 0;
|
||||
let endColumn = originalColumn ? originalColumn + 1 : Infinity;
|
||||
|
||||
if (this._actors[sourceActorID]) {
|
||||
if (this._actors[sourceActorID][line]) {
|
||||
if (this._actors[sourceActorID][line][beginColumn]) {
|
||||
if (this._actors[sourceActorID][line][beginColumn][endColumn]) {
|
||||
--this._size;
|
||||
}
|
||||
delete this._actors[sourceActorID][line][beginColumn][endColumn];
|
||||
if (Object.keys(this._actors[sourceActorID][line][beginColumn]).length === 0) {
|
||||
delete this._actors[sourceActorID][line][beginColumn];
|
||||
}
|
||||
}
|
||||
if (Object.keys(this._actors[sourceActorID][line]).length === 0) {
|
||||
delete this._actors[sourceActorID][line];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
exports.BreakpointActorMap = BreakpointActorMap;
|
||||
|
||||
/**
|
||||
* Keeps track of persistent sources across reloads and ties different
|
||||
* source instances to the same actor id so that things like
|
||||
* breakpoints survive reloads. ThreadSources uses this to force the
|
||||
* same actorID on a SourceActor.
|
||||
*/
|
||||
function SourceActorStore() {
|
||||
// source identifier --> actor id
|
||||
this._sourceActorIds = Object.create(null);
|
||||
}
|
||||
|
||||
SourceActorStore.prototype = {
|
||||
/**
|
||||
* Lookup an existing actor id that represents this source, if available.
|
||||
*/
|
||||
getReusableActorId: function (source, originalUrl) {
|
||||
let url = this.getUniqueKey(source, originalUrl);
|
||||
if (url && url in this._sourceActorIds) {
|
||||
return this._sourceActorIds[url];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update a source with an actorID.
|
||||
*/
|
||||
setReusableActorId: function (source, originalUrl, actorID) {
|
||||
let url = this.getUniqueKey(source, originalUrl);
|
||||
if (url) {
|
||||
this._sourceActorIds[url] = actorID;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Make a unique URL from a source that identifies it across reloads.
|
||||
*/
|
||||
getUniqueKey: function (source, originalUrl) {
|
||||
if (originalUrl) {
|
||||
// Original source from a sourcemap.
|
||||
return originalUrl;
|
||||
}
|
||||
|
||||
return getSourceURL(source);
|
||||
}
|
||||
};
|
||||
|
||||
exports.SourceActorStore = SourceActorStore;
|
||||
|
||||
/**
|
||||
* Manages pushing event loops and automatically pops and exits them in the
|
||||
* correct order as they are resolved.
|
||||
*
|
||||
* @param ThreadActor thread
|
||||
* The thread actor instance that owns this EventLoopStack.
|
||||
* @param DebuggerServerConnection connection
|
||||
* The remote protocol connection associated with this event loop stack.
|
||||
* @param Object hooks
|
||||
* An object with the following properties:
|
||||
* - url: The URL string of the debuggee we are spinning an event loop
|
||||
* for.
|
||||
* - preNest: function called before entering a nested event loop
|
||||
* - postNest: function called after exiting a nested event loop
|
||||
*/
|
||||
function EventLoopStack({ thread, connection, hooks }) {
|
||||
this._hooks = hooks;
|
||||
this._thread = thread;
|
||||
this._connection = connection;
|
||||
}
|
||||
|
||||
EventLoopStack.prototype = {
|
||||
/**
|
||||
* The number of nested event loops on the stack.
|
||||
*/
|
||||
get size() {
|
||||
return xpcInspector.eventLoopNestLevel;
|
||||
},
|
||||
|
||||
/**
|
||||
* The URL of the debuggee who pushed the event loop on top of the stack.
|
||||
*/
|
||||
get lastPausedUrl() {
|
||||
let url = null;
|
||||
if (this.size > 0) {
|
||||
try {
|
||||
url = xpcInspector.lastNestRequestor.url;
|
||||
} catch (e) {
|
||||
// The tab's URL getter may throw if the tab is destroyed by the time
|
||||
// this code runs, but we don't really care at this point.
|
||||
dumpn(e);
|
||||
}
|
||||
}
|
||||
return url;
|
||||
},
|
||||
|
||||
/**
|
||||
* The DebuggerServerConnection of the debugger who pushed the event loop on
|
||||
* top of the stack
|
||||
*/
|
||||
get lastConnection() {
|
||||
return xpcInspector.lastNestRequestor._connection;
|
||||
},
|
||||
|
||||
/**
|
||||
* Push a new nested event loop onto the stack.
|
||||
*
|
||||
* @returns EventLoop
|
||||
*/
|
||||
push: function () {
|
||||
return new EventLoop({
|
||||
thread: this._thread,
|
||||
connection: this._connection,
|
||||
hooks: this._hooks
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* An object that represents a nested event loop. It is used as the nest
|
||||
* requestor with nsIJSInspector instances.
|
||||
*
|
||||
* @param ThreadActor thread
|
||||
* The thread actor that is creating this nested event loop.
|
||||
* @param DebuggerServerConnection connection
|
||||
* The remote protocol connection associated with this event loop.
|
||||
* @param Object hooks
|
||||
* The same hooks object passed into EventLoopStack during its
|
||||
* initialization.
|
||||
*/
|
||||
function EventLoop({ thread, connection, hooks }) {
|
||||
this._thread = thread;
|
||||
this._hooks = hooks;
|
||||
this._connection = connection;
|
||||
|
||||
this.enter = this.enter.bind(this);
|
||||
this.resolve = this.resolve.bind(this);
|
||||
}
|
||||
|
||||
EventLoop.prototype = {
|
||||
entered: false,
|
||||
resolved: false,
|
||||
get url() {
|
||||
return this._hooks.url;
|
||||
},
|
||||
|
||||
/**
|
||||
* Enter this nested event loop.
|
||||
*/
|
||||
enter: function () {
|
||||
let nestData = this._hooks.preNest
|
||||
? this._hooks.preNest()
|
||||
: null;
|
||||
|
||||
this.entered = true;
|
||||
xpcInspector.enterNestedEventLoop(this);
|
||||
|
||||
// Keep exiting nested event loops while the last requestor is resolved.
|
||||
if (xpcInspector.eventLoopNestLevel > 0) {
|
||||
const { resolved } = xpcInspector.lastNestRequestor;
|
||||
if (resolved) {
|
||||
xpcInspector.exitNestedEventLoop();
|
||||
}
|
||||
}
|
||||
|
||||
if (this._hooks.postNest) {
|
||||
this._hooks.postNest(nestData);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Resolve this nested event loop.
|
||||
*
|
||||
* @returns boolean
|
||||
* True if we exited this nested event loop because it was on top of
|
||||
* the stack, false if there is another nested event loop above this
|
||||
* one that hasn't resolved yet.
|
||||
*/
|
||||
resolve: function () {
|
||||
if (!this.entered) {
|
||||
throw new Error("Can't resolve an event loop before it has been entered!");
|
||||
}
|
||||
if (this.resolved) {
|
||||
throw new Error("Already resolved this nested event loop!");
|
||||
}
|
||||
this.resolved = true;
|
||||
if (this === xpcInspector.lastNestRequestor) {
|
||||
xpcInspector.exitNestedEventLoop();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* JSD2 actors.
|
||||
*/
|
||||
|
@ -2092,123 +1736,6 @@ PauseActor.prototype = {
|
|||
actorPrefix: "pause"
|
||||
};
|
||||
|
||||
/**
|
||||
* A base actor for any actors that should only respond receive messages in the
|
||||
* paused state. Subclasses may expose a `threadActor` which is used to help
|
||||
* determine when we are in a paused state. Subclasses should set their own
|
||||
* "constructor" property if they want better error messages. You should never
|
||||
* instantiate a PauseScopedActor directly, only through subclasses.
|
||||
*/
|
||||
function PauseScopedActor() {
|
||||
}
|
||||
|
||||
/**
|
||||
* A function decorator for creating methods to handle protocol messages that
|
||||
* should only be received while in the paused state.
|
||||
*
|
||||
* @param method Function
|
||||
* The function we are decorating.
|
||||
*/
|
||||
PauseScopedActor.withPaused = function (method) {
|
||||
return function () {
|
||||
if (this.isPaused()) {
|
||||
return method.apply(this, arguments);
|
||||
}
|
||||
return this._wrongState();
|
||||
};
|
||||
};
|
||||
|
||||
PauseScopedActor.prototype = {
|
||||
|
||||
/**
|
||||
* Returns true if we are in the paused state.
|
||||
*/
|
||||
isPaused: function () {
|
||||
// When there is not a ThreadActor available (like in the webconsole) we
|
||||
// have to be optimistic and assume that we are paused so that we can
|
||||
// respond to requests.
|
||||
return this.threadActor ? this.threadActor.state === "paused" : true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the wrongState response packet for this actor.
|
||||
*/
|
||||
_wrongState: function () {
|
||||
return {
|
||||
error: "wrongState",
|
||||
message: this.constructor.name +
|
||||
" actors can only be accessed while the thread is paused."
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a pause-scoped actor for the specified object.
|
||||
* @see ObjectActor
|
||||
*/
|
||||
function PauseScopedObjectActor(obj, hooks) {
|
||||
ObjectActor.call(this, obj, hooks);
|
||||
this.hooks.promote = hooks.promote;
|
||||
this.hooks.isThreadLifetimePool = hooks.isThreadLifetimePool;
|
||||
}
|
||||
|
||||
PauseScopedObjectActor.prototype = Object.create(PauseScopedActor.prototype);
|
||||
|
||||
Object.assign(PauseScopedObjectActor.prototype, ObjectActor.prototype);
|
||||
|
||||
Object.assign(PauseScopedObjectActor.prototype, {
|
||||
constructor: PauseScopedObjectActor,
|
||||
actorPrefix: "pausedobj",
|
||||
|
||||
onOwnPropertyNames:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onOwnPropertyNames),
|
||||
|
||||
onPrototypeAndProperties:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onPrototypeAndProperties),
|
||||
|
||||
onPrototype: PauseScopedActor.withPaused(ObjectActor.prototype.onPrototype),
|
||||
onProperty: PauseScopedActor.withPaused(ObjectActor.prototype.onProperty),
|
||||
onDecompile: PauseScopedActor.withPaused(ObjectActor.prototype.onDecompile),
|
||||
|
||||
onDisplayString:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onDisplayString),
|
||||
|
||||
onParameterNames:
|
||||
PauseScopedActor.withPaused(ObjectActor.prototype.onParameterNames),
|
||||
|
||||
/**
|
||||
* Handle a protocol request to promote a pause-lifetime grip to a
|
||||
* thread-lifetime grip.
|
||||
*
|
||||
* @param request object
|
||||
* The protocol request object.
|
||||
*/
|
||||
onThreadGrip: PauseScopedActor.withPaused(function (request) {
|
||||
this.hooks.promote();
|
||||
return {};
|
||||
}),
|
||||
|
||||
/**
|
||||
* Handle a protocol request to release a thread-lifetime grip.
|
||||
*
|
||||
* @param request object
|
||||
* The protocol request object.
|
||||
*/
|
||||
onRelease: PauseScopedActor.withPaused(function (request) {
|
||||
if (this.hooks.isThreadLifetimePool()) {
|
||||
return { error: "notReleasable",
|
||||
message: "Only thread-lifetime actors can be released." };
|
||||
}
|
||||
|
||||
this.release();
|
||||
return {};
|
||||
}),
|
||||
});
|
||||
|
||||
Object.assign(PauseScopedObjectActor.prototype.requestTypes, {
|
||||
"threadGrip": PauseScopedObjectActor.prototype.onThreadGrip,
|
||||
});
|
||||
|
||||
function hackDebugger(Debugger) {
|
||||
// TODO: Improve native code instead of hacking on top of it
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
/* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
|
||||
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const { OriginalLocation } = require("devtools/server/actors/common");
|
||||
|
||||
/**
|
||||
* A BreakpointActorMap is a map from locations to instances of BreakpointActor.
|
||||
*/
|
||||
function BreakpointActorMap() {
|
||||
this._size = 0;
|
||||
this._actors = {};
|
||||
}
|
||||
|
||||
BreakpointActorMap.prototype = {
|
||||
/**
|
||||
* Return the number of BreakpointActors in this BreakpointActorMap.
|
||||
*
|
||||
* @returns Number
|
||||
* The number of BreakpointActor in this BreakpointActorMap.
|
||||
*/
|
||||
get size() {
|
||||
return this._size;
|
||||
},
|
||||
|
||||
/**
|
||||
* Generate all BreakpointActors that match the given location in
|
||||
* this BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location for which matching BreakpointActors should be generated.
|
||||
*/
|
||||
findActors: function* (location = new OriginalLocation()) {
|
||||
// Fast shortcut for when we know we won't find any actors. Surprisingly
|
||||
// enough, this speeds up refreshing when there are no breakpoints set by
|
||||
// about 2x!
|
||||
if (this.size === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
function* findKeys(obj, key) {
|
||||
if (key !== undefined) {
|
||||
if (key in obj) {
|
||||
yield key;
|
||||
}
|
||||
} else {
|
||||
for (key of Object.keys(obj)) {
|
||||
yield key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let query = {
|
||||
sourceActorID: location.originalSourceActor
|
||||
? location.originalSourceActor.actorID
|
||||
: undefined,
|
||||
line: location.originalLine,
|
||||
};
|
||||
|
||||
// If location contains a line, assume we are searching for a whole line
|
||||
// breakpoint, and set begin/endColumn accordingly. Otherwise, we are
|
||||
// searching for all breakpoints, so begin/endColumn should be left unset.
|
||||
if (location.originalLine) {
|
||||
query.beginColumn = location.originalColumn ? location.originalColumn : 0;
|
||||
query.endColumn = location.originalColumn ? location.originalColumn + 1 : Infinity;
|
||||
} else {
|
||||
query.beginColumn = location.originalColumn ? query.originalColumn : undefined;
|
||||
query.endColumn = location.originalColumn ? query.originalColumn + 1 : undefined;
|
||||
}
|
||||
|
||||
for (let sourceActorID of findKeys(this._actors, query.sourceActorID)) {
|
||||
let actor = this._actors[sourceActorID];
|
||||
for (let line of findKeys(actor, query.line)) {
|
||||
for (let beginColumn of findKeys(actor[line], query.beginColumn)) {
|
||||
for (let endColumn of findKeys(actor[line][beginColumn],
|
||||
query.endColumn)) {
|
||||
yield actor[line][beginColumn][endColumn];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Return the BreakpointActor at the given location in this
|
||||
* BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location for which the BreakpointActor should be returned.
|
||||
*
|
||||
* @returns BreakpointActor actor
|
||||
* The BreakpointActor at the given location.
|
||||
*/
|
||||
getActor: function (originalLocation) {
|
||||
for (let actor of this.findActors(originalLocation)) {
|
||||
return actor;
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the given BreakpointActor to the given location in this
|
||||
* BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location to which the given BreakpointActor should be set.
|
||||
*
|
||||
* @param BreakpointActor actor
|
||||
* The BreakpointActor to be set to the given location.
|
||||
*/
|
||||
setActor: function (location, actor) {
|
||||
let { originalSourceActor, originalLine, originalColumn } = location;
|
||||
|
||||
let sourceActorID = originalSourceActor.actorID;
|
||||
let line = originalLine;
|
||||
let beginColumn = originalColumn ? originalColumn : 0;
|
||||
let endColumn = originalColumn ? originalColumn + 1 : Infinity;
|
||||
|
||||
if (!this._actors[sourceActorID]) {
|
||||
this._actors[sourceActorID] = [];
|
||||
}
|
||||
if (!this._actors[sourceActorID][line]) {
|
||||
this._actors[sourceActorID][line] = [];
|
||||
}
|
||||
if (!this._actors[sourceActorID][line][beginColumn]) {
|
||||
this._actors[sourceActorID][line][beginColumn] = [];
|
||||
}
|
||||
if (!this._actors[sourceActorID][line][beginColumn][endColumn]) {
|
||||
++this._size;
|
||||
}
|
||||
this._actors[sourceActorID][line][beginColumn][endColumn] = actor;
|
||||
},
|
||||
|
||||
/**
|
||||
* Delete the BreakpointActor from the given location in this
|
||||
* BreakpointActorMap.
|
||||
*
|
||||
* @param OriginalLocation location
|
||||
* The location from which the BreakpointActor should be deleted.
|
||||
*/
|
||||
deleteActor: function (location) {
|
||||
let { originalSourceActor, originalLine, originalColumn } = location;
|
||||
|
||||
let sourceActorID = originalSourceActor.actorID;
|
||||
let line = originalLine;
|
||||
let beginColumn = originalColumn ? originalColumn : 0;
|
||||
let endColumn = originalColumn ? originalColumn + 1 : Infinity;
|
||||
|
||||
if (this._actors[sourceActorID]) {
|
||||
if (this._actors[sourceActorID][line]) {
|
||||
if (this._actors[sourceActorID][line][beginColumn]) {
|
||||
if (this._actors[sourceActorID][line][beginColumn][endColumn]) {
|
||||
--this._size;
|
||||
}
|
||||
delete this._actors[sourceActorID][line][beginColumn][endColumn];
|
||||
if (Object.keys(this._actors[sourceActorID][line][beginColumn]).length === 0) {
|
||||
delete this._actors[sourceActorID][line][beginColumn];
|
||||
}
|
||||
}
|
||||
if (Object.keys(this._actors[sourceActorID][line]).length === 0) {
|
||||
delete this._actors[sourceActorID][line];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
exports.BreakpointActorMap = BreakpointActorMap;
|
|
@ -0,0 +1,157 @@
|
|||
/* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
|
||||
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const xpcInspector = require("xpcInspector");
|
||||
const DevToolsUtils = require("devtools/shared/DevToolsUtils");
|
||||
const { dumpn } = DevToolsUtils;
|
||||
|
||||
/**
|
||||
* Manages pushing event loops and automatically pops and exits them in the
|
||||
* correct order as they are resolved.
|
||||
*
|
||||
* @param ThreadActor thread
|
||||
* The thread actor instance that owns this EventLoopStack.
|
||||
* @param DebuggerServerConnection connection
|
||||
* The remote protocol connection associated with this event loop stack.
|
||||
* @param Object hooks
|
||||
* An object with the following properties:
|
||||
* - url: The URL string of the debuggee we are spinning an event loop
|
||||
* for.
|
||||
* - preNest: function called before entering a nested event loop
|
||||
* - postNest: function called after exiting a nested event loop
|
||||
*/
|
||||
function EventLoopStack({ thread, connection, hooks }) {
|
||||
this._hooks = hooks;
|
||||
this._thread = thread;
|
||||
this._connection = connection;
|
||||
}
|
||||
|
||||
EventLoopStack.prototype = {
|
||||
/**
|
||||
* The number of nested event loops on the stack.
|
||||
*/
|
||||
get size() {
|
||||
return xpcInspector.eventLoopNestLevel;
|
||||
},
|
||||
|
||||
/**
|
||||
* The URL of the debuggee who pushed the event loop on top of the stack.
|
||||
*/
|
||||
get lastPausedUrl() {
|
||||
let url = null;
|
||||
if (this.size > 0) {
|
||||
try {
|
||||
url = xpcInspector.lastNestRequestor.url;
|
||||
} catch (e) {
|
||||
// The tab's URL getter may throw if the tab is destroyed by the time
|
||||
// this code runs, but we don't really care at this point.
|
||||
dumpn(e);
|
||||
}
|
||||
}
|
||||
return url;
|
||||
},
|
||||
|
||||
/**
|
||||
* The DebuggerServerConnection of the debugger who pushed the event loop on
|
||||
* top of the stack
|
||||
*/
|
||||
get lastConnection() {
|
||||
return xpcInspector.lastNestRequestor._connection;
|
||||
},
|
||||
|
||||
/**
|
||||
* Push a new nested event loop onto the stack.
|
||||
*
|
||||
* @returns EventLoop
|
||||
*/
|
||||
push: function () {
|
||||
return new EventLoop({
|
||||
thread: this._thread,
|
||||
connection: this._connection,
|
||||
hooks: this._hooks
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* An object that represents a nested event loop. It is used as the nest
|
||||
* requestor with nsIJSInspector instances.
|
||||
*
|
||||
* @param ThreadActor thread
|
||||
* The thread actor that is creating this nested event loop.
|
||||
* @param DebuggerServerConnection connection
|
||||
* The remote protocol connection associated with this event loop.
|
||||
* @param Object hooks
|
||||
* The same hooks object passed into EventLoopStack during its
|
||||
* initialization.
|
||||
*/
|
||||
function EventLoop({ thread, connection, hooks }) {
|
||||
this._thread = thread;
|
||||
this._hooks = hooks;
|
||||
this._connection = connection;
|
||||
|
||||
this.enter = this.enter.bind(this);
|
||||
this.resolve = this.resolve.bind(this);
|
||||
}
|
||||
|
||||
EventLoop.prototype = {
|
||||
entered: false,
|
||||
resolved: false,
|
||||
get url() {
|
||||
return this._hooks.url;
|
||||
},
|
||||
|
||||
/**
|
||||
* Enter this nested event loop.
|
||||
*/
|
||||
enter: function () {
|
||||
let nestData = this._hooks.preNest
|
||||
? this._hooks.preNest()
|
||||
: null;
|
||||
|
||||
this.entered = true;
|
||||
xpcInspector.enterNestedEventLoop(this);
|
||||
|
||||
// Keep exiting nested event loops while the last requestor is resolved.
|
||||
if (xpcInspector.eventLoopNestLevel > 0) {
|
||||
const { resolved } = xpcInspector.lastNestRequestor;
|
||||
if (resolved) {
|
||||
xpcInspector.exitNestedEventLoop();
|
||||
}
|
||||
}
|
||||
|
||||
if (this._hooks.postNest) {
|
||||
this._hooks.postNest(nestData);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Resolve this nested event loop.
|
||||
*
|
||||
* @returns boolean
|
||||
* True if we exited this nested event loop because it was on top of
|
||||
* the stack, false if there is another nested event loop above this
|
||||
* one that hasn't resolved yet.
|
||||
*/
|
||||
resolve: function () {
|
||||
if (!this.entered) {
|
||||
throw new Error("Can't resolve an event loop before it has been entered!");
|
||||
}
|
||||
if (this.resolved) {
|
||||
throw new Error("Already resolved this nested event loop!");
|
||||
}
|
||||
this.resolved = true;
|
||||
if (this === xpcInspector.lastNestRequestor) {
|
||||
xpcInspector.exitNestedEventLoop();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
};
|
||||
|
||||
exports.EventLoopStack = EventLoopStack;
|
|
@ -8,10 +8,13 @@ DevToolsModules(
|
|||
'actor-registry-utils.js',
|
||||
'audionodes.json',
|
||||
'automation-timeline.js',
|
||||
'breakpoint-actor-map.js',
|
||||
'css-grid-utils.js',
|
||||
'event-loop.js',
|
||||
'make-debugger.js',
|
||||
'map-uri-to-addon-id.js',
|
||||
'shapes-utils.js',
|
||||
'source-actor-store.js',
|
||||
'stack.js',
|
||||
'TabSources.js',
|
||||
'walker-search.js',
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
/* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
|
||||
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
loader.lazyRequireGetter(this, "getSourceURL", "devtools/server/actors/source", true);
|
||||
|
||||
/**
|
||||
* Keeps track of persistent sources across reloads and ties different
|
||||
* source instances to the same actor id so that things like
|
||||
* breakpoints survive reloads. ThreadSources uses this to force the
|
||||
* same actorID on a SourceActor.
|
||||
*/
|
||||
function SourceActorStore() {
|
||||
// source identifier --> actor id
|
||||
this._sourceActorIds = Object.create(null);
|
||||
}
|
||||
|
||||
SourceActorStore.prototype = {
|
||||
/**
|
||||
* Lookup an existing actor id that represents this source, if available.
|
||||
*/
|
||||
getReusableActorId: function (source, originalUrl) {
|
||||
let url = this.getUniqueKey(source, originalUrl);
|
||||
if (url && url in this._sourceActorIds) {
|
||||
return this._sourceActorIds[url];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update a source with an actorID.
|
||||
*/
|
||||
setReusableActorId: function (source, originalUrl, actorID) {
|
||||
let url = this.getUniqueKey(source, originalUrl);
|
||||
if (url) {
|
||||
this._sourceActorIds[url] = actorID;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Make a unique URL from a source that identifies it across reloads.
|
||||
*/
|
||||
getUniqueKey: function (source, originalUrl) {
|
||||
if (originalUrl) {
|
||||
// Original source from a sourcemap.
|
||||
return originalUrl;
|
||||
}
|
||||
|
||||
return getSourceURL(source);
|
||||
}
|
||||
};
|
||||
|
||||
exports.SourceActorStore = SourceActorStore;
|
|
@ -11,7 +11,7 @@
|
|||
const Services = require("Services");
|
||||
const { Cc, Ci, Cu } = require("chrome");
|
||||
const { DebuggerServer, ActorPool } = require("devtools/server/main");
|
||||
const { ThreadActor } = require("devtools/server/actors/script");
|
||||
const { ThreadActor } = require("devtools/server/actors/thread");
|
||||
const { ObjectActor, LongStringActor, createValueGrip, stringIsLong } = require("devtools/server/actors/object");
|
||||
const DevToolsUtils = require("devtools/shared/DevToolsUtils");
|
||||
const ErrorDocs = require("devtools/server/actors/errordocs");
|
||||
|
|
|
@ -11,7 +11,7 @@ const { ChromeActor } = require("./chrome");
|
|||
const makeDebugger = require("./utils/make-debugger");
|
||||
|
||||
loader.lazyRequireGetter(this, "mapURIToAddonID", "devtools/server/actors/utils/map-uri-to-addon-id");
|
||||
loader.lazyRequireGetter(this, "unwrapDebuggerObjectGlobal", "devtools/server/actors/script", true);
|
||||
loader.lazyRequireGetter(this, "unwrapDebuggerObjectGlobal", "devtools/server/actors/thread", true);
|
||||
loader.lazyRequireGetter(this, "ChromeUtils");
|
||||
|
||||
const FALLBACK_DOC_MESSAGE = "Your addon does not have any document opened yet.";
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
// Test the functionality of the BreakpointActorMap object.
|
||||
|
||||
const { BreakpointActorMap } = require("devtools/server/actors/script");
|
||||
const { BreakpointActorMap } = require("devtools/server/actors/utils/breakpoint-actor-map");
|
||||
|
||||
function run_test() {
|
||||
test_get_actor();
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
const { ActorPool, appendExtraActors, createExtraActors } = require("devtools/server/actors/common");
|
||||
const { RootActor } = require("devtools/server/actors/root");
|
||||
const { ThreadActor } = require("devtools/server/actors/script");
|
||||
const { ThreadActor } = require("devtools/server/actors/thread");
|
||||
const { DebuggerServer } = require("devtools/server/main");
|
||||
const { TabSources } = require("devtools/server/actors/utils/TabSources");
|
||||
const makeDebugger = require("devtools/server/actors/utils/make-debugger");
|
||||
|
|
|
@ -30,7 +30,7 @@ loadSubScript("resource://devtools/shared/worker/loader.js");
|
|||
|
||||
var defer = worker.require("devtools/shared/defer");
|
||||
var { ActorPool } = worker.require("devtools/server/actors/common");
|
||||
var { ThreadActor } = worker.require("devtools/server/actors/script");
|
||||
var { ThreadActor } = worker.require("devtools/server/actors/thread");
|
||||
var { WebConsoleActor } = worker.require("devtools/server/actors/webconsole");
|
||||
var { TabSources } = worker.require("devtools/server/actors/utils/TabSources");
|
||||
var makeDebugger = worker.require("devtools/server/actors/utils/make-debugger");
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
const { ActorPool, appendExtraActors, createExtraActors } =
|
||||
require("devtools/server/actors/common");
|
||||
const { RootActor } = require("devtools/server/actors/root");
|
||||
const { ThreadActor } = require("devtools/server/actors/script");
|
||||
const { ThreadActor } = require("devtools/server/actors/thread");
|
||||
const { DebuggerServer } = require("devtools/server/main");
|
||||
const promise = require("promise");
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ consoleService.registerListener(listener);
|
|||
* Initialize the testing debugger server.
|
||||
*/
|
||||
function initTestDebuggerServer() {
|
||||
DebuggerServer.registerModule("devtools/server/actors/script", {
|
||||
DebuggerServer.registerModule("devtools/server/actors/thread", {
|
||||
prefix: "script",
|
||||
constructor: "ScriptActor",
|
||||
type: { global: true, tab: true }
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
const { ActorPool, appendExtraActors, createExtraActors } =
|
||||
require("devtools/server/actors/common");
|
||||
const { RootActor } = require("devtools/server/actors/root");
|
||||
const { ThreadActor } = require("devtools/server/actors/script");
|
||||
const { ThreadActor } = require("devtools/server/actors/thread");
|
||||
const { DebuggerServer } = require("devtools/server/main");
|
||||
const promise = require("promise");
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "nscore.h"
|
||||
#include "nsString.h"
|
||||
#include "mozilla/Assertions.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/Move.h"
|
||||
#include "nsTArray.h"
|
||||
#include "nsISupportsImpl.h"
|
||||
|
@ -607,7 +608,7 @@ class IgnoredErrorResult :
|
|||
// so:
|
||||
//
|
||||
// foo->Bar(IgnoreErrors());
|
||||
class IgnoreErrors {
|
||||
class MOZ_TEMPORARY_CLASS IgnoreErrors {
|
||||
public:
|
||||
operator ErrorResult&() && { return mInner; }
|
||||
private:
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#ifndef _mozilla_dom_ServiceWorkerDescriptor_h
|
||||
#define _mozilla_dom_ServiceWorkerDescriptor_h
|
||||
|
||||
#include "nsString.h"
|
||||
|
||||
class nsIPrincipal;
|
||||
|
||||
namespace mozilla {
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/workerinternals/JSSettings.h"
|
||||
#include "mozilla/Mutex.h"
|
||||
#include "nsClassHashtable.h"
|
||||
#include "nsHashKeys.h"
|
||||
#include "nsTArray.h"
|
||||
|
|
|
@ -9,30 +9,13 @@
|
|||
|
||||
#include "jsapi.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
#include "mozilla/Mutex.h"
|
||||
#include "nsAutoPtr.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsString.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
#include "mozilla/dom/ServiceWorkerDescriptor.h"
|
||||
|
||||
class nsIGlobalObject;
|
||||
class nsPIDOMWindowInner;
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// If you change this, the corresponding list in nsIWorkerDebugger.idl needs to
|
||||
// be updated too.
|
||||
enum WorkerType
|
||||
{
|
||||
WorkerTypeDedicated,
|
||||
WorkerTypeShared,
|
||||
WorkerTypeService
|
||||
};
|
||||
|
||||
class WorkerPrivate;
|
||||
|
||||
namespace workers {
|
||||
|
|
|
@ -10,10 +10,8 @@
|
|||
#include "mozilla/dom/WorkerCommon.h"
|
||||
#include "mozilla/CondVar.h"
|
||||
#include "mozilla/DOMEventTargetHelper.h"
|
||||
#include "nsDOMNavigationTiming.h"
|
||||
#include "nsIContentSecurityPolicy.h"
|
||||
#include "nsIEventTarget.h"
|
||||
#include "nsThreadUtils.h"
|
||||
#include "nsTObserverArray.h"
|
||||
|
||||
#include "mozilla/dom/WorkerHolder.h"
|
||||
|
@ -31,6 +29,15 @@ class nsIThreadInternal;
|
|||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// If you change this, the corresponding list in nsIWorkerDebugger.idl needs
|
||||
// to be updated too.
|
||||
enum WorkerType
|
||||
{
|
||||
WorkerTypeDedicated,
|
||||
WorkerTypeShared,
|
||||
WorkerTypeService
|
||||
};
|
||||
|
||||
class ClientInfo;
|
||||
class ClientSource;
|
||||
class Function;
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include "nsStringFwd.h"
|
||||
#include "nsStringIterator.h"
|
||||
#include "nsStyledElement.h"
|
||||
#include "nsSubstringTuple.h"
|
||||
#include "nsUnicharUtils.h"
|
||||
|
||||
namespace mozilla {
|
||||
|
|
|
@ -67,7 +67,6 @@
|
|||
#include "nsString.h"
|
||||
#include "nsStringFwd.h"
|
||||
#include "nsStringIterator.h"
|
||||
#include "nsSubstringTuple.h"
|
||||
#include "nsTreeSanitizer.h"
|
||||
#include "nsXPCOM.h"
|
||||
#include "nscore.h"
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include "nsReadableUtils.h"
|
||||
#include "nsString.h"
|
||||
#include "nsStringFwd.h"
|
||||
#include "nsSubstringTuple.h"
|
||||
#include "nscore.h"
|
||||
#include <algorithm>
|
||||
|
||||
|
|
|
@ -53,7 +53,6 @@
|
|||
#include "nsServiceManagerUtils.h"
|
||||
#include "nsString.h"
|
||||
#include "nsStringFwd.h"
|
||||
#include "nsSubstringTuple.h"
|
||||
#include "nsTextNode.h"
|
||||
#include "nsUnicharUtils.h"
|
||||
#include "nsXPCOM.h"
|
||||
|
|
|
@ -382,14 +382,13 @@ nsDeviceContext::CreateRenderingContextCommon(bool aWantReferenceContext)
|
|||
MOZ_ASSERT(IsPrinterContext());
|
||||
MOZ_ASSERT(mWidth > 0 && mHeight > 0);
|
||||
|
||||
// This will usually be null, depending on the pref print.print_via_parent.
|
||||
RefPtr<DrawEventRecorder> recorder;
|
||||
mDeviceContextSpec->GetDrawEventRecorder(getter_AddRefs(recorder));
|
||||
|
||||
RefPtr<gfx::DrawTarget> dt;
|
||||
if (aWantReferenceContext) {
|
||||
dt = mPrintTarget->GetReferenceDrawTarget(recorder);
|
||||
dt = mPrintTarget->GetReferenceDrawTarget();
|
||||
} else {
|
||||
// This will be null if e10s is disabled or print.print_via_parent=false.
|
||||
RefPtr<DrawEventRecorder> recorder;
|
||||
mDeviceContextSpec->GetDrawEventRecorder(getter_AddRefs(recorder));
|
||||
dt = mPrintTarget->MakeDrawTarget(gfx::IntSize(mWidth, mHeight), recorder);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@ PrintTarget::PrintTarget(cairo_surface_t* aCairoSurface, const IntSize& aSize)
|
|||
, mIsFinished(false)
|
||||
#ifdef DEBUG
|
||||
, mHasActivePage(false)
|
||||
, mRecorder(nullptr)
|
||||
#endif
|
||||
|
||||
{
|
||||
|
@ -99,7 +98,7 @@ PrintTarget::MakeDrawTarget(const IntSize& aSize,
|
|||
}
|
||||
|
||||
already_AddRefed<DrawTarget>
|
||||
PrintTarget::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
||||
PrintTarget::GetReferenceDrawTarget()
|
||||
{
|
||||
if (!mRefDT) {
|
||||
const IntSize size(1, 1);
|
||||
|
@ -143,27 +142,6 @@ PrintTarget::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
|||
mRefDT = dt.forget();
|
||||
}
|
||||
|
||||
if (aRecorder) {
|
||||
if (!mRecordingRefDT) {
|
||||
RefPtr<DrawTarget> dt = CreateWrapAndRecordDrawTarget(aRecorder, mRefDT);
|
||||
if (!dt || !dt->IsValid()) {
|
||||
return nullptr;
|
||||
}
|
||||
mRecordingRefDT = dt.forget();
|
||||
#ifdef DEBUG
|
||||
mRecorder = aRecorder;
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else {
|
||||
MOZ_ASSERT(aRecorder == mRecorder,
|
||||
"Caching mRecordingRefDT assumes the aRecorder is an invariant");
|
||||
}
|
||||
#endif
|
||||
|
||||
return do_AddRef(mRecordingRefDT);
|
||||
}
|
||||
|
||||
return do_AddRef(mRefDT);
|
||||
}
|
||||
|
||||
|
|
|
@ -134,10 +134,9 @@ public:
|
|||
/**
|
||||
* Returns a reference DrawTarget. Unlike MakeDrawTarget, this method is not
|
||||
* restricted to being called between BeginPage()/EndPage() calls, and the
|
||||
* returned DrawTarget it is still valid to use after EndPage() has been
|
||||
* called.
|
||||
* returned DrawTarget is still valid to use after EndPage() has been called.
|
||||
*/
|
||||
virtual already_AddRefed<DrawTarget> GetReferenceDrawTarget(DrawEventRecorder* aRecorder);
|
||||
virtual already_AddRefed<DrawTarget> GetReferenceDrawTarget();
|
||||
|
||||
/**
|
||||
* If IsSyncPagePrinting returns true, then a user can assume the content of
|
||||
|
@ -170,18 +169,10 @@ protected:
|
|||
cairo_surface_t* mCairoSurface;
|
||||
RefPtr<DrawTarget> mRefDT; // reference DT
|
||||
|
||||
// Early on during printing we expect to be called without a recorder in
|
||||
// order to gather metrics for reflow. However, in a content process, once
|
||||
// we go on to paint we then expect to be called with a recorder. Hence why
|
||||
// we have this separate recording reference DrawTarget (which wraps mRefDT).
|
||||
RefPtr<DrawTarget> mRecordingRefDT;
|
||||
|
||||
IntSize mSize;
|
||||
bool mIsFinished;
|
||||
#ifdef DEBUG
|
||||
bool mHasActivePage;
|
||||
// owned by mRecordingRefDT, so kept alive for our entire lifetime if set:
|
||||
DrawEventRecorder* mRecorder;
|
||||
#endif
|
||||
|
||||
PageDoneCallback mPageDoneCallback;
|
||||
|
|
|
@ -34,7 +34,7 @@ public:
|
|||
virtual nsresult EndPage() final override;
|
||||
|
||||
virtual already_AddRefed<DrawTarget>
|
||||
GetReferenceDrawTarget(DrawEventRecorder* aRecorder) final override;
|
||||
GetReferenceDrawTarget() final override;
|
||||
|
||||
private:
|
||||
PrintTargetCG(PMPrintSession aPrintSession,
|
||||
|
|
|
@ -65,7 +65,7 @@ PutBytesNull(void* info, const void* buffer, size_t count)
|
|||
}
|
||||
|
||||
already_AddRefed<DrawTarget>
|
||||
PrintTargetCG::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
||||
PrintTargetCG::GetReferenceDrawTarget()
|
||||
{
|
||||
if (!mRefDT) {
|
||||
const IntSize size(1, 1);
|
||||
|
@ -97,27 +97,6 @@ PrintTargetCG::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
|||
mRefDT = dt.forget();
|
||||
}
|
||||
|
||||
if (aRecorder) {
|
||||
if (!mRecordingRefDT) {
|
||||
RefPtr<DrawTarget> dt = CreateWrapAndRecordDrawTarget(aRecorder, mRefDT);
|
||||
if (!dt || !dt->IsValid()) {
|
||||
return nullptr;
|
||||
}
|
||||
mRecordingRefDT = dt.forget();
|
||||
#ifdef DEBUG
|
||||
mRecorder = aRecorder;
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else {
|
||||
MOZ_ASSERT(aRecorder == mRecorder,
|
||||
"Caching mRecordingRefDT assumes the aRecorder is an invariant");
|
||||
}
|
||||
#endif
|
||||
|
||||
return do_AddRef(mRecordingRefDT);
|
||||
}
|
||||
|
||||
return do_AddRef(mRefDT);
|
||||
}
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ PrintTargetEMF::MakeDrawTarget(const IntSize& aSize,
|
|||
}
|
||||
|
||||
already_AddRefed<DrawTarget>
|
||||
PrintTargetEMF::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
||||
PrintTargetEMF::GetReferenceDrawTarget()
|
||||
{
|
||||
if (!mRefTarget) {
|
||||
auto dummy = MakeUnique<SkNullWStream>();
|
||||
|
@ -166,7 +166,7 @@ PrintTargetEMF::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
|||
}
|
||||
|
||||
if (!mRefDT) {
|
||||
mRefDT = mRefTarget->GetReferenceDrawTarget(aRecorder);
|
||||
mRefDT = mRefTarget->GetReferenceDrawTarget();
|
||||
}
|
||||
|
||||
return mRefDT.forget();
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
DrawEventRecorder* aRecorder = nullptr) final override;
|
||||
|
||||
already_AddRefed<DrawTarget>
|
||||
GetReferenceDrawTarget(DrawEventRecorder* aRecorder) final override;
|
||||
GetReferenceDrawTarget() final override;
|
||||
|
||||
void ConvertToEMFDone(const nsresult& aResult, mozilla::ipc::Shmem&& aEMF);
|
||||
bool IsSyncPagePrinting() const final { return false; }
|
||||
|
|
|
@ -122,7 +122,7 @@ PrintTargetSkPDF::MakeDrawTarget(const IntSize& aSize,
|
|||
}
|
||||
|
||||
already_AddRefed<DrawTarget>
|
||||
PrintTargetSkPDF::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
||||
PrintTargetSkPDF::GetReferenceDrawTarget()
|
||||
{
|
||||
if (!mRefDT) {
|
||||
SkDocument::PDFMetadata metadata;
|
||||
|
@ -145,27 +145,6 @@ PrintTargetSkPDF::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
|||
mRefDT = dt.forget();
|
||||
}
|
||||
|
||||
if (aRecorder) {
|
||||
if (!mRecordingRefDT) {
|
||||
RefPtr<DrawTarget> dt = CreateWrapAndRecordDrawTarget(aRecorder, mRefDT);
|
||||
if (!dt || !dt->IsValid()) {
|
||||
return nullptr;
|
||||
}
|
||||
mRecordingRefDT = dt.forget();
|
||||
#ifdef DEBUG
|
||||
mRecorder = aRecorder;
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else {
|
||||
MOZ_ASSERT(aRecorder == mRecorder,
|
||||
"Caching mRecordingRefDT assumes the aRecorder is an invariant");
|
||||
}
|
||||
#endif
|
||||
|
||||
return do_AddRef(mRecordingRefDT);
|
||||
}
|
||||
|
||||
return do_AddRef(mRefDT);
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ public:
|
|||
DrawEventRecorder* aRecorder = nullptr) final override;
|
||||
|
||||
virtual already_AddRefed<DrawTarget>
|
||||
GetReferenceDrawTarget(DrawEventRecorder* aRecorder) override final;
|
||||
GetReferenceDrawTarget() override final;
|
||||
|
||||
private:
|
||||
PrintTargetSkPDF(const IntSize& aSize,
|
||||
|
|
|
@ -57,7 +57,7 @@ PrintTargetThebes::MakeDrawTarget(const IntSize& aSize,
|
|||
}
|
||||
|
||||
already_AddRefed<DrawTarget>
|
||||
PrintTargetThebes::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
||||
PrintTargetThebes::GetReferenceDrawTarget()
|
||||
{
|
||||
if (!mRefDT) {
|
||||
RefPtr<gfx::DrawTarget> dt =
|
||||
|
@ -68,27 +68,6 @@ PrintTargetThebes::GetReferenceDrawTarget(DrawEventRecorder* aRecorder)
|
|||
mRefDT = dt->CreateSimilarDrawTarget(IntSize(1,1), dt->GetFormat());
|
||||
}
|
||||
|
||||
if (aRecorder) {
|
||||
if (!mRecordingRefDT) {
|
||||
RefPtr<DrawTarget> dt = CreateWrapAndRecordDrawTarget(aRecorder, mRefDT);
|
||||
if (!dt || !dt->IsValid()) {
|
||||
return nullptr;
|
||||
}
|
||||
mRecordingRefDT = dt.forget();
|
||||
#ifdef DEBUG
|
||||
mRecorder = aRecorder;
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else {
|
||||
MOZ_ASSERT(aRecorder == mRecorder,
|
||||
"Caching mRecordingRefDT assumes the aRecorder is an invariant");
|
||||
}
|
||||
#endif
|
||||
|
||||
return do_AddRef(mRecordingRefDT);
|
||||
}
|
||||
|
||||
return do_AddRef(mRefDT);
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ public:
|
|||
MakeDrawTarget(const IntSize& aSize,
|
||||
DrawEventRecorder* aRecorder = nullptr) override;
|
||||
|
||||
virtual already_AddRefed<DrawTarget> GetReferenceDrawTarget(DrawEventRecorder* aRecorder) final override;
|
||||
virtual already_AddRefed<DrawTarget> GetReferenceDrawTarget() final override;
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
@ -2028,9 +2028,11 @@ NewVarScopeData(JSContext* context, ParseContext::Scope& scope, LifoAlloc& alloc
|
|||
bool allBindingsClosedOver = pc->sc()->allBindingsClosedOver();
|
||||
|
||||
for (BindingIter bi = scope.bindings(pc); bi; bi++) {
|
||||
BindingName binding(bi.name(), allBindingsClosedOver || bi.closedOver());
|
||||
if (!vars.append(binding))
|
||||
return Nothing();
|
||||
if (bi.kind() == BindingKind::Var) {
|
||||
BindingName binding(bi.name(), allBindingsClosedOver || bi.closedOver());
|
||||
if (!vars.append(binding))
|
||||
return Nothing();
|
||||
}
|
||||
}
|
||||
|
||||
VarScope::Data* bindings = nullptr;
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
// Check that duplicate bindings are not created for let/const variables.
|
||||
|
||||
let g = newGlobal();
|
||||
let dbg = new Debugger(g);
|
||||
|
||||
g.eval(`
|
||||
function f(x, y=x) {
|
||||
let z = "Z";
|
||||
debugger;
|
||||
return x + y + z;
|
||||
}
|
||||
`);
|
||||
|
||||
let hits = 0;
|
||||
let names = [];
|
||||
|
||||
dbg.onDebuggerStatement = frame => {
|
||||
hits++;
|
||||
for (let env = frame.environment; env.type !== "object"; env = env.parent) {
|
||||
names.push(...env.names());
|
||||
}
|
||||
};
|
||||
|
||||
assertEq(g.f("X", "Y"), "XYZ");
|
||||
assertEq(hits, 1);
|
||||
assertEq(names.sort().join(", "), "arguments, x, y, z");
|
|
@ -1847,11 +1847,6 @@ AC_CHECK_FUNCS(posix_fadvise posix_fallocate)
|
|||
dnl Set various defines and substitutions
|
||||
dnl ========================================================
|
||||
|
||||
if test "$MOZ_DEBUG"; then
|
||||
AC_DEFINE(MOZ_REFLOW_PERF)
|
||||
AC_DEFINE(MOZ_REFLOW_PERF_DSP)
|
||||
fi
|
||||
|
||||
AC_SUBST(MOZ_DEV_EDITION)
|
||||
if test -n "$MOZ_DEV_EDITION"; then
|
||||
AC_DEFINE(MOZ_DEV_EDITION)
|
||||
|
|
|
@ -176,6 +176,11 @@ struct AutoSignalHandler
|
|||
# define RSP_sig(p) ((p)->uc_mcontext.gregs[29])
|
||||
# define R31_sig(p) ((p)->uc_mcontext.gregs[31])
|
||||
# endif
|
||||
# if defined(__linux__) && (defined(__sparc__) && defined(__arch64__))
|
||||
# define PC_sig(p) ((p)->uc_mcontext.mc_gregs[MC_PC])
|
||||
# define FP_sig(p) ((p)->uc_mcontext.mc_fp)
|
||||
# define SP_sig(p) ((p)->uc_mcontext.mc_i7)
|
||||
# endif
|
||||
#elif defined(__NetBSD__)
|
||||
# define XMM_sig(p,i) (((struct fxsave64*)(p)->uc_mcontext.__fpregs)->fx_xmm[i])
|
||||
# define EIP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EIP])
|
||||
|
@ -423,7 +428,7 @@ struct macos_arm_context {
|
|||
# define LR_sig(p) R31_sig(p)
|
||||
#endif
|
||||
|
||||
#if defined(FP_sig) && defined(SP_sig) && defined(SP_sig)
|
||||
#if defined(PC_sig) && defined(FP_sig) && defined(SP_sig)
|
||||
# define KNOWS_MACHINE_STATE
|
||||
#endif
|
||||
|
||||
|
|
|
@ -23,8 +23,7 @@
|
|||
#include "nsStyleStruct.h"
|
||||
|
||||
/*
|
||||
* API for Servo to access Gecko data structures. This file must compile as valid
|
||||
* C code in order for the binding generator to parse it.
|
||||
* API for Servo to access Gecko data structures.
|
||||
*
|
||||
* Functions beginning with Gecko_ are implemented in Gecko and invoked from Servo.
|
||||
* Functions beginning with Servo_ are implemented in Servo and invoked from Gecko.
|
||||
|
@ -41,7 +40,6 @@ namespace mozilla {
|
|||
class SharedFontList;
|
||||
enum class CSSPseudoElementType : uint8_t;
|
||||
struct Keyframe;
|
||||
enum Side;
|
||||
struct StyleTransition;
|
||||
namespace css {
|
||||
class ErrorReporter;
|
||||
|
|
|
@ -5,4 +5,4 @@ Makefile.in build files for the Mozilla build system.
|
|||
|
||||
The cubeb git repository is: git://github.com/kinetiknz/cubeb.git
|
||||
|
||||
The git commit ID used was 4c18a84a4573a23a1c39ccf6c70f1a6c328cb110 (2018-01-23 08:50:28 +1300)
|
||||
The git commit ID used was cc0d538c40b933a5d7d5c5bf5e05de7d51740486 (2018-02-02 18:06:40 +0100)
|
||||
|
|
|
@ -125,3 +125,51 @@ TEST(cubeb, duplex)
|
|||
|
||||
ASSERT_TRUE(stream_state.seen_audio.load());
|
||||
}
|
||||
|
||||
void device_collection_changed_callback(cubeb * context, void * user)
|
||||
{
|
||||
fprintf(stderr, "collection changed callback\n");
|
||||
ASSERT_TRUE(false) << "Error: device collection changed callback"
|
||||
" called when opening a stream";
|
||||
}
|
||||
|
||||
TEST(cubeb, duplex_collection_change)
|
||||
{
|
||||
cubeb *ctx;
|
||||
cubeb_stream *stream;
|
||||
cubeb_stream_params input_params;
|
||||
cubeb_stream_params output_params;
|
||||
int r;
|
||||
uint32_t latency_frames = 0;
|
||||
|
||||
r = common_init(&ctx, "Cubeb duplex example with collection change");
|
||||
ASSERT_EQ(r, CUBEB_OK) << "Error initializing cubeb library";
|
||||
|
||||
r = cubeb_register_device_collection_changed(ctx,
|
||||
static_cast<cubeb_device_type>(CUBEB_DEVICE_TYPE_INPUT),
|
||||
device_collection_changed_callback,
|
||||
nullptr);
|
||||
ASSERT_EQ(r, CUBEB_OK) << "Error initializing cubeb stream";
|
||||
|
||||
std::unique_ptr<cubeb, decltype(&cubeb_destroy)>
|
||||
cleanup_cubeb_at_exit(ctx, cubeb_destroy);
|
||||
|
||||
/* typical user-case: mono input, stereo output, low latency. */
|
||||
input_params.format = STREAM_FORMAT;
|
||||
input_params.rate = 48000;
|
||||
input_params.channels = 1;
|
||||
input_params.layout = CUBEB_LAYOUT_MONO;
|
||||
output_params.format = STREAM_FORMAT;
|
||||
output_params.rate = 48000;
|
||||
output_params.channels = 2;
|
||||
output_params.layout = CUBEB_LAYOUT_STEREO;
|
||||
|
||||
r = cubeb_get_min_latency(ctx, &output_params, &latency_frames);
|
||||
ASSERT_EQ(r, CUBEB_OK) << "Could not get minimal latency";
|
||||
|
||||
r = cubeb_stream_init(ctx, &stream, "Cubeb duplex",
|
||||
NULL, &input_params, NULL, &output_params,
|
||||
latency_frames, data_cb_duplex, state_cb_duplex, nullptr);
|
||||
ASSERT_EQ(r, CUBEB_OK) << "Error initializing cubeb stream";
|
||||
cubeb_stream_destroy(stream);
|
||||
}
|
||||
|
|
|
@ -32,9 +32,12 @@
|
|||
#include <algorithm>
|
||||
#include <atomic>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <sys/time.h>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000
|
||||
typedef UInt32 AudioFormatFlags;
|
||||
#endif
|
||||
|
@ -65,7 +68,7 @@ void audiounit_stream_stop_internal(cubeb_stream * stm);
|
|||
void audiounit_stream_start_internal(cubeb_stream * stm);
|
||||
static void audiounit_close_stream(cubeb_stream *stm);
|
||||
static int audiounit_setup_stream(cubeb_stream *stm);
|
||||
static std::vector<AudioObjectID>
|
||||
static vector<AudioObjectID>
|
||||
audiounit_get_devices_of_type(cubeb_device_type devtype);
|
||||
|
||||
extern cubeb_ops const audiounit_ops;
|
||||
|
@ -73,26 +76,26 @@ extern cubeb_ops const audiounit_ops;
|
|||
struct cubeb {
|
||||
cubeb_ops const * ops = &audiounit_ops;
|
||||
owned_critical_section mutex;
|
||||
std::atomic<int> active_streams{ 0 };
|
||||
atomic<int> active_streams{ 0 };
|
||||
uint32_t global_latency_frames = 0;
|
||||
cubeb_device_collection_changed_callback collection_changed_callback = nullptr;
|
||||
void * collection_changed_user_ptr = nullptr;
|
||||
/* Differentiate input from output devices. */
|
||||
cubeb_device_type collection_changed_devtype = CUBEB_DEVICE_TYPE_UNKNOWN;
|
||||
std::vector<AudioObjectID> devtype_device_array;
|
||||
vector<AudioObjectID> devtype_device_array;
|
||||
// The queue is asynchronously deallocated once all references to it are released
|
||||
dispatch_queue_t serial_queue = dispatch_queue_create(DISPATCH_QUEUE_LABEL, DISPATCH_QUEUE_SERIAL);
|
||||
// Current used channel layout
|
||||
std::atomic<cubeb_channel_layout> layout{ CUBEB_LAYOUT_UNDEFINED };
|
||||
atomic<cubeb_channel_layout> layout{ CUBEB_LAYOUT_UNDEFINED };
|
||||
};
|
||||
|
||||
static std::unique_ptr<AudioChannelLayout, decltype(&free)>
|
||||
static unique_ptr<AudioChannelLayout, decltype(&free)>
|
||||
make_sized_audio_channel_layout(size_t sz)
|
||||
{
|
||||
assert(sz >= sizeof(AudioChannelLayout));
|
||||
AudioChannelLayout * acl = reinterpret_cast<AudioChannelLayout *>(calloc(1, sz));
|
||||
assert(acl); // Assert the allocation works.
|
||||
return std::unique_ptr<AudioChannelLayout, decltype(&free)>(acl, free);
|
||||
return unique_ptr<AudioChannelLayout, decltype(&free)>(acl, free);
|
||||
}
|
||||
|
||||
enum io_side {
|
||||
|
@ -156,33 +159,33 @@ struct cubeb_stream {
|
|||
owned_critical_section mutex;
|
||||
/* Hold the input samples in every
|
||||
* input callback iteration */
|
||||
std::unique_ptr<auto_array_wrapper> input_linear_buffer;
|
||||
unique_ptr<auto_array_wrapper> input_linear_buffer;
|
||||
owned_critical_section input_linear_buffer_lock;
|
||||
// After the resampling some input data remains stored inside
|
||||
// the resampler. This number is used in order to calculate
|
||||
// the number of extra silence frames in input.
|
||||
std::atomic<uint32_t> available_input_frames{ 0 };
|
||||
atomic<uint32_t> available_input_frames{ 0 };
|
||||
/* Frames on input buffer */
|
||||
std::atomic<uint32_t> input_buffer_frames{ 0 };
|
||||
atomic<uint32_t> input_buffer_frames{ 0 };
|
||||
/* Frame counters */
|
||||
std::atomic<uint64_t> frames_played{ 0 };
|
||||
atomic<uint64_t> frames_played{ 0 };
|
||||
uint64_t frames_queued = 0;
|
||||
std::atomic<int64_t> frames_read{ 0 };
|
||||
std::atomic<bool> shutdown{ true };
|
||||
std::atomic<bool> draining{ false };
|
||||
atomic<int64_t> frames_read{ 0 };
|
||||
atomic<bool> shutdown{ true };
|
||||
atomic<bool> draining{ false };
|
||||
/* Latency requested by the user. */
|
||||
uint32_t latency_frames = 0;
|
||||
std::atomic<uint64_t> current_latency_frames{ 0 };
|
||||
atomic<uint64_t> current_latency_frames{ 0 };
|
||||
uint64_t hw_latency_frames = UINT64_MAX;
|
||||
std::atomic<float> panning{ 0 };
|
||||
std::unique_ptr<cubeb_resampler, decltype(&cubeb_resampler_destroy)> resampler;
|
||||
atomic<float> panning{ 0 };
|
||||
unique_ptr<cubeb_resampler, decltype(&cubeb_resampler_destroy)> resampler;
|
||||
/* This is true if a device change callback is currently running. */
|
||||
std::atomic<bool> switching_device{ false };
|
||||
std::atomic<bool> buffer_size_change_state{ false };
|
||||
atomic<bool> switching_device{ false };
|
||||
atomic<bool> buffer_size_change_state{ false };
|
||||
AudioDeviceID aggregate_device_id = 0; // the aggregate device id
|
||||
AudioObjectID plugin_id = 0; // used to create aggregate device
|
||||
/* Mixer interface */
|
||||
std::unique_ptr<cubeb_mixer, decltype(&cubeb_mixer_destroy)> mixer;
|
||||
unique_ptr<cubeb_mixer, decltype(&cubeb_mixer_destroy)> mixer;
|
||||
};
|
||||
|
||||
bool has_input(cubeb_stream * stm)
|
||||
|
@ -414,7 +417,8 @@ audiounit_mix_output_buffer(cubeb_stream * stm,
|
|||
stm->output_stream_params.format,
|
||||
stm->output_stream_params.rate,
|
||||
CUBEB_CHANNEL_LAYOUT_MAPS[stm->context->layout].channels,
|
||||
stm->context->layout
|
||||
stm->context->layout,
|
||||
CUBEB_STREAM_PREF_NONE
|
||||
};
|
||||
|
||||
// The downmixing(from 5.1) supports in-place conversion, so we can use
|
||||
|
@ -526,7 +530,7 @@ audiounit_output_callback(void * user_ptr,
|
|||
|
||||
AudioFormatFlags outaff = stm->output_desc.mFormatFlags;
|
||||
float panning = (stm->output_desc.mChannelsPerFrame == 2) ?
|
||||
stm->panning.load(std::memory_order_relaxed) : 0.0f;
|
||||
stm->panning.load(memory_order_relaxed) : 0.0f;
|
||||
|
||||
/* Post process output samples. */
|
||||
if (stm->draining) {
|
||||
|
@ -1065,7 +1069,7 @@ audiounit_get_min_latency(cubeb * /* ctx */,
|
|||
return CUBEB_ERROR;
|
||||
}
|
||||
|
||||
*latency_frames = std::max<uint32_t>(latency_range.mMinimum,
|
||||
*latency_frames = max<uint32_t>(latency_range.mMinimum,
|
||||
SAFE_MIN_LATENCY_FRAMES);
|
||||
#endif
|
||||
|
||||
|
@ -1409,10 +1413,10 @@ audiounit_layout_init(cubeb_stream * stm, io_side side)
|
|||
stm->context->layout = audiounit_get_current_channel_layout(stm->output_unit);
|
||||
}
|
||||
|
||||
static std::vector<AudioObjectID>
|
||||
static vector<AudioObjectID>
|
||||
audiounit_get_sub_devices(AudioDeviceID device_id)
|
||||
{
|
||||
std::vector<AudioDeviceID> sub_devices;
|
||||
vector<AudioDeviceID> sub_devices;
|
||||
AudioObjectPropertyAddress property_address = { kAudioAggregateDevicePropertyActiveSubDeviceList,
|
||||
kAudioObjectPropertyScopeGlobal,
|
||||
kAudioObjectPropertyElementMaster };
|
||||
|
@ -1551,8 +1555,8 @@ audiounit_set_aggregate_sub_device_list(AudioDeviceID aggregate_device_id,
|
|||
{
|
||||
LOG("Add devices input %u and output %u into aggregate device %u",
|
||||
input_device_id, output_device_id, aggregate_device_id);
|
||||
const std::vector<AudioDeviceID> output_sub_devices = audiounit_get_sub_devices(output_device_id);
|
||||
const std::vector<AudioDeviceID> input_sub_devices = audiounit_get_sub_devices(input_device_id);
|
||||
const vector<AudioDeviceID> output_sub_devices = audiounit_get_sub_devices(output_device_id);
|
||||
const vector<AudioDeviceID> input_sub_devices = audiounit_get_sub_devices(input_device_id);
|
||||
|
||||
CFMutableArrayRef aggregate_sub_devices_array = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
|
||||
/* The order of the items in the array is significant and is used to determine the order of the streams
|
||||
|
@ -1603,7 +1607,7 @@ audiounit_set_master_aggregate_device(const AudioDeviceID aggregate_device_id)
|
|||
|
||||
// Master become the 1st output sub device
|
||||
AudioDeviceID output_device_id = audiounit_get_default_device_id(CUBEB_DEVICE_TYPE_OUTPUT);
|
||||
const std::vector<AudioDeviceID> output_sub_devices = audiounit_get_sub_devices(output_device_id);
|
||||
const vector<AudioDeviceID> output_sub_devices = audiounit_get_sub_devices(output_device_id);
|
||||
CFStringRef master_sub_device = get_device_name(output_sub_devices[0]);
|
||||
|
||||
UInt32 size = sizeof(CFStringRef);
|
||||
|
@ -1964,7 +1968,7 @@ audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames)
|
|||
// For the 1st stream set anything within safe min-max
|
||||
assert(stm->context->active_streams > 0);
|
||||
if (stm->context->active_streams == 1) {
|
||||
return std::max(std::min<uint32_t>(latency_frames, SAFE_MAX_LATENCY_FRAMES),
|
||||
return max(min<uint32_t>(latency_frames, SAFE_MAX_LATENCY_FRAMES),
|
||||
SAFE_MIN_LATENCY_FRAMES);
|
||||
}
|
||||
assert(stm->output_unit);
|
||||
|
@ -1986,7 +1990,7 @@ audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames)
|
|||
return 0;
|
||||
}
|
||||
|
||||
output_buffer_size = std::max(std::min<uint32_t>(output_buffer_size, SAFE_MAX_LATENCY_FRAMES),
|
||||
output_buffer_size = max(min<uint32_t>(output_buffer_size, SAFE_MAX_LATENCY_FRAMES),
|
||||
SAFE_MIN_LATENCY_FRAMES);
|
||||
}
|
||||
|
||||
|
@ -2003,14 +2007,14 @@ audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames)
|
|||
return 0;
|
||||
}
|
||||
|
||||
input_buffer_size = std::max(std::min<uint32_t>(input_buffer_size, SAFE_MAX_LATENCY_FRAMES),
|
||||
input_buffer_size = max(min<uint32_t>(input_buffer_size, SAFE_MAX_LATENCY_FRAMES),
|
||||
SAFE_MIN_LATENCY_FRAMES);
|
||||
}
|
||||
|
||||
// Every following active streams can only set smaller latency
|
||||
UInt32 upper_latency_limit = 0;
|
||||
if (input_buffer_size != 0 && output_buffer_size != 0) {
|
||||
upper_latency_limit = std::min<uint32_t>(input_buffer_size, output_buffer_size);
|
||||
upper_latency_limit = min<uint32_t>(input_buffer_size, output_buffer_size);
|
||||
} else if (input_buffer_size != 0) {
|
||||
upper_latency_limit = input_buffer_size;
|
||||
} else if (output_buffer_size != 0) {
|
||||
|
@ -2019,7 +2023,7 @@ audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames)
|
|||
upper_latency_limit = SAFE_MAX_LATENCY_FRAMES;
|
||||
}
|
||||
|
||||
return std::max(std::min<uint32_t>(latency_frames, upper_latency_limit),
|
||||
return max(min<uint32_t>(latency_frames, upper_latency_limit),
|
||||
SAFE_MIN_LATENCY_FRAMES);
|
||||
}
|
||||
|
||||
|
@ -2565,8 +2569,8 @@ audiounit_stream_init(cubeb * context,
|
|||
cubeb_state_callback state_callback,
|
||||
void * user_ptr)
|
||||
{
|
||||
std::unique_ptr<cubeb_stream, decltype(&audiounit_stream_destroy)> stm(new cubeb_stream(context),
|
||||
audiounit_stream_destroy);
|
||||
unique_ptr<cubeb_stream, decltype(&audiounit_stream_destroy)> stm(new cubeb_stream(context),
|
||||
audiounit_stream_destroy);
|
||||
context->active_streams += 1;
|
||||
int r;
|
||||
|
||||
|
@ -2669,19 +2673,20 @@ audiounit_stream_destroy(cubeb_stream * stm)
|
|||
LOG("(%p) Could not uninstall all device change listeners", stm);
|
||||
}
|
||||
|
||||
auto_lock context_lock(stm->context->mutex);
|
||||
audiounit_stream_stop_internal(stm);
|
||||
{
|
||||
auto_lock context_lock(stm->context->mutex);
|
||||
audiounit_stream_stop_internal(stm);
|
||||
}
|
||||
|
||||
// Execute close in serial queue to avoid collision
|
||||
// with reinit when un/plug devices
|
||||
dispatch_sync(stm->context->serial_queue, ^() {
|
||||
auto_lock lock(stm->mutex);
|
||||
audiounit_close_stream(stm);
|
||||
assert(stm->context->active_streams >= 1);
|
||||
stm->context->active_streams -= 1;
|
||||
});
|
||||
|
||||
assert(stm->context->active_streams >= 1);
|
||||
stm->context->active_streams -= 1;
|
||||
|
||||
LOG("Cubeb stream (%p) destroyed successful.", stm);
|
||||
delete stm;
|
||||
}
|
||||
|
@ -2868,7 +2873,7 @@ int audiounit_stream_set_panning(cubeb_stream * stm, float panning)
|
|||
return CUBEB_ERROR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
stm->panning.store(panning, std::memory_order_relaxed);
|
||||
stm->panning.store(panning, memory_order_relaxed);
|
||||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
|
@ -3049,7 +3054,7 @@ audiounit_get_available_samplerate(AudioObjectID devid, AudioObjectPropertyScope
|
|||
if (AudioObjectHasProperty(devid, &adr) &&
|
||||
AudioObjectGetPropertyDataSize(devid, &adr, 0, NULL, &size) == noErr) {
|
||||
uint32_t count = size / sizeof(AudioValueRange);
|
||||
std::vector<AudioValueRange> ranges(count);
|
||||
vector<AudioValueRange> ranges(count);
|
||||
range.mMinimum = 9999999999.0;
|
||||
range.mMaximum = 0.0;
|
||||
if (AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, ranges.data()) == noErr) {
|
||||
|
@ -3150,8 +3155,16 @@ audiounit_create_device_from_hwdev(cubeb_device_info * ret, AudioObjectID devid,
|
|||
}
|
||||
}
|
||||
|
||||
ret->friendly_name = audiounit_strref_to_cstr_utf8(str);
|
||||
CFRelease(str);
|
||||
if (str) {
|
||||
ret->friendly_name = audiounit_strref_to_cstr_utf8(str);
|
||||
CFRelease(str);
|
||||
} else {
|
||||
// Couldn't get a friendly_name, nor a datasource name, return a valid
|
||||
// string of length 0.
|
||||
char * fallback_name = new char[1];
|
||||
fallback_name[0] = '\0';
|
||||
ret->friendly_name = fallback_name;
|
||||
}
|
||||
}
|
||||
|
||||
size = sizeof(CFStringRef);
|
||||
|
@ -3191,6 +3204,7 @@ audiounit_create_device_from_hwdev(cubeb_device_info * ret, AudioObjectID devid,
|
|||
bool
|
||||
is_aggregate_device(cubeb_device_info * device_info)
|
||||
{
|
||||
assert(device_info->friendly_name);
|
||||
return !strncmp(device_info->friendly_name, PRIVATE_AGGREGATE_DEVICE_NAME,
|
||||
strlen(PRIVATE_AGGREGATE_DEVICE_NAME));
|
||||
}
|
||||
|
@ -3199,8 +3213,8 @@ static int
|
|||
audiounit_enumerate_devices(cubeb * /* context */, cubeb_device_type type,
|
||||
cubeb_device_collection * collection)
|
||||
{
|
||||
std::vector<AudioObjectID> input_devs;
|
||||
std::vector<AudioObjectID> output_devs;
|
||||
vector<AudioObjectID> input_devs;
|
||||
vector<AudioObjectID> output_devs;
|
||||
|
||||
// Count number of input and output devices. This is not
|
||||
// necessarily the same as the count of raw devices supported by the
|
||||
|
@ -3265,7 +3279,7 @@ audiounit_device_collection_destroy(cubeb * /* context */,
|
|||
return CUBEB_OK;
|
||||
}
|
||||
|
||||
static std::vector<AudioObjectID>
|
||||
static vector<AudioObjectID>
|
||||
audiounit_get_devices_of_type(cubeb_device_type devtype)
|
||||
{
|
||||
AudioObjectPropertyAddress adr = { kAudioHardwarePropertyDevices,
|
||||
|
@ -3274,18 +3288,18 @@ audiounit_get_devices_of_type(cubeb_device_type devtype)
|
|||
UInt32 size = 0;
|
||||
OSStatus ret = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &adr, 0, NULL, &size);
|
||||
if (ret != noErr) {
|
||||
return std::vector<AudioObjectID>();
|
||||
return vector<AudioObjectID>();
|
||||
}
|
||||
/* Total number of input and output devices. */
|
||||
uint32_t count = (uint32_t)(size / sizeof(AudioObjectID));
|
||||
|
||||
std::vector<AudioObjectID> devices(count);
|
||||
vector<AudioObjectID> devices(count);
|
||||
ret = AudioObjectGetPropertyData(kAudioObjectSystemObject, &adr, 0, NULL, &size, devices.data());
|
||||
if (ret != noErr) {
|
||||
return std::vector<AudioObjectID>();
|
||||
return vector<AudioObjectID>();
|
||||
}
|
||||
/* Expected sorted but did not find anything in the docs. */
|
||||
std::sort(devices.begin(), devices.end(), [](AudioObjectID a, AudioObjectID b) {
|
||||
sort(devices.begin(), devices.end(), [](AudioObjectID a, AudioObjectID b) {
|
||||
return a < b;
|
||||
});
|
||||
|
||||
|
@ -3297,7 +3311,7 @@ audiounit_get_devices_of_type(cubeb_device_type devtype)
|
|||
kAudioDevicePropertyScopeInput :
|
||||
kAudioDevicePropertyScopeOutput;
|
||||
|
||||
std::vector<AudioObjectID> devices_in_scope;
|
||||
vector<AudioObjectID> devices_in_scope;
|
||||
for (uint32_t i = 0; i < count; ++i) {
|
||||
/* For device in the given scope channel must be > 0. */
|
||||
if (audiounit_get_channel_count(devices[i], scope) > 0) {
|
||||
|
@ -3315,27 +3329,58 @@ audiounit_collection_changed_callback(AudioObjectID /* inObjectID */,
|
|||
void * inClientData)
|
||||
{
|
||||
cubeb * context = static_cast<cubeb *>(inClientData);
|
||||
auto_lock lock(context->mutex);
|
||||
|
||||
if (context->collection_changed_callback == NULL) {
|
||||
/* Listener removed while waiting in mutex, abort. */
|
||||
return noErr;
|
||||
}
|
||||
|
||||
/* Differentiate input from output changes. */
|
||||
if (context->collection_changed_devtype == CUBEB_DEVICE_TYPE_INPUT ||
|
||||
context->collection_changed_devtype == CUBEB_DEVICE_TYPE_OUTPUT) {
|
||||
std::vector<AudioObjectID> devices = audiounit_get_devices_of_type(context->collection_changed_devtype);
|
||||
/* When count is the same examine the devid for the case of coalescing. */
|
||||
if (context->devtype_device_array == devices) {
|
||||
/* Device changed for the other scope, ignore. */
|
||||
return noErr;
|
||||
// This can be called from inside an AudioUnit function, dispatch to another queue.
|
||||
dispatch_async(context->serial_queue, ^() {
|
||||
auto_lock lock(context->mutex);
|
||||
if (context->collection_changed_callback == NULL) {
|
||||
/* Listener removed while waiting in mutex, abort. */
|
||||
return;
|
||||
}
|
||||
/* Device on desired scope changed. */
|
||||
context->devtype_device_array = devices;
|
||||
}
|
||||
|
||||
context->collection_changed_callback(context, context->collection_changed_user_ptr);
|
||||
/* Differentiate input from output changes. */
|
||||
if (context->collection_changed_devtype == CUBEB_DEVICE_TYPE_INPUT ||
|
||||
context->collection_changed_devtype == CUBEB_DEVICE_TYPE_OUTPUT) {
|
||||
vector<AudioObjectID> devices = audiounit_get_devices_of_type(context->collection_changed_devtype);
|
||||
/* When count is the same examine the devid for the case of coalescing. */
|
||||
if (context->devtype_device_array == devices) {
|
||||
/* Device changed for the other scope, ignore. */
|
||||
return;
|
||||
} else {
|
||||
/* Also don't trigger the user callback if the new added device is private
|
||||
* aggregate device: compute the set of new devices, and remove those
|
||||
* with the name of our private aggregate devices. */
|
||||
set<AudioObjectID> current_devices(devices.begin(), devices.end());
|
||||
set<AudioObjectID> previous_devices(context->devtype_device_array.begin(),
|
||||
context->devtype_device_array.end());
|
||||
set<AudioObjectID> new_devices;
|
||||
set_difference(current_devices.begin(), current_devices.end(),
|
||||
previous_devices.begin(), previous_devices.end(),
|
||||
inserter(new_devices, new_devices.begin()));
|
||||
|
||||
for (auto it = new_devices.begin(); it != new_devices.end();) {
|
||||
CFStringRef name = get_device_name(*it);
|
||||
if (CFStringFind(name, CFSTR("CubebAggregateDevice"), 0).location !=
|
||||
kCFNotFound) {
|
||||
it = new_devices.erase(it);
|
||||
} else {
|
||||
it++;
|
||||
}
|
||||
}
|
||||
|
||||
// If this set of new devices is empty, it means this was triggerd
|
||||
// solely by creating an aggregate device, no need to trigger the user
|
||||
// callback.
|
||||
if (new_devices.empty()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* Device on desired scope changed. */
|
||||
context->devtype_device_array = devices;
|
||||
}
|
||||
|
||||
context->collection_changed_callback(context, context->collection_changed_user_ptr);
|
||||
});
|
||||
return noErr;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ struct AlignasHelper
|
|||
* AlignedElem<N> is a structure whose alignment is guaranteed to be at least N
|
||||
* bytes.
|
||||
*
|
||||
* We support 1, 2, 4, 8, and 16-bit alignment.
|
||||
* We support 1, 2, 4, 8, and 16-byte alignment.
|
||||
*/
|
||||
template<size_t Align>
|
||||
struct AlignedElem;
|
||||
|
|
|
@ -472,6 +472,10 @@
|
|||
* class uses this class or if another class inherits from this class, then it
|
||||
* is considered to be a non-temporary class as well, although this attribute
|
||||
* need not be provided in such cases.
|
||||
* MOZ_TEMPORARY_CLASS: Applies to all classes. Any class with this annotation
|
||||
* is expected to only live in a temporary. If another class inherits from
|
||||
* this class, then it is considered to be a non-temporary class as well,
|
||||
* although this attribute need not be provided in such cases.
|
||||
* MOZ_RAII: Applies to all classes. Any class with this annotation is assumed
|
||||
* to be a RAII guard, which is expected to live on the stack in an automatic
|
||||
* allocation. It is prohibited from being allocated in a temporary, static
|
||||
|
@ -607,6 +611,7 @@
|
|||
# define MOZ_NONHEAP_CLASS __attribute__((annotate("moz_nonheap_class")))
|
||||
# define MOZ_HEAP_CLASS __attribute__((annotate("moz_heap_class")))
|
||||
# define MOZ_NON_TEMPORARY_CLASS __attribute__((annotate("moz_non_temporary_class")))
|
||||
# define MOZ_TEMPORARY_CLASS __attribute__((annotate("moz_temporary_class")))
|
||||
# define MOZ_TRIVIAL_CTOR_DTOR __attribute__((annotate("moz_trivial_ctor_dtor")))
|
||||
# ifdef DEBUG
|
||||
/* in debug builds, these classes do have non-trivial constructors. */
|
||||
|
@ -663,6 +668,7 @@
|
|||
# define MOZ_NONHEAP_CLASS /* nothing */
|
||||
# define MOZ_HEAP_CLASS /* nothing */
|
||||
# define MOZ_NON_TEMPORARY_CLASS /* nothing */
|
||||
# define MOZ_TEMPORARY_CLASS /* nothing */
|
||||
# define MOZ_TRIVIAL_CTOR_DTOR /* nothing */
|
||||
# define MOZ_ONLY_USED_TO_AVOID_STATIC_CONSTRUCTORS /* nothing */
|
||||
# define MOZ_IMPLICIT /* nothing */
|
||||
|
|
|
@ -84,6 +84,9 @@ pref("browser.cache.offline.enable", true);
|
|||
pref("browser.cache.offline.capacity", 5120); // kilobytes
|
||||
pref("offline-apps.quota.warn", 1024); // kilobytes
|
||||
|
||||
// Automatically shrink-to-fit image documents.
|
||||
pref("browser.enable_automatic_image_resizing", true);
|
||||
|
||||
// cache compression turned off for now - see bug #715198
|
||||
pref("browser.cache.compression_level", 0);
|
||||
|
||||
|
|
|
@ -4715,10 +4715,6 @@ Tab.prototype = {
|
|||
BrowserApp.contentDocumentChanged();
|
||||
}
|
||||
this.contentDocumentIsDisplayed = true;
|
||||
|
||||
if (contentDocument instanceof Ci.nsIImageDocument) {
|
||||
contentDocument.shrinkToFit();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -33,9 +33,6 @@ elif [ ! -f /etc/redhat-release ] || [ "$(< /etc/redhat-release)" != "CentOS rel
|
|||
HOST_CXX="$topsrcdir/gcc/bin/g++"
|
||||
fi
|
||||
|
||||
ANDROID_NDK_VERSION="r10e"
|
||||
ANDROID_NDK_VERSION_32BIT="r8c"
|
||||
|
||||
# Build Fennec
|
||||
ac_add_options --enable-application=mobile/android
|
||||
ac_add_options --with-android-sdk="$topsrcdir/android-sdk-linux"
|
||||
|
|
|
@ -1162,4 +1162,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
|||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1525979905534000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1526066279722000);
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -8,7 +8,7 @@
|
|||
/*****************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
const PRTime gPreloadListExpirationTime = INT64_C(1528399093845000);
|
||||
const PRTime gPreloadListExpirationTime = INT64_C(1528485467104000);
|
||||
%%
|
||||
0-1.party, 1
|
||||
0.me.uk, 1
|
||||
|
@ -127,6 +127,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1528399093845000);
|
|||
11scc.com, 1
|
||||
11thstreetcoffee.com, 1
|
||||
11urss.com, 1
|
||||
1212873467.rsc.cdn77.org, 1
|
||||
1218641649.rsc.cdn77.org, 1
|
||||
123comparer.fr, 1
|
||||
123djdrop.com, 1
|
||||
|
@ -540,7 +541,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1528399093845000);
|
|||
91travel.info, 1
|
||||
92url.com, 1
|
||||
9449-27a1-22a1-e0d9-4237-dd99-e75e-ac85-2f47-9d34.de, 1
|
||||
94cs.cn, 0
|
||||
9500years.com, 1
|
||||
9617818.com, 1
|
||||
9617818.net, 1
|
||||
|
@ -1410,6 +1410,7 @@ alinasmusicstudio.com, 1
|
|||
alinode.com, 1
|
||||
alisonisrealestate.com, 1
|
||||
alisonlitchfield.com, 1
|
||||
alistairstowing.com, 1
|
||||
alisync.com, 1
|
||||
aliwebstore.com, 1
|
||||
alix-board.de, 1
|
||||
|
@ -1843,7 +1844,6 @@ animaemundi.be, 1
|
|||
animal-liberation.com, 1
|
||||
animal-rights.com, 1
|
||||
animalistic.io, 1
|
||||
animalnet.de, 0
|
||||
animalstropic.com, 1
|
||||
animaltesting.fr, 1
|
||||
animationsmusicales.ch, 1
|
||||
|
@ -2522,6 +2522,7 @@ athlin.de, 1
|
|||
atigerseye.com, 1
|
||||
atishchenko.com, 1
|
||||
atisoft.biz, 1
|
||||
atisoft.com.tr, 1
|
||||
atisoft.net, 1
|
||||
atisoft.net.tr, 1
|
||||
atisoft.web.tr, 1
|
||||
|
@ -2777,7 +2778,6 @@ awin.la, 1
|
|||
awk.tw, 1
|
||||
awksolutions.com, 1
|
||||
awningsaboveus.com, 1
|
||||
awomaninherprime.com, 1
|
||||
awsmdev.de, 1
|
||||
awxg.com, 1
|
||||
awxg.org, 1
|
||||
|
@ -5045,6 +5045,7 @@ buyinginvestmentproperty.com, 1
|
|||
buyingsellingflorida.com, 1
|
||||
buyjewel.shop, 1
|
||||
buymindhack.com, 1
|
||||
buynowdepot.com, 0
|
||||
buypapercheap.net, 1
|
||||
buyplussize.shop, 1
|
||||
buyprofessional.shop, 1
|
||||
|
@ -5069,7 +5070,6 @@ bwilkinson.co.uk, 1
|
|||
bws16.de, 1
|
||||
bwwb.nu, 1
|
||||
bx-n.de, 1
|
||||
bx-web.com, 1
|
||||
bxdev.me, 1
|
||||
bxp40.at, 1
|
||||
by1896.com, 1
|
||||
|
@ -6308,6 +6308,7 @@ cleanbrowsing.org, 1
|
|||
cleancode.club, 1
|
||||
cleansewellness.com, 1
|
||||
cleanstar.org, 1
|
||||
clear.ml, 1
|
||||
clearance365.co.uk, 1
|
||||
clearblueday.co.uk, 1
|
||||
clearbreezesecuritydoors.com.au, 1
|
||||
|
@ -6522,7 +6523,6 @@ coccolebenessere.it, 1
|
|||
cocinoyo.com, 1
|
||||
cock.li, 1
|
||||
cockedey.in, 1
|
||||
cocker.cc, 0
|
||||
cockerspanielamericano.com.br, 1
|
||||
cockerspanielingles.com.br, 1
|
||||
cocktail-shaken.nl, 1
|
||||
|
@ -7737,6 +7737,7 @@ darioturchetti.me, 1
|
|||
darisni.me, 1
|
||||
dark-infection.de, 1
|
||||
dark-vision.cz, 1
|
||||
darkag.ovh, 1
|
||||
darkcores.net, 1
|
||||
darkdestiny.ch, 1
|
||||
darkengine.io, 1
|
||||
|
@ -8341,7 +8342,6 @@ devzero.io, 1
|
|||
dewaard.de, 1
|
||||
dewalch.net, 1
|
||||
dewapress.com, 1
|
||||
dewebwerf.nl, 1
|
||||
dexalo.de, 1
|
||||
dezeregio.nl, 1
|
||||
dezet-ev.de, 1
|
||||
|
@ -8913,7 +8913,6 @@ dorfbrunnen.eu, 1
|
|||
doriangirod.ch, 1
|
||||
dorianharmans.nl, 1
|
||||
dorianmuthig.com, 1
|
||||
dormebebe.com.br, 1
|
||||
dormiu.com, 1
|
||||
dormiu.com.br, 1
|
||||
dorquelle.com, 1
|
||||
|
@ -9609,6 +9608,7 @@ effishiency.com, 1
|
|||
effizienta.ch, 1
|
||||
efflam.net, 1
|
||||
eft.boutique, 1
|
||||
egablo.black, 1
|
||||
egami.ch, 1
|
||||
eganassociates.com.au, 1
|
||||
egarden.it, 1
|
||||
|
@ -10497,6 +10497,7 @@ etkaddict.com, 1
|
|||
etoile-usedcars.com, 1
|
||||
etre-soi.ch, 1
|
||||
etre-vivant.fr, 1
|
||||
etrker.com, 1
|
||||
etudesbibliques.fr, 1
|
||||
etudesbibliques.net, 1
|
||||
etudesbibliques.org, 1
|
||||
|
@ -11126,6 +11127,7 @@ fengyadi.com, 1
|
|||
fengyi.tel, 1
|
||||
fenster-bank.at, 1
|
||||
fenster-bank.de, 1
|
||||
fensterbau-mutscheller.de, 1
|
||||
feras-alhajjaji.com, 1
|
||||
ferdies.co.za, 1
|
||||
fergusoncastle.com, 1
|
||||
|
@ -11457,6 +11459,7 @@ flipneus.net, 1
|
|||
fliptable.org, 1
|
||||
flirt-norden.de, 1
|
||||
flirtfaces.de, 1
|
||||
flirtycourts.com, 1
|
||||
flmortgagebank.com, 1
|
||||
floaternet.com, 1
|
||||
flocktofedora.org, 1
|
||||
|
@ -11467,7 +11470,6 @@ flood.io, 1
|
|||
flooringnightmares.com, 1
|
||||
floort.net, 0
|
||||
flopix.net, 0
|
||||
flopy.club, 1
|
||||
florence.uk.net, 1
|
||||
florenceapp.co.uk, 1
|
||||
florent-tatard.fr, 1
|
||||
|
@ -12235,7 +12237,6 @@ gambetti.fr, 1
|
|||
gambit.pro, 1
|
||||
gambitboard.com, 1
|
||||
gambitnash.co.uk, 1
|
||||
gambitnash.com, 1
|
||||
gambitprint.com, 1
|
||||
gamblersgaming.eu, 1
|
||||
game-files.net, 0
|
||||
|
@ -12527,7 +12528,6 @@ geoscope.ch, 1
|
|||
geosphereservices.com, 1
|
||||
geotab.com, 1
|
||||
geraintwhite.co.uk, 1
|
||||
gerald-zojer.com, 1
|
||||
geraldsonrealty.com, 1
|
||||
gerardobsd.com, 1
|
||||
gerardozamudio.mx, 1
|
||||
|
@ -12589,7 +12589,6 @@ getitlive.de, 1
|
|||
getitpeople.com, 1
|
||||
getmango.com, 1
|
||||
getmdl.io, 1
|
||||
getmerch.eu, 1
|
||||
getnib.com, 1
|
||||
getnikola.com, 1
|
||||
geto.ml, 1
|
||||
|
@ -12957,6 +12956,7 @@ googlesource.com, 1
|
|||
goombi.fr, 1
|
||||
goonersworld.co.uk, 1
|
||||
gootax.pro, 1
|
||||
gootlijsten.nl, 1
|
||||
goozp.com, 1
|
||||
gopher.tk, 1
|
||||
goproallaccess.com, 1
|
||||
|
@ -13427,6 +13427,7 @@ haccp.roma.it, 1
|
|||
hacettepeteknokent.com.tr, 1
|
||||
hachre.de, 1
|
||||
hack.club, 1
|
||||
hack.cz, 1
|
||||
hackademix.net, 1
|
||||
hackanders.com, 1
|
||||
hackbarth.guru, 1
|
||||
|
@ -14087,7 +14088,7 @@ hilti.kz, 0
|
|||
hilti.lv, 0
|
||||
hiltonarubabeachservices.com, 1
|
||||
hiltonhyland.com, 1
|
||||
himens.com, 0
|
||||
himens.com, 1
|
||||
hindmanfuneralhomes.com, 1
|
||||
hingle.me, 1
|
||||
hinrich.de, 1
|
||||
|
@ -14122,7 +14123,6 @@ hirevets.gov, 1
|
|||
hirezzportal.com, 1
|
||||
hirotaka.org, 1
|
||||
hirte-digital.de, 1
|
||||
hirzaconsult.ro, 1
|
||||
hisbrucker.net, 1
|
||||
hisnet.de, 1
|
||||
hispanic.dating, 1
|
||||
|
@ -15114,6 +15114,7 @@ indianaantlersupply.com, 1
|
|||
indianaffairs.gov, 0
|
||||
indiawise.co.uk, 1
|
||||
indicateurs-flash.fr, 1
|
||||
indieethos.com, 1
|
||||
indiegame.space, 1
|
||||
indievelopment.nl, 1
|
||||
indigoinflatables.com, 1
|
||||
|
@ -15439,7 +15440,6 @@ investir.ch, 1
|
|||
investor.gov, 1
|
||||
investorforms.com, 1
|
||||
investorloanshub.com, 1
|
||||
investpay.ru, 1
|
||||
invinsec.com, 1
|
||||
invioinc.com, 1
|
||||
invis.net, 1
|
||||
|
@ -16286,7 +16286,6 @@ jobtestprep.nl, 1
|
|||
jobtestprep.se, 1
|
||||
jobwinner.ch, 1
|
||||
jobzninja.com, 1
|
||||
jodel.ninja, 1
|
||||
jodlajodla.si, 1
|
||||
joduska.me, 1
|
||||
jodyboucher.com, 1
|
||||
|
@ -17266,7 +17265,6 @@ klarmobil-empfehlen.de, 1
|
|||
klasfauseweh.de, 1
|
||||
klatschreime.de, 1
|
||||
klausbrinch.dk, 1
|
||||
klausimas.lt, 1
|
||||
klaver.it, 1
|
||||
klaw.xyz, 1
|
||||
kle.cz, 1
|
||||
|
@ -17294,7 +17292,7 @@ klimchuk.by, 1
|
|||
klimchuk.com, 1
|
||||
klingeletest.de, 1
|
||||
klinikac.co.id, 0
|
||||
klinkerstreet.com.ua, 1
|
||||
klinkerstreet.com.ua, 0
|
||||
klinknetz.de, 1
|
||||
klm-huisjes.nl, 1
|
||||
klmhouses.com, 1
|
||||
|
@ -17462,6 +17460,7 @@ korobi.io, 1
|
|||
korobkovsky.ru, 1
|
||||
korono.de, 1
|
||||
korosiprogram.hu, 1
|
||||
korp.fr, 1
|
||||
korrelzout.nl, 1
|
||||
kortgebyr.dk, 1
|
||||
koryfi.com, 1
|
||||
|
@ -17803,6 +17802,7 @@ laforetenchantee.ch, 1
|
|||
lafosseobservatoire.be, 1
|
||||
lafr4nc3.net, 1
|
||||
lafr4nc3.xyz, 1
|
||||
lag-gbr.gq, 1
|
||||
lagarderob.ru, 0
|
||||
lagazzettadigitale.it, 1
|
||||
lagerauftrag.info, 1
|
||||
|
@ -17869,7 +17869,7 @@ lang-php.com, 1
|
|||
langatang.com, 1
|
||||
langguth.io, 1
|
||||
langkahteduh.com, 1
|
||||
langly.fr, 0
|
||||
langly.fr, 1
|
||||
langstreckensaufen.de, 1
|
||||
languageterminal.com, 1
|
||||
langworth.com, 1
|
||||
|
@ -18428,6 +18428,7 @@ liduan.net, 1
|
|||
liebel.org, 1
|
||||
lieblingsholz.de, 1
|
||||
lied8.eu, 1
|
||||
liehuojun.com, 1
|
||||
lieuu.com, 1
|
||||
lifanov.com, 1
|
||||
lifebetweenlives.com.au, 1
|
||||
|
@ -18898,7 +18899,6 @@ lottosonline.com, 1
|
|||
lottospielen24.org, 0
|
||||
lotuscloud.de, 1
|
||||
lotw.de, 1
|
||||
lotz.li, 1
|
||||
lou.lt, 1
|
||||
louange-reconvilier.ch, 1
|
||||
loucanfixit.com, 1
|
||||
|
@ -19078,6 +19078,7 @@ lunidea.com, 1
|
|||
lunight.ml, 1
|
||||
lunis.net, 1
|
||||
lunix.io, 1
|
||||
lunorian.is, 1
|
||||
luoe.me, 1
|
||||
luoh.cc, 1
|
||||
luoh.me, 1
|
||||
|
@ -19914,6 +19915,7 @@ mdek.at, 1
|
|||
mdewendt.de, 1
|
||||
mdf-bis.com, 1
|
||||
mdiv.pl, 1
|
||||
mdkr.nl, 1
|
||||
mdlayher.com, 1
|
||||
mdma.net, 1
|
||||
mdmed.clinic, 1
|
||||
|
@ -20249,7 +20251,7 @@ meyash.co, 1
|
|||
meyeraviation.com, 1
|
||||
mf-fischer.de, 1
|
||||
mfen.de, 1
|
||||
mfgod.com, 0
|
||||
mfgod.com, 1
|
||||
mfiles.pl, 1
|
||||
mflodin.se, 1
|
||||
mfrsgb45.org, 1
|
||||
|
@ -20672,7 +20674,6 @@ mnedc.org, 1
|
|||
mneeb.de, 1
|
||||
mnguyen.io, 1
|
||||
mnitro.com, 1
|
||||
mnium.de, 1
|
||||
mnsure.org, 1
|
||||
mnt-tech.fr, 1
|
||||
mnt9.de, 1
|
||||
|
@ -21429,7 +21430,6 @@ myproblog.com, 1
|
|||
myptsite.com, 1
|
||||
mypup.nl, 1
|
||||
myrandomtips.com, 1
|
||||
myranicol.com, 1
|
||||
myrealestatemate.com.au, 1
|
||||
myref.net, 1
|
||||
myrekber.co.id, 1
|
||||
|
@ -22654,6 +22654,7 @@ oblikdom.ru, 1
|
|||
oblondata.io, 1
|
||||
obrienlab.com, 1
|
||||
obscur.us, 1
|
||||
observatory.se, 1
|
||||
obsidianirc.net, 1
|
||||
obsproject.com, 1
|
||||
obtima.org, 1
|
||||
|
@ -23399,7 +23400,6 @@ paio2-rec.com, 1
|
|||
paio2.com, 1
|
||||
paipuman.jp, 1
|
||||
paizinhovirgula.com, 1
|
||||
pajadam.me, 1
|
||||
pajowu.de, 1
|
||||
pajuvuo.fi, 1
|
||||
paket.ml, 1
|
||||
|
@ -24582,6 +24582,7 @@ port.im, 1
|
|||
port.social, 1
|
||||
port443.hamburg, 1
|
||||
port443.se, 1
|
||||
port67.org, 1
|
||||
port80.hamburg, 1
|
||||
portailevangelique.ca, 1
|
||||
portal.tirol.gv.at, 1
|
||||
|
@ -24755,7 +24756,6 @@ premierheart.com, 1
|
|||
premiership-predictors.co.uk, 1
|
||||
premiumweb.co.id, 1
|
||||
premiumwebdesign.it, 1
|
||||
premiumzweirad.de, 0
|
||||
prenatalgeboortekaartjes.nl, 1
|
||||
prenger.co, 1
|
||||
prepaid-cards.xyz, 1
|
||||
|
@ -24823,6 +24823,7 @@ printeknologies.com, 1
|
|||
printerleasing.be, 1
|
||||
printexpress.cloud, 1
|
||||
printf.de, 1
|
||||
printfn.com, 0
|
||||
printler.com, 1
|
||||
printmet.com, 1
|
||||
printsos.com, 1
|
||||
|
@ -24917,7 +24918,6 @@ prof.ch, 1
|
|||
profection.biz, 1
|
||||
professionalboundaries.com, 1
|
||||
professors.ee, 1
|
||||
profi-durchgangsmelder.de, 1
|
||||
profidea.cz, 1
|
||||
profile.tf, 1
|
||||
profiles.google.com, 1
|
||||
|
@ -26363,6 +26363,7 @@ roland.io, 1
|
|||
rolandkolodziej.com, 1
|
||||
rolandreed.cn, 1
|
||||
rolandszabo.com, 1
|
||||
roleplayhome.com, 1
|
||||
roligprylar.se, 1
|
||||
rollercoasteritalia.it, 1
|
||||
rollingbarge.com, 1
|
||||
|
@ -26618,6 +26619,7 @@ runreport.fr, 1
|
|||
runschrauger.com, 1
|
||||
runvs.io, 1
|
||||
ruobiyi.com, 1
|
||||
ruobr.ru, 1
|
||||
ruri.io, 1
|
||||
rus-trip.ru, 1
|
||||
rusempire.ru, 1
|
||||
|
@ -26855,7 +26857,7 @@ samsungphonegenerator.xyz, 1
|
|||
samsungxoa.com, 1
|
||||
samuelkeeley.com, 1
|
||||
samuellaulhau.fr, 1
|
||||
samui-samui.de, 1
|
||||
samui-samui.de, 0
|
||||
samuirehabcenter.com, 1
|
||||
samvanderkris.com, 1
|
||||
samwilberforce.com, 1
|
||||
|
@ -27128,7 +27130,7 @@ schokokeks.org, 1
|
|||
scholarly.com.ph, 1
|
||||
scholarly.ph, 1
|
||||
scholierenvervoerzeeland.nl, 1
|
||||
schollbox.de, 1
|
||||
schollbox.de, 0
|
||||
schont.org, 1
|
||||
school.in.th, 1
|
||||
schooli.io, 1
|
||||
|
@ -29126,6 +29128,7 @@ stamboomvanderwal.nl, 1
|
|||
stameystreet.com, 1
|
||||
stamkassa.nl, 1
|
||||
stammtisch.domains, 1
|
||||
stamonicatourandtravel.com, 1
|
||||
stampederadon.com, 1
|
||||
stanandjerre.org, 1
|
||||
standagainstspying.org, 1
|
||||
|
@ -29376,7 +29379,6 @@ stonewuu.com, 1
|
|||
stony.com, 1
|
||||
stonystratford.org, 1
|
||||
stopakwardhandshakes.org, 1
|
||||
stopbreakupnow.org, 1
|
||||
stopbullying.gov, 1
|
||||
stopfraud.gov, 1
|
||||
stopthethyroidmadness.com, 1
|
||||
|
@ -30864,7 +30866,6 @@ tianshili.me, 1
|
|||
tianxicaipiao.com, 1
|
||||
tianxicaipiao.win, 1
|
||||
tianxicp.com, 1
|
||||
tibbitshall.ca, 1
|
||||
tibipg.com, 1
|
||||
tibovanheule.site, 1
|
||||
ticfleet.com, 1
|
||||
|
@ -31754,7 +31755,6 @@ turigum.com, 1
|
|||
turismo.cl, 1
|
||||
turkiet.guide, 1
|
||||
turkish.dating, 1
|
||||
turkrock.com, 1
|
||||
turn-sticks.com, 1
|
||||
turnaroundforum.de, 1
|
||||
turncircles.com, 1
|
||||
|
@ -32072,7 +32072,6 @@ uniekglas.nl, 1
|
|||
unifiednetwork.me, 1
|
||||
uniform-agri.com, 1
|
||||
uniformebateriasheliar.com.br, 1
|
||||
uniformehope.com.br, 1
|
||||
uniformespousoalegre.com.br, 1
|
||||
unikoingold.com, 1
|
||||
unikrn.com, 1
|
||||
|
@ -32197,6 +32196,7 @@ urbanmelbourne.info, 1
|
|||
urbanmic.com, 1
|
||||
urbannewsservice.com, 1
|
||||
urbansparrow.in, 1
|
||||
urbanstylestaging.com, 1
|
||||
urbanwildlifealliance.org, 1
|
||||
urbexdk.nl, 1
|
||||
urcentral.com, 1
|
||||
|
@ -32240,7 +32240,6 @@ usd.de, 1
|
|||
usds.gov, 1
|
||||
use.be, 1
|
||||
usebean.com, 1
|
||||
usedesk.ru, 1
|
||||
usedu.us, 1
|
||||
useresponse.com, 1
|
||||
usetypo3.com, 1
|
||||
|
@ -32409,6 +32408,7 @@ vantru.is, 1
|
|||
vanvoro.us, 0
|
||||
vanwunnik.com, 1
|
||||
vapecom-shop.com, 1
|
||||
vapehour.com, 1
|
||||
vapemania.eu, 1
|
||||
vaperolles.ch, 1
|
||||
vapesense.co.uk, 1
|
||||
|
@ -32641,7 +32641,6 @@ vidbooster.com, 1
|
|||
vide-dressing.org, 0
|
||||
vide-greniers.org, 0
|
||||
vide-maisons.org, 0
|
||||
videnskabsklubben.dk, 1
|
||||
videogamesartwork.com, 1
|
||||
videoload.co, 1
|
||||
videorullen.se, 1
|
||||
|
@ -32709,7 +32708,6 @@ viltsu.net, 1
|
|||
vima.ch, 1
|
||||
vimeo.com, 1
|
||||
vimeosucks.nyc, 1
|
||||
vinagro.sk, 1
|
||||
vinarstvimodryhrozen.cz, 1
|
||||
vincentcox.com, 0
|
||||
vincentpancol.com, 1
|
||||
|
@ -33159,6 +33157,7 @@ waterschaplimburg.nl, 1
|
|||
watertrails.io, 1
|
||||
waterworkscondos.com, 1
|
||||
watsonwork.me, 1
|
||||
wattechweb.com, 1
|
||||
wave-ola.es, 1
|
||||
wavesboardshop.com, 1
|
||||
wavesoftime.com, 1
|
||||
|
@ -33256,6 +33255,7 @@ webdesignerinwarwickshire.co.uk, 1
|
|||
webdesignlabor.ch, 1
|
||||
webdesignplay.com, 1
|
||||
webdesignplayground.io, 1
|
||||
webdesignssussex.co.uk, 1
|
||||
webdev-quiz.de, 1
|
||||
webdevops.io, 1
|
||||
webdosh.com, 1
|
||||
|
@ -34285,7 +34285,6 @@ xilef.org, 1
|
|||
xilegames.com, 1
|
||||
xiliant.com, 1
|
||||
xilkoi.net, 1
|
||||
ximage.me, 0
|
||||
ximbo.net, 1
|
||||
xin-in.com, 1
|
||||
xin-in.net, 1
|
||||
|
@ -34523,7 +34522,6 @@ y3451.com, 1
|
|||
yaay.com.br, 1
|
||||
yabrt.cn, 1
|
||||
yabuisha.jp, 1
|
||||
yaccin.com, 1
|
||||
yachigoya.com, 1
|
||||
yacineboumaza.fr, 1
|
||||
yacobo.com, 1
|
||||
|
@ -35169,6 +35167,7 @@ zuefle.net, 1
|
|||
zuehlcke.de, 1
|
||||
zug-anwalt.de, 1
|
||||
zug.fr, 1
|
||||
zug.io, 1
|
||||
zughilfen-test.de, 1
|
||||
zuiacg.com, 1
|
||||
zukix.com, 1
|
||||
|
@ -35201,7 +35200,6 @@ zwerimex.com, 1
|
|||
zwollemag.nl, 1
|
||||
zwy.ch, 1
|
||||
zwy.me, 0
|
||||
zx6rninja.de, 1
|
||||
zx7r.de, 1
|
||||
zxity.co.uk, 1
|
||||
zxity.ltd, 1
|
||||
|
|
|
@ -124,6 +124,7 @@ reftest:
|
|||
by-test-platform:
|
||||
linux64-qr/.*: 1
|
||||
windows10-64-asan.*: 3
|
||||
windows10-64-ccov.*: 3
|
||||
default: default
|
||||
|
||||
reftest-gpu:
|
||||
|
|
|
@ -298,8 +298,9 @@ android-4.2-x86/opt:
|
|||
test-sets:
|
||||
- android-x86-tests
|
||||
|
||||
# android-4.3-arm7-api-16-gradle/opt actually uses the non-gradle build
|
||||
# which is tier 2, and requires only a smoketest, like robocop
|
||||
android-4.3-arm7-api-16-gradle/opt:
|
||||
build-platform: android-api-16-gradle/opt
|
||||
test-sets:
|
||||
- android-common-tests
|
||||
- android-opt-tests
|
||||
|
|
|
@ -8,3 +8,21 @@
|
|||
[createImageBitmap from a Blob with negative sw/sh, and drawImage on the created ImageBitmap]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap from a vector HTMLImageElement, and drawImage on the created ImageBitmap]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap from a vector HTMLImageElement with negative sw/sh, and drawImage on the created ImageBitmap]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap from a bitmap SVGImageElement, and drawImage on the created ImageBitmap]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap from a bitmap SVGImageElement with negative sw/sh, and drawImage on the created ImageBitmap]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap from a vector SVGImageElement, and drawImage on the created ImageBitmap]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap from a vector SVGImageElement with negative sw/sh, and drawImage on the created ImageBitmap]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -157,3 +157,45 @@
|
|||
[createImageBitmap with a closed ImageBitmap.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a bitmap HTMLImageElement source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a bitmap HTMLImageElement source and sh set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a bitmap HTMLImageElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a vector HTMLImageElement source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a vector HTMLImageElement source and sh set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a bitmap SVGImageElement source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a bitmap SVGImageElement source and sh set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a bitmap SVGImageElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a vector SVGImageElement source and sw set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a vector SVGImageElement source and sh set to 0]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with a a vector SVGImageElement source and oversized (unallocatable) crop region]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with CanvasRenderingContext2D image source.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with Uint8Array image source.]
|
||||
expected: FAIL
|
||||
|
||||
[createImageBitmap with ArrayBuffer image source.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
[createImageBitmap-origin.sub.html]
|
||||
[cross-origin HTMLImageElement]
|
||||
expected: FAIL
|
||||
|
||||
[cross-origin SVGImageElement]
|
||||
expected: FAIL
|
||||
|
||||
[cross-origin HTMLVideoElement]
|
||||
expected: FAIL
|
||||
|
||||
[unclean HTMLCanvasElement]
|
||||
expected: FAIL
|
||||
|
||||
[unclean ImageBitmap]
|
||||
expected: FAIL
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -5,3 +5,6 @@
|
|||
[Verify calling 'navigator.sendBeacon()' with a small payload fails while Quota is completely utilized.]
|
||||
expected: FAIL
|
||||
|
||||
[Verify the behavior after the quota is exhausted.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -62,3 +62,6 @@
|
|||
[Test Required-CSP value on `csp` change: Wrong value of `csp` should not trigger sending Sec-Required-CSP Header - report-uri present]
|
||||
expected: FAIL
|
||||
|
||||
[Test Required-CSP value on `csp` change: Wrong value of `csp` should not trigger sending Sec-Required-CSP Header - report-to present]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[reporting-api-report-only-sends-reports-on-violation.https.sub.html]
|
||||
prefs: [security.csp.enable_violation_events:true]
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[reporting-api-sends-reports-on-violation.https.sub.html]
|
||||
prefs: [security.csp.enable_violation_events:true]
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[reporting-api-works-on-frame-src.https.sub.html]
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[report-multiple-violations-02.html]
|
||||
[Test number of sent reports.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[report-original-url.sub.html]
|
||||
expected: TIMEOUT
|
||||
[Direct block, cross-origin = full URL in report]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[report-same-origin-with-cookies.html]
|
||||
[Test report cookies.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[report-strips-fragment.html]
|
||||
expected: TIMEOUT
|
||||
[Reported document URI does not contain fragments.]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[report-uri-effective-directive.html]
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[reporting-api-report-to-overrides-report-uri-1.https.sub.html]
|
||||
prefs: [security.csp.enable_violation_events:true]
|
|
@ -1,2 +0,0 @@
|
|||
[reporting-api-report-to-overrides-report-uri-2.https.sub.html]
|
||||
prefs: [security.csp.enable_violation_events:true]
|
|
@ -1,5 +0,0 @@
|
|||
[securitypolicyviolation-idl.html]
|
||||
prefs: [security.csp.enable_violation_events:true]
|
||||
[SecurityPolicyViolationEvent IDL Tests]
|
||||
expected: FAIL
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[clear-applies-to-008.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[floats-028.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[width-inherit-001.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[abspos-027.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[color-000.xht]
|
||||
expected: FAIL
|
|
@ -1,13 +1,10 @@
|
|||
[parse-align-content-001.html]
|
||||
[Checking align-content: baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-content: first baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-content: unsafe end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-content: unsafe flex-start]
|
||||
expected: FAIL
|
||||
|
||||
[Content Distribution: align-content - setting values via CSS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
[parse-align-content-003.html]
|
||||
[Checking align-content: baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-content: first baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-content: unsafe end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-content: unsafe flex-start]
|
||||
expected: FAIL
|
||||
|
||||
[Content Disrtribution: align-content - setting values via JS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -89,3 +89,6 @@
|
|||
if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
FAIL
|
||||
|
||||
[Content Distribution: align-content - invalid values]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -19,3 +19,6 @@
|
|||
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
|
||||
[Content Distribution: justify-content - setting values via CSS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -19,3 +19,6 @@
|
|||
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
|
||||
[Content Disrtribution: justify-content - setting values via JS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -71,3 +71,27 @@
|
|||
if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
FAIL
|
||||
|
||||
[Content Distribution: justify-content - invalid values]
|
||||
expected: FAIL
|
||||
|
||||
[Checking invalid combination - justify-content: baseline]
|
||||
expected:
|
||||
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
|
||||
[Checking invalid combination - justify-content: first baseline]
|
||||
expected:
|
||||
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
|
||||
[Checking invalid combination - justify-content: last baseline]
|
||||
expected:
|
||||
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
|
||||
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
|
||||
|
||||
|
|
|
@ -10,3 +10,6 @@
|
|||
[Checking place-content: last baseline]
|
||||
expected: FAIL
|
||||
|
||||
[CSS Box Alignment: place-content shorthand - single values specified]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -317,3 +317,6 @@
|
|||
if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
FAIL
|
||||
|
||||
[CSS Box Alignment: place-content shorthand - multiple values specified]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -8,3 +8,12 @@
|
|||
if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
FAIL
|
||||
|
||||
[Verify <baseline-position> values are invalid for the justify-content property]
|
||||
expected:
|
||||
if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
|
||||
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
|
||||
if debug and stylo and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
FAIL
|
||||
|
||||
|
|
|
@ -43,42 +43,6 @@
|
|||
[Checking place-content: first baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline normal]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline start]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline left]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline right]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline center]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline flex-start]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline flex-end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline stretch]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline space-around]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline space-between]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline space-evenly]
|
||||
expected: FAIL
|
||||
|
||||
[Checking place-content: first baseline baseline]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -169,3 +133,6 @@
|
|||
[Checking place-content: last baseline]
|
||||
expected: FAIL
|
||||
|
||||
[CSS Box Alignment: place-content shorthand - Shorthand 'specified' and 'resolved' value]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
[parse-align-items-001.html]
|
||||
[Checking align-items: baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-items: first baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-items: unsafe end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-items: unsafe flex-start]
|
||||
expected: FAIL
|
||||
|
||||
[Default-Alignment: align-items - setting values via CSS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
[parse-align-items-003.html]
|
||||
[Checking align-items: baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-items: first baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-items: unsafe end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking align-items: unsafe flex-start]
|
||||
expected: FAIL
|
||||
|
||||
[Default-Alignment: align-items - setting values via JS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -26,3 +26,6 @@
|
|||
if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
FAIL
|
||||
|
||||
[Default-Alignment: align-items - invalid values]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
[parse-justify-items-001.html]
|
||||
[Checking justify-items: baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking justify-items: first baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking justify-items: unsafe end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking justify-items: unsafe flex-start]
|
||||
expected: FAIL
|
||||
|
||||
[Default-Alignment: justify-items - setting values via CSS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
[parse-justify-items-003.html]
|
||||
[Checking justify-items: baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking justify-items: first baseline]
|
||||
expected: FAIL
|
||||
|
||||
[Checking justify-items: unsafe end]
|
||||
expected: FAIL
|
||||
|
||||
[Checking justify-items: unsafe flex-start]
|
||||
expected: FAIL
|
||||
|
||||
[Default-Alignment: justify-items - setting values via JS]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,3 +11,6 @@
|
|||
if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
|
||||
FAIL
|
||||
|
||||
[Default-Alignment: justify-items - invalid values]
|
||||
expected: FAIL
|
||||
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче