Merge mozilla-central to autoland. a=merge CLOSED TREE

This commit is contained in:
Noemi Erli 2018-02-03 12:09:34 +02:00
Родитель 9a64450314 3d09e55d55
Коммит b114c48532
519 изменённых файлов: 12577 добавлений и 2681 удалений

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

@ -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

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