Merge inbound to mozilla-central r=merge a=merge

This commit is contained in:
Bogdan Tara 2017-12-04 22:20:49 +02:00
Родитель ea9418047f 9578da563d
Коммит ebe0a1a20c
51 изменённых файлов: 680 добавлений и 263 удалений

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

@ -10,5 +10,6 @@ skip-if = os == 'win' # Bug 1352791
[browser_notification_open_settings.js]
skip-if = os == 'win' # Bug 1411118
[browser_notification_remove_permission.js]
skip-if = os == 'win' # Bug 1411118
[browser_notification_replace.js]
[browser_notification_tab_switching.js]

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

@ -41,7 +41,8 @@ add_task(async function() {
let exceptions = [
{name: "bug 1403648 - urlbar down arrow shouldn't flicker",
condition: r => r.h == 5 && inRange(r.w, 8, 9) && // 5x9px area
condition: r => // 5x9px area, sometimes less at the end of the opacity transition
inRange(r.h, 3, 5) && inRange(r.w, 7, 9) &&
inRange(r.y1, 40, 80) && // in the toolbar
// at ~80% of the window width
inRange(r.x1, width * .75, width * .9)

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

@ -71,16 +71,16 @@ add_task(async function() {
win.removeEventListener("MozAfterPaint", afterPaintListener);
let unexpectedRects = 0;
let foundTinyPaint = false;
let ignoreTinyPaint = true;
for (let i = 1; i < frames.length; ++i) {
let frame = frames[i], previousFrame = frames[i - 1];
if (!foundTinyPaint &&
if (ignoreTinyPaint &&
previousFrame.width == 1 && previousFrame.height == 1) {
foundTinyPaint = true;
todo(false, "shouldn't first paint a 1x1px window");
todo(false, "shouldn't initially paint a 1x1px window");
continue;
}
ignoreTinyPaint = false;
let rects = compareFrames(frame, previousFrame).filter(rect => {
let inRange = (val, min, max) => min <= val && val <= max;
let width = frame.width;
@ -91,7 +91,8 @@ add_task(async function() {
let exceptions = [
{name: "bug 1403648 - urlbar down arrow shouldn't flicker",
condition: r => r.h == 5 && inRange(r.w, 8, 9) && // 5x9px area
condition: r => // 5x9px area, sometimes less at the end of the opacity transition
inRange(r.h, 3, 5) && inRange(r.w, 7, 9) &&
inRange(r.y1, 40, 80) && // in the toolbar
// at ~80% of the window width
inRange(r.x1, width * .75, width * .9)
@ -104,6 +105,14 @@ add_task(async function() {
inRange(r.x1, width - 100, width - 50)
},
{name: "bug 1403648 - urlbar should be focused at first paint",
condition: r => inRange(r.y2, 60, 80) && // in the toolbar
// taking 50% to 75% of the window width
inRange(r.w, width * .5, width * .75) &&
// starting at 15 to 25% of the window width
inRange(r.x1, width * .15, width * .25)
},
{name: "bug 1421463 - reload toolbar icon shouldn't flicker",
condition: r => r.h == 13 && inRange(r.w, 14, 16) && // icon size
inRange(r.y1, 40, 80) && // in the toolbar

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

@ -2710,7 +2710,8 @@ var SessionStoreInternal = {
if (activePageData.title &&
activePageData.title != activePageData.url) {
win.gBrowser.setInitialTabTitle(tab, activePageData.title, { isContentTitle: true });
} else if (activePageData.url != "about:blank") {
} else if (activePageData.url != "about:blank" &&
activePageData.url != "about:newtab") {
win.gBrowser.setInitialTabTitle(tab, activePageData.url);
}
}

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

@ -1256,6 +1256,19 @@ set_config('PROFILE_GEN_LDFLAGS', pgo_flags.gen_ldflags)
set_config('PROFILE_USE_CFLAGS', pgo_flags.use_cflags)
set_config('PROFILE_USE_LDFLAGS', pgo_flags.use_ldflags)
@depends(c_compiler)
def preprocess_option(compiler):
# The uses of PREPROCESS_OPTION depend on the spacing for -o/-Fi.
if compiler.type in ('gcc', 'clang'):
return '-E -o '
else:
return '-P -Fi'
set_config('PREPROCESS_OPTION', preprocess_option)
# We only want to include windows.configure when we are compiling on
# Windows, for Windows.

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

@ -682,6 +682,7 @@ nsContentSink::ProcessLinkHeader(const nsAString& aLinkData)
anchor.Truncate();
referrerPolicy.Truncate();
crossOrigin.SetIsVoid(true);
as.Truncate();
seenParameters = false;
}

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

@ -37,5 +37,12 @@ DeallocClientManagerParent(PClientManagerParent* aActor)
return true;
}
void
InitClientManagerParent(PClientManagerParent* aActor)
{
auto actor = static_cast<ClientManagerParent*>(aActor);
actor->Init();
}
} // namespace dom
} // namespace mozilla

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

@ -24,6 +24,9 @@ AllocClientManagerParent();
bool
DeallocClientManagerParent(PClientManagerParent* aActor);
void
InitClientManagerParent(PClientManagerParent* aActor);
} // namespace dom
} // namespace mozilla

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

@ -117,6 +117,13 @@ ClientManagerParent::ClientManagerParent()
ClientManagerParent::~ClientManagerParent()
{
mService->RemoveManager(this);
}
void
ClientManagerParent::Init()
{
mService->AddManager(this);
}
} // namespace dom

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

@ -63,6 +63,9 @@ class ClientManagerParent final : public PClientManagerParent
public:
ClientManagerParent();
~ClientManagerParent();
void
Init();
};
} // namespace dom

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

@ -6,9 +6,13 @@
#include "ClientManagerService.h"
#include "ClientManagerParent.h"
#include "ClientSourceParent.h"
#include "mozilla/ipc/BackgroundParent.h"
#include "mozilla/ipc/PBackgroundSharedTypes.h"
#include "mozilla/ClearOnShutdown.h"
#include "mozilla/SystemGroup.h"
#include "nsIAsyncShutdown.h"
namespace mozilla {
namespace dom {
@ -56,22 +60,137 @@ MatchPrincipalInfo(const PrincipalInfo& aLeft, const PrincipalInfo& aRight)
MOZ_CRASH("unexpected principal type!");
}
class ClientShutdownBlocker final : public nsIAsyncShutdownBlocker
{
RefPtr<GenericPromise::Private> mPromise;
~ClientShutdownBlocker() = default;
public:
explicit ClientShutdownBlocker(GenericPromise::Private* aPromise)
: mPromise(aPromise)
{
MOZ_DIAGNOSTIC_ASSERT(mPromise);
}
NS_IMETHOD
GetName(nsAString& aNameOut) override
{
aNameOut =
NS_LITERAL_STRING("ClientManagerService: start destroying IPC actors early");
return NS_OK;
}
NS_IMETHOD
BlockShutdown(nsIAsyncShutdownClient* aClient) override
{
mPromise->Resolve(true, __func__);
aClient->RemoveBlocker(this);
return NS_OK;
}
NS_IMETHOD
GetState(nsIPropertyBag**) override
{
return NS_OK;
}
NS_DECL_ISUPPORTS
};
NS_IMPL_ISUPPORTS(ClientShutdownBlocker, nsIAsyncShutdownBlocker)
// Helper function the resolves a MozPromise when we detect that the browser
// has begun to shutdown.
RefPtr<GenericPromise>
OnShutdown()
{
RefPtr<GenericPromise::Private> ref = new GenericPromise::Private(__func__);
nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction("ClientManagerServer::OnShutdown",
[ref] () {
nsCOMPtr<nsIAsyncShutdownService> svc = services::GetAsyncShutdown();
if (!svc) {
ref->Resolve(true, __func__);
return;
}
nsCOMPtr<nsIAsyncShutdownClient> phase;
MOZ_ALWAYS_SUCCEEDS(svc->GetXpcomWillShutdown(getter_AddRefs(phase)));
if (!phase) {
ref->Resolve(true, __func__);
return;
}
nsCOMPtr<nsIAsyncShutdownBlocker> blocker = new ClientShutdownBlocker(ref);
nsresult rv =
phase->AddBlocker(blocker, NS_LITERAL_STRING(__FILE__), __LINE__,
NS_LITERAL_STRING("ClientManagerService shutdown"));
if (NS_FAILED(rv)) {
ref->Resolve(true, __func__);
return;
}
});
MOZ_ALWAYS_SUCCEEDS(
SystemGroup::Dispatch(TaskCategory::Other, r.forget()));
return ref.forget();
}
} // anonymous namespace
ClientManagerService::ClientManagerService()
: mShutdown(false)
{
AssertIsOnBackgroundThread();
// While the ClientManagerService will be gracefully terminated as windows
// and workers are naturally killed, this can cause us to do extra work
// relatively late in the shutdown process. To avoid this we eagerly begin
// shutdown at the first sign it has begun. Since we handle normal shutdown
// gracefully we don't really need to block anything here. We just begin
// destroying our IPC actors immediately.
OnShutdown()->Then(GetCurrentThreadSerialEventTarget(), __func__,
[] () {
RefPtr<ClientManagerService> svc = ClientManagerService::GetInstance();
if (svc) {
svc->Shutdown();
}
});
}
ClientManagerService::~ClientManagerService()
{
AssertIsOnBackgroundThread();
MOZ_DIAGNOSTIC_ASSERT(mSourceTable.Count() == 0);
MOZ_DIAGNOSTIC_ASSERT(mManagerList.IsEmpty());
MOZ_DIAGNOSTIC_ASSERT(sClientManagerServiceInstance == this);
sClientManagerServiceInstance = nullptr;
}
void
ClientManagerService::Shutdown()
{
AssertIsOnBackgroundThread();
// If many ClientManagerService are created and destroyed quickly we can
// in theory get more than one shutdown listener calling us.
if (mShutdown) {
return;
}
mShutdown = true;
// Begin destroying our various manager actors which will in turn destroy
// all source, handle, and operation actors.
AutoTArray<ClientManagerParent*, 16> list(mManagerList);
for (auto actor : list) {
Unused << PClientManagerParent::Send__delete__(actor);
}
}
// static
already_AddRefed<ClientManagerService>
ClientManagerService::GetOrCreateInstance()
@ -86,6 +205,20 @@ ClientManagerService::GetOrCreateInstance()
return ref.forget();
}
// static
already_AddRefed<ClientManagerService>
ClientManagerService::GetInstance()
{
AssertIsOnBackgroundThread();
if (!sClientManagerServiceInstance) {
return nullptr;
}
RefPtr<ClientManagerService> ref(sClientManagerServiceInstance);
return ref.forget();
}
bool
ClientManagerService::AddSource(ClientSourceParent* aSource)
{
@ -134,5 +267,28 @@ ClientManagerService::FindSource(const nsID& aID, const PrincipalInfo& aPrincipa
return source;
}
void
ClientManagerService::AddManager(ClientManagerParent* aManager)
{
AssertIsOnBackgroundThread();
MOZ_DIAGNOSTIC_ASSERT(aManager);
MOZ_ASSERT(!mManagerList.Contains(aManager));
mManagerList.AppendElement(aManager);
// If shutdown has already begun then immediately destroy the actor.
if (mShutdown) {
Unused << PClientManagerParent::Send__delete__(aManager);
}
}
void
ClientManagerService::RemoveManager(ClientManagerParent* aManager)
{
AssertIsOnBackgroundThread();
MOZ_DIAGNOSTIC_ASSERT(aManager);
DebugOnly<bool> removed = mManagerList.RemoveElement(aManager);
MOZ_ASSERT(removed);
}
} // namespace dom
} // namespace mozilla

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

@ -7,12 +7,14 @@
#define _mozilla_dom_ClientManagerService_h
#include "mozilla/ipc/PBackgroundSharedTypes.h"
#include "mozilla/MozPromise.h"
#include "nsDataHashtable.h"
namespace mozilla {
namespace dom {
class ClientManagerParent;
class ClientSourceParent;
// Define a singleton service to manage client activity throughout the
@ -24,13 +26,24 @@ class ClientManagerService final
// optimize for insertion, removal, and lookup by UUID.
nsDataHashtable<nsIDHashKey, ClientSourceParent*> mSourceTable;
nsTArray<ClientManagerParent*> mManagerList;
bool mShutdown;
ClientManagerService();
~ClientManagerService();
void
Shutdown();
public:
static already_AddRefed<ClientManagerService>
GetOrCreateInstance();
// Returns nullptr if the service is not already created.
static already_AddRefed<ClientManagerService>
GetInstance();
bool
AddSource(ClientSourceParent* aSource);
@ -41,6 +54,12 @@ public:
FindSource(const nsID& aID,
const mozilla::ipc::PrincipalInfo& aPrincipalInfo);
void
AddManager(ClientManagerParent* aManager);
void
RemoveManager(ClientManagerParent* aManager);
NS_INLINE_DECL_REFCOUNTING(mozilla::dom::ClientManagerService)
};

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

@ -23,6 +23,7 @@
#include "nsContentUtils.h"
#include "nsError.h"
#include "nsHostObjectURI.h"
#include "nsIAsyncShutdown.h"
#include "nsIMemoryReporter.h"
#include "nsIPrincipal.h"
#include "nsIUUIDGenerator.h"
@ -437,6 +438,7 @@ NS_IMPL_ISUPPORTS(BlobURLsReporter, nsIMemoryReporter)
class ReleasingTimerHolder final : public nsITimerCallback
, public nsINamed
, public nsIAsyncShutdownBlocker
{
public:
NS_DECL_ISUPPORTS
@ -444,27 +446,98 @@ public:
static void
Create(const nsACString& aURI, bool aBroadcastToOtherProcesses)
{
MOZ_ASSERT(NS_IsMainThread());
RefPtr<ReleasingTimerHolder> holder =
new ReleasingTimerHolder(aURI, aBroadcastToOtherProcesses);
auto raii = mozilla::MakeScopeExit([&] {
holder->CancelTimerAndRevokeURI();
});
nsresult rv = NS_NewTimerWithCallback(getter_AddRefs(holder->mTimer),
holder, RELEASING_TIMER,
nsITimer::TYPE_ONE_SHOT,
SystemGroup::EventTargetFor(TaskCategory::Other));
NS_ENSURE_SUCCESS_VOID(rv);
nsCOMPtr<nsIAsyncShutdownClient> phase = GetShutdownPhase();
NS_ENSURE_TRUE_VOID(!!phase);
rv = phase->AddBlocker(holder, NS_LITERAL_STRING(__FILE__), __LINE__,
NS_LITERAL_STRING("ReleasingTimerHolder shutdown"));
NS_ENSURE_SUCCESS_VOID(rv);
raii.release();
}
// nsITimerCallback interface
NS_IMETHOD
Notify(nsITimer* aTimer) override
{
RevokeURI(mBroadcastToOtherProcesses);
return NS_OK;
}
// nsINamed interface
NS_IMETHOD
GetName(nsACString& aName) override
{
aName.AssignLiteral("ReleasingTimerHolder");
return NS_OK;
}
// nsIAsyncShutdownBlocker interface
NS_IMETHOD
GetName(nsAString& aName) override
{
aName.AssignLiteral("ReleasingTimerHolder");
return NS_OK;
}
NS_IMETHOD
BlockShutdown(nsIAsyncShutdownClient* aClient) override
{
CancelTimerAndRevokeURI();
return NS_OK;
}
NS_IMETHOD
GetState(nsIPropertyBag**) override
{
return NS_OK;
}
private:
ReleasingTimerHolder(const nsACString& aURI, bool aBroadcastToOtherProcesses)
: mURI(aURI)
, mBroadcastToOtherProcesses(aBroadcastToOtherProcesses)
{}
~ReleasingTimerHolder()
{}
void
RevokeURI(bool aBroadcastToOtherProcesses)
{
// Remove the shutting down blocker
nsCOMPtr<nsIAsyncShutdownClient> phase = GetShutdownPhase();
if (phase) {
phase->RemoveBlocker(this);
}
// If we have to broadcast the unregistration, let's do it now.
if (mBroadcastToOtherProcesses) {
if (aBroadcastToOtherProcesses) {
BroadcastBlobURLUnregistration(mURI);
}
DataInfo* info = GetDataInfo(mURI, true /* We care about revoked dataInfo */);
if (!info) {
// Already gone!
return NS_OK;
return;
}
MOZ_ASSERT(info->mRevoked);
@ -481,25 +554,31 @@ public:
delete gDataTable;
gDataTable = nullptr;
}
return NS_OK;
}
NS_IMETHOD
GetName(nsACString& aName) override
void
CancelTimerAndRevokeURI()
{
aName.AssignLiteral("ReleasingTimerHolder");
return NS_OK;
if (mTimer) {
mTimer->Cancel();
mTimer = nullptr;
}
RevokeURI(false /* aBroadcastToOtherProcesses */);
}
private:
ReleasingTimerHolder(const nsACString& aURI, bool aBroadcastToOtherProcesses)
: mURI(aURI)
, mBroadcastToOtherProcesses(aBroadcastToOtherProcesses)
{}
static nsCOMPtr<nsIAsyncShutdownClient>
GetShutdownPhase()
{
nsCOMPtr<nsIAsyncShutdownService> svc = services::GetAsyncShutdown();
NS_ENSURE_TRUE(!!svc, nullptr);
~ReleasingTimerHolder()
{}
nsCOMPtr<nsIAsyncShutdownClient> phase;
nsresult rv = svc->GetXpcomWillShutdown(getter_AddRefs(phase));
NS_ENSURE_SUCCESS(rv, nullptr);
return Move(phase);
}
nsCString mURI;
bool mBroadcastToOtherProcesses;
@ -507,7 +586,8 @@ private:
nsCOMPtr<nsITimer> mTimer;
};
NS_IMPL_ISUPPORTS(ReleasingTimerHolder, nsITimerCallback, nsINamed)
NS_IMPL_ISUPPORTS(ReleasingTimerHolder, nsITimerCallback, nsINamed,
nsIAsyncShutdownBlocker)
} // namespace mozilla

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

@ -68,8 +68,8 @@ dictionary RTCAnswerOptions : RTCOfferAnswerOptions {
};
dictionary RTCOfferOptions : RTCOfferAnswerOptions {
long offerToReceiveVideo;
long offerToReceiveAudio;
boolean offerToReceiveVideo;
boolean offerToReceiveAudio;
boolean iceRestart = false;
};

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

@ -980,6 +980,13 @@ BackgroundParentImpl::DeallocPClientManagerParent(mozilla::dom::PClientManagerPa
return mozilla::dom::DeallocClientManagerParent(aActor);
}
mozilla::ipc::IPCResult
BackgroundParentImpl::RecvPClientManagerConstructor(mozilla::dom::PClientManagerParent* aActor)
{
mozilla::dom::InitClientManagerParent(aActor);
return IPC_OK();
}
} // namespace ipc
} // namespace mozilla

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

@ -268,6 +268,9 @@ protected:
virtual bool
DeallocPClientManagerParent(PClientManagerParent* aActor) override;
virtual mozilla::ipc::IPCResult
RecvPClientManagerConstructor(PClientManagerParent* aActor) override;
};
} // namespace ipc

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

@ -0,0 +1,53 @@
// ECMA262 9.4.5.2 [[HasProperty]]
function check_in(x, a) {
return (x in a);
}
function check_has_own(x, a) {
return a.hasOwnProperty(x);
}
//make sure baseline gets compiled
function warmup(a) {
for (var i = 0; i < 1001; i++) {
check_in(i, a);
check_has_own(i, a);
}
}
function check_assertions(a) {
assertEq(check_in(1, a), true);
assertEq(check_in("-0",a), false); // -0 access
assertEq(check_in(-10,a), false); // Negative access
assertEq(check_in(1012,a), false); // OOB access
assertEq(check_has_own(1, a), true);
assertEq(check_has_own("-0",a), false); // -0 access
assertEq(check_has_own(-10,a), false); // Negative access
assertEq(check_has_own(1012,a), false); // OOB access
}
function test_with_no_protochain(a) {
var a = new Int32Array(1000).fill(1);
warmup(a);
check_assertions(a);
}
// Attempting to validate against this comment:
// https://bugzilla.mozilla.org/show_bug.cgi?id=1419372#c3
//
// "Out of bounds "in" or "hasOwnProperty" should always
// return false, and not consider the prototype chain at all"
function test_with_protochain(a) {
var a = new Int32Array(1000).fill(1);
// try to force the behaviour of 9.4.5.2
a[1012] = "1012";
a["-0"] = "-0";
a[-10] = "-10";
warmup(a);
check_assertions(a);
}
test_with_no_protochain();
test_with_protochain();

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

@ -2564,6 +2564,29 @@ HasPropIRGenerator::tryAttachUnboxedExpando(JSObject* obj, ObjOperandId objId,
return true;
}
bool
HasPropIRGenerator::tryAttachTypedArray(HandleObject obj, ObjOperandId objId,
uint32_t index, Int32OperandId indexId)
{
if (!obj->is<TypedArrayObject>() && !IsPrimitiveArrayTypedObject(obj))
return false;
// Don't attach typed object stubs if the underlying storage could be
// detached, as the stub will always bail out.
if (IsPrimitiveArrayTypedObject(obj) && cx_->compartment()->detachedTypedObjects)
return false;
TypedThingLayout layout = GetTypedThingLayout(obj->getClass());
writer.guardShape(objId, obj->as<ShapedObject>().shape());
writer.loadTypedElementExistsResult(objId, indexId, layout);
writer.returnFromIC();
trackAttached("TypedArrayObject");
return true;
}
bool
HasPropIRGenerator::tryAttachTypedObject(JSObject* obj, ObjOperandId objId,
jsid key, ValOperandId keyId)
@ -2693,6 +2716,8 @@ HasPropIRGenerator::tryAttachStub()
return true;
if (tryAttachDenseHole(obj, objId, index, indexId))
return true;
if (tryAttachTypedArray(obj, objId, index, indexId))
return true;
trackNotAttached();
return false;

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

@ -239,6 +239,7 @@ extern const char* CacheKindNames[];
_(LoadDenseElementResult) \
_(LoadDenseElementHoleResult) \
_(LoadDenseElementExistsResult) \
_(LoadTypedElementExistsResult) \
_(LoadDenseElementHoleExistsResult) \
_(LoadTypedElementResult) \
_(LoadInt32ArrayLengthResult) \
@ -930,6 +931,11 @@ class MOZ_RAII CacheIRWriter : public JS::CustomAutoRooter
writeOpWithOperandId(CacheOp::LoadDenseElementExistsResult, obj);
writeOperandId(index);
}
void loadTypedElementExistsResult(ObjOperandId obj, Int32OperandId index, TypedThingLayout layout) {
writeOpWithOperandId(CacheOp::LoadTypedElementExistsResult, obj);
writeOperandId(index);
buffer_.writeByte(uint32_t(layout));
}
void loadDenseElementHoleExistsResult(ObjOperandId obj, Int32OperandId index) {
writeOpWithOperandId(CacheOp::LoadDenseElementHoleExistsResult, obj);
writeOperandId(index);
@ -1439,6 +1445,8 @@ class MOZ_RAII HasPropIRGenerator : public IRGenerator
uint32_t index, Int32OperandId indexId);
bool tryAttachDenseHole(HandleObject obj, ObjOperandId objId,
uint32_t index, Int32OperandId indexId);
bool tryAttachTypedArray(HandleObject obj, ObjOperandId objId,
uint32_t index, Int32OperandId indexId);
bool tryAttachNamedProp(HandleObject obj, ObjOperandId objId,
HandleId key, ValOperandId keyId);
bool tryAttachMegamorphic(ObjOperandId objId, ValOperandId keyId);

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

@ -1953,6 +1953,30 @@ CacheIRCompiler::emitLoadDenseElementHoleResult()
return true;
}
bool
CacheIRCompiler::emitLoadTypedElementExistsResult()
{
AutoOutputRegister output(*this);
Register obj = allocator.useRegister(masm, reader.objOperandId());
Register index = allocator.useRegister(masm, reader.int32OperandId());
TypedThingLayout layout = reader.typedThingLayout();
AutoScratchRegisterMaybeOutput scratch(allocator, masm, output);
Label outOfBounds, done;
// Bound check.
LoadTypedThingLength(masm, layout, obj, scratch);
masm.branch32(Assembler::BelowOrEqual, scratch, index, &outOfBounds);
EmitStoreBoolean(masm, true, output);
masm.jump(&done);
masm.bind(&outOfBounds);
EmitStoreBoolean(masm, false, output);
masm.bind(&done);
return true;
}
bool
CacheIRCompiler::emitLoadDenseElementExistsResult()
{

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

@ -50,6 +50,7 @@ namespace jit {
_(LoadDenseElementHoleResult) \
_(LoadDenseElementExistsResult) \
_(LoadDenseElementHoleExistsResult) \
_(LoadTypedElementExistsResult) \
_(LoadTypedElementResult) \
_(LoadObjectResult) \
_(LoadTypeOfObjectResult) \

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

@ -1923,18 +1923,6 @@ if test -n "$MOZ_DEV_EDITION"; then
AC_DEFINE(MOZ_DEV_EDITION)
fi
dnl ========================================================
dnl Determine options to use for running the preprocessor.
dnl ========================================================
if test -z "$GNU_CC" -a "$OS_ARCH" = "WINNT"; then
PREPROCESS_OPTION="-P -Fi"
else
PREPROCESS_OPTION="-E -o "
fi
AC_SUBST(PREPROCESS_OPTION)
dnl ========================================================
dnl JavaScript shell
dnl ========================================================

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

@ -618,15 +618,78 @@ NativeObject::addDataPropertyInternal(JSContext* cx,
return shape;
}
static MOZ_ALWAYS_INLINE Shape*
PropertyTreeReadBarrier(Shape* parent, Shape* shape)
{
JS::Zone* zone = shape->zone();
if (zone->needsIncrementalBarrier()) {
// We need a read barrier for the shape tree, since these are weak
// pointers.
Shape* tmp = shape;
TraceManuallyBarrieredEdge(zone->barrierTracer(), &tmp, "read barrier");
MOZ_ASSERT(tmp == shape);
return shape;
}
if (MOZ_LIKELY(!zone->isGCSweepingOrCompacting() ||
!IsAboutToBeFinalizedUnbarriered(&shape)))
{
if (shape->isMarkedGray())
UnmarkGrayShapeRecursively(shape);
return shape;
}
// The shape we've found is unreachable and due to be finalized, so
// remove our weak reference to it and don't use it.
MOZ_ASSERT(parent->isMarkedAny());
parent->removeChild(shape);
return nullptr;
}
/* static */ Shape*
NativeObject::addEnumerableDataProperty(JSContext* cx, HandleNativeObject obj, HandleId id)
{
// Like addProperty(Internal), but optimized for the common case of adding a
// new enumerable data property.
AutoKeepShapeTables keep(cx);
AutoCheckShapeConsistency check(obj);
// Fast path for non-dictionary shapes with a single kid.
do {
AutoCheckCannotGC nogc;
Shape* lastProperty = obj->lastProperty();
if (lastProperty->inDictionary())
break;
KidsPointer* kidp = &lastProperty->kids;
if (!kidp->isShape())
break;
Shape* kid = kidp->toShape();
MOZ_ASSERT(!kid->inDictionary());
if (kid->propidRaw() != id ||
kid->isAccessorShape() ||
kid->attributes() != JSPROP_ENUMERATE ||
kid->base()->unowned() != lastProperty->base()->unowned())
{
break;
}
MOZ_ASSERT(kid->isDataProperty());
kid = PropertyTreeReadBarrier(lastProperty, kid);
if (!kid)
break;
if (!obj->setLastProperty(cx, kid))
return nullptr;
return kid;
} while (0);
AutoKeepShapeTables keep(cx);
ShapeTable* table = nullptr;
ShapeTable::Entry* entry = nullptr;
@ -1676,30 +1739,9 @@ PropertyTree::inlinedGetChild(JSContext* cx, Shape* parent, Handle<StackShape> c
}
if (existingShape) {
JS::Zone* zone = existingShape->zone();
if (zone->needsIncrementalBarrier()) {
/*
* We need a read barrier for the shape tree, since these are weak
* pointers.
*/
Shape* tmp = existingShape;
TraceManuallyBarrieredEdge(zone->barrierTracer(), &tmp, "read barrier");
MOZ_ASSERT(tmp == existingShape);
existingShape = PropertyTreeReadBarrier(parent, existingShape);
if (existingShape)
return existingShape;
}
if (!zone->isGCSweepingOrCompacting() ||
!IsAboutToBeFinalizedUnbarriered(&existingShape))
{
if (existingShape->isMarkedGray())
UnmarkGrayShapeRecursively(existingShape);
return existingShape;
}
/*
* The shape we've found is unreachable and due to be finalized, so
* remove our weak reference to it and don't use it.
*/
MOZ_ASSERT(parent->isMarkedAny());
parent->removeChild(existingShape);
}
RootedShape parentRoot(cx, parent);

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

@ -7,7 +7,6 @@
#include "mozilla/Assertions.h"
#include "mozilla/mozalloc.h"
#include "mozilla/ArrayUtils.h"
#include "nsString.h"
#include <string.h>
#ifdef XP_WIN
@ -292,16 +291,16 @@ NetAddrElement::NetAddrElement(const NetAddrElement& netAddr)
NetAddrElement::~NetAddrElement() = default;
AddrInfo::AddrInfo(const nsACString& host, const PRAddrInfo *prAddrInfo,
bool disableIPv4, bool filterNameCollision,
const nsACString& cname)
: mHostName(host)
, mCanonicalName(cname)
AddrInfo::AddrInfo(const char *host, const PRAddrInfo *prAddrInfo,
bool disableIPv4, bool filterNameCollision, const char *cname)
: mHostName(nullptr)
, mCanonicalName(nullptr)
, ttl(NO_TTL_DATA)
{
MOZ_ASSERT(prAddrInfo, "Cannot construct AddrInfo with a null prAddrInfo pointer!");
const uint32_t nameCollisionAddr = htonl(0x7f003535); // 127.0.53.53
Init(host, cname);
PRNetAddr tmpAddr;
void *iter = nullptr;
do {
@ -316,11 +315,12 @@ AddrInfo::AddrInfo(const nsACString& host, const PRAddrInfo *prAddrInfo,
} while (iter);
}
AddrInfo::AddrInfo(const nsACString& host, const nsACString& cname)
: mHostName(host)
, mCanonicalName(cname)
AddrInfo::AddrInfo(const char *host, const char *cname)
: mHostName(nullptr)
, mCanonicalName(nullptr)
, ttl(NO_TTL_DATA)
{
Init(host, cname);
}
AddrInfo::~AddrInfo()
@ -329,6 +329,27 @@ AddrInfo::~AddrInfo()
while ((addrElement = mAddresses.popLast())) {
delete addrElement;
}
free(mHostName);
free(mCanonicalName);
}
void
AddrInfo::Init(const char *host, const char *cname)
{
MOZ_ASSERT(host, "Cannot initialize AddrInfo with a null host pointer!");
ttl = NO_TTL_DATA;
size_t hostlen = strlen(host);
mHostName = static_cast<char*>(moz_xmalloc(hostlen + 1));
memcpy(mHostName, host, hostlen + 1);
if (cname) {
size_t cnameLen = strlen(cname);
mCanonicalName = static_cast<char*>(moz_xmalloc(cnameLen + 1));
memcpy(mCanonicalName, cname, cnameLen + 1);
}
else {
mCanonicalName = nullptr;
}
}
void
@ -343,8 +364,8 @@ size_t
AddrInfo::SizeOfIncludingThis(MallocSizeOf mallocSizeOf) const
{
size_t n = mallocSizeOf(this);
n += mHostName.SizeOfExcludingThisIfUnshared(mallocSizeOf);
n += mCanonicalName.SizeOfExcludingThisIfUnshared(mallocSizeOf);
n += mallocSizeOf(mHostName);
n += mallocSizeOf(mCanonicalName);
n += mAddresses.sizeOfExcludingThis(mallocSizeOf);
return n;
}

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

@ -8,7 +8,6 @@
#define DNS_h_
#include "nscore.h"
#include "nsString.h"
#include "prio.h"
#include "prnetdb.h"
#include "plstr.h"
@ -134,27 +133,28 @@ public:
class AddrInfo {
public:
// Creates an AddrInfo object.
AddrInfo(const nsACString& host, const PRAddrInfo *prAddrInfo,
bool disableIPv4, bool filterNameCollision,
const nsACString& cname);
// Creates a basic AddrInfo object (initialize only the host and the
// cname).
AddrInfo(const nsACString& host, const nsACString& cname);
// Creates an AddrInfo object. It calls the AddrInfo(const char*, const char*)
// to initialize the host and the cname.
AddrInfo(const char *host, const PRAddrInfo *prAddrInfo, bool disableIPv4,
bool filterNameCollision, const char *cname);
// Creates a basic AddrInfo object (initialize only the host and the cname).
AddrInfo(const char *host, const char *cname);
~AddrInfo();
void AddAddress(NetAddrElement *address);
size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const;
nsCString mHostName;
nsCString mCanonicalName;
char *mHostName;
char *mCanonicalName;
uint32_t ttl;
static const uint32_t NO_TTL_DATA = (uint32_t) -1;
LinkedList<NetAddrElement> mAddresses;
private:
void Init(const char *host, const char *cname);
};
// Copies the contents of a PRNetAddr to a NetAddr.

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

@ -251,9 +251,10 @@ _GetTTLData_Windows(const char* aHost, uint32_t* aResult, uint16_t aAddressFamil
static MOZ_ALWAYS_INLINE nsresult
_GetAddrInfo_Portable(const char* aCanonHost, uint16_t aAddressFamily,
uint16_t aFlags, const char* aNetworkInterface,
UniquePtr<AddrInfo>& aAddrInfo)
AddrInfo** aAddrInfo)
{
MOZ_ASSERT(aCanonHost);
MOZ_ASSERT(aAddrInfo);
// We accept the same aFlags that nsHostResolver::ResolveHost accepts, but we
// need to translate the aFlags into a form that PR_GetAddrInfoByName
@ -282,14 +283,14 @@ _GetAddrInfo_Portable(const char* aCanonHost, uint16_t aAddressFamily,
}
bool filterNameCollision = !(aFlags & nsHostResolver::RES_ALLOW_NAME_COLLISION);
auto ai = MakeUnique<AddrInfo>(nsCString(aCanonHost), prai, disableIPv4,
filterNameCollision, nsCString(canonName));
nsAutoPtr<AddrInfo> ai(new AddrInfo(aCanonHost, prai, disableIPv4,
filterNameCollision, canonName));
PR_FreeAddrInfo(prai);
if (ai->mAddresses.isEmpty()) {
return NS_ERROR_UNKNOWN_HOST;
}
aAddrInfo = Move(ai);
*aAddrInfo = ai.forget();
return NS_OK;
}
@ -321,10 +322,9 @@ GetAddrInfoShutdown() {
nsresult
GetAddrInfo(const char* aHost, uint16_t aAddressFamily, uint16_t aFlags,
const char* aNetworkInterface,
UniquePtr<AddrInfo>& aAddrInfo, bool aGetTtl)
const char* aNetworkInterface, AddrInfo** aAddrInfo, bool aGetTtl)
{
if (NS_WARN_IF(!aHost)) {
if (NS_WARN_IF(!aHost) || NS_WARN_IF(!aAddrInfo)) {
return NS_ERROR_NULL_POINTER;
}
@ -335,7 +335,7 @@ GetAddrInfo(const char* aHost, uint16_t aAddressFamily, uint16_t aFlags,
}
#endif
aAddrInfo = nullptr;
*aAddrInfo = nullptr;
nsresult rv = _GetAddrInfo_Portable(aHost, aAddressFamily, aFlags,
aNetworkInterface, aAddrInfo);
@ -344,8 +344,8 @@ GetAddrInfo(const char* aHost, uint16_t aAddressFamily, uint16_t aFlags,
// Figure out the canonical name, or if that fails, just use the host name
// we have.
const char *name = nullptr;
if (aAddrInfo && !aAddrInfo->mCanonicalName.IsEmpty()) {
name = aAddrInfo->mCanonicalName.get();
if (*aAddrInfo != nullptr && (*aAddrInfo)->mCanonicalName) {
name = (*aAddrInfo)->mCanonicalName;
} else {
name = aHost;
}
@ -354,7 +354,7 @@ GetAddrInfo(const char* aHost, uint16_t aAddressFamily, uint16_t aFlags,
uint32_t ttl = 0;
nsresult ttlRv = _GetTTLData_Windows(name, &ttl, aAddressFamily);
if (NS_SUCCEEDED(ttlRv)) {
aAddrInfo->ttl = ttl;
(*aAddrInfo)->ttl = ttl;
LOG("Got TTL %u for %s (name = %s).", ttl, aHost, name);
} else {
LOG_WARNING("Could not get TTL for %s (cname = %s).", aHost, name);

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

@ -40,8 +40,7 @@ class AddrInfo;
*/
nsresult
GetAddrInfo(const char* aHost, uint16_t aAddressFamily, uint16_t aFlags,
const char* aNetworkInterface,
UniquePtr<AddrInfo>& aAddrInfo, bool aGetTtl);
const char* aNetworkInterface, AddrInfo** aAddrInfo, bool aGetTtl);
/**
* Initialize the GetAddrInfo module.

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

@ -88,21 +88,18 @@ nsDNSRecord::GetCanonicalName(nsACString &result)
NS_ENSURE_TRUE(mHostRecord->flags & nsHostResolver::RES_CANON_NAME,
NS_ERROR_NOT_AVAILABLE);
// if the record is for an IP address literal, then the canonical
// host name is the IP address literal.
const char *cname;
{
MutexAutoLock lock(mHostRecord->addr_info_lock);
// if the record is for an IP address literal, then the canonical
// host name is the IP address literal.
if (!mHostRecord->addr_info) {
result = mHostRecord->host;
return NS_OK;
}
if (mHostRecord->addr_info->mCanonicalName.IsEmpty()) {
result = mHostRecord->addr_info->mHostName;
} else {
result = mHostRecord->addr_info->mCanonicalName;
}
if (mHostRecord->addr_info)
cname = mHostRecord->addr_info->mCanonicalName ?
mHostRecord->addr_info->mCanonicalName :
mHostRecord->addr_info->mHostName;
else
cname = mHostRecord->host;
result.Assign(cname);
}
return NS_OK;
}

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

@ -231,6 +231,7 @@ nsHostRecord::CopyExpirationTimesAndFlagsFrom(const nsHostRecord *aFromHostRecor
nsHostRecord::~nsHostRecord()
{
Telemetry::Accumulate(Telemetry::DNS_BLACKLIST_COUNT, mBlacklistedCount);
delete addr_info;
}
bool
@ -598,8 +599,7 @@ nsHostResolver::ClearPendingQueue(PRCList *aPendingQ)
while (node != aPendingQ) {
nsHostRecord *rec = static_cast<nsHostRecord *>(node);
node = node->next;
OnLookupComplete(rec, NS_ERROR_ABORT,
mozilla::UniquePtr<AddrInfo>(nullptr));
OnLookupComplete(rec, NS_ERROR_ABORT, nullptr);
}
}
}
@ -870,6 +870,9 @@ nsHostResolver::ResolveHost(const char *host,
// addr_info.
MutexAutoLock lock(he->rec->addr_info_lock);
// XXX: note that this actually leaks addr_info.
// For some reason, freeing the memory causes a crash in
// nsDNSRecord::GetNextAddr - see bug 1422173
he->rec->addr_info = nullptr;
if (unspecHe->rec->negative) {
he->rec->negative = unspecHe->rec->negative;
@ -884,7 +887,7 @@ nsHostResolver::ResolveHost(const char *host,
if ((af == addrIter->mAddress.inet.family) &&
!unspecHe->rec->Blacklisted(&addrIter->mAddress)) {
if (!he->rec->addr_info) {
he->rec->addr_info = mozilla::MakeUnique<AddrInfo>(
he->rec->addr_info = new AddrInfo(
unspecHe->rec->addr_info->mHostName,
unspecHe->rec->addr_info->mCanonicalName);
he->rec->CopyExpirationTimesAndFlagsFrom(unspecHe->rec);
@ -1240,7 +1243,7 @@ different_rrset(AddrInfo *rrset1, AddrInfo *rrset2)
return true;
}
LOG(("different_rrset %s\n", rrset1->mHostName.get()));
LOG(("different_rrset %s\n", rrset1->mHostName));
nsTArray<NetAddr> orderedSet1;
nsTArray<NetAddr> orderedSet2;
@ -1286,8 +1289,7 @@ different_rrset(AddrInfo *rrset1, AddrInfo *rrset2)
// returns LOOKUP_RESOLVEAGAIN, but only if 'status' is not NS_ERROR_ABORT.
// takes ownership of AddrInfo parameter
nsHostResolver::LookupStatus
nsHostResolver::OnLookupComplete(nsHostRecord* rec, nsresult status,
mozilla::UniquePtr<AddrInfo>&& newRRSet)
nsHostResolver::OnLookupComplete(nsHostRecord* rec, nsresult status, AddrInfo* newRRSet)
{
// get the list of pending callbacks for this lookup, and notify
// them that the lookup is complete.
@ -1299,6 +1301,7 @@ nsHostResolver::OnLookupComplete(nsHostRecord* rec, nsresult status,
if (rec->mResolveAgain && (status != NS_ERROR_ABORT)) {
LOG(("nsHostResolver record %p resolve again due to flushcache\n", rec));
rec->mResolveAgain = false;
delete newRRSet;
return LOOKUP_RESOLVEAGAIN;
}
@ -1307,18 +1310,22 @@ nsHostResolver::OnLookupComplete(nsHostRecord* rec, nsresult status,
// update record fields. We might have a rec->addr_info already if a
// previous lookup result expired and we're reresolving it..
AddrInfo *old_addr_info;
{
MutexAutoLock lock(rec->addr_info_lock);
if (different_rrset(rec->addr_info.get(), newRRSet.get())) {
if (different_rrset(rec->addr_info, newRRSet)) {
LOG(("nsHostResolver record %p new gencnt\n", rec));
rec->addr_info = Move(newRRSet);
old_addr_info = rec->addr_info;
rec->addr_info = newRRSet;
rec->addr_info_gencnt++;
} else {
if (rec->addr_info && newRRSet) {
rec->addr_info->ttl = newRRSet->ttl;
}
old_addr_info = newRRSet;
}
}
delete old_addr_info;
rec->negative = !rec->addr_info;
PrepareRecordExpiration(rec);
@ -1468,7 +1475,7 @@ nsHostResolver::ThreadFunc(void *arg)
#endif
nsHostResolver *resolver = (nsHostResolver *)arg;
nsHostRecord *rec = nullptr;
mozilla::UniquePtr<AddrInfo> ai = nullptr;
AddrInfo *ai = nullptr;
while (rec || resolver->GetHostToLookup(&rec)) {
LOG(("DNS lookup thread - Calling getaddrinfo for host [%s%s%s].\n",
@ -1482,10 +1489,10 @@ nsHostResolver::ThreadFunc(void *arg)
#endif
nsresult status = GetAddrInfo(rec->host, rec->af, rec->flags, rec->netInterface,
ai, getTtl);
&ai, getTtl);
#if defined(RES_RETRY_ON_FAILURE)
if (NS_FAILED(status) && rs.Reset()) {
status = GetAddrInfo(rec->host, rec->af, rec->flags, rec->netInterface, ai,
status = GetAddrInfo(rec->host, rec->af, rec->flags, rec->netInterface, &ai,
getTtl);
}
#endif
@ -1521,8 +1528,7 @@ nsHostResolver::ThreadFunc(void *arg)
LOG_HOST(rec->host, rec->netInterface),
ai ? "success" : "failure: unknown host"));
if (LOOKUP_RESOLVEAGAIN == resolver->OnLookupComplete(rec, status,
mozilla::Move(ai))) {
if (LOOKUP_RESOLVEAGAIN == resolver->OnLookupComplete(rec, status, ai)) {
// leave 'rec' assigned and loop to make a renewed host resolve
LOG(("DNS lookup thread - Re-resolving host [%s%s%s].\n",
LOG_HOST(rec->host, rec->netInterface)));

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

@ -75,7 +75,7 @@ public:
*/
Mutex addr_info_lock;
int addr_info_gencnt; /* generation count of |addr_info| */
mozilla::UniquePtr<mozilla::net::AddrInfo> addr_info;
mozilla::net::AddrInfo *addr_info;
mozilla::UniquePtr<mozilla::net::NetAddr> addr;
bool negative; /* True if this record is a cache of a failed lookup.
Negative cache entries are valid just like any other
@ -318,8 +318,7 @@ private:
LOOKUP_RESOLVEAGAIN,
};
LookupStatus OnLookupComplete(nsHostRecord *, nsresult,
mozilla::UniquePtr<mozilla::net::AddrInfo>&&);
LookupStatus OnLookupComplete(nsHostRecord *, nsresult, mozilla::net::AddrInfo *);
void DeQueue(PRCList &aQ, nsHostRecord **aResult);
void ClearPendingQueue(PRCList *aPendingQueue);
nsresult ConditionallyCreateThread(nsHostRecord *rec);

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

@ -2051,6 +2051,10 @@ WebSocketChannel::PrimeNewOutgoingMessage()
if (!mCurrentOut)
return;
auto cleanupAfterFailure = MakeScopeExit([&] {
DeleteCurrentOutGoingMessage();
});
WsMsgType msgType = mCurrentOut->GetMsgType();
LOG(("WebSocketChannel::PrimeNewOutgoingMessage "
@ -2070,6 +2074,7 @@ WebSocketChannel::PrimeNewOutgoingMessage()
if (mClientClosed) {
DeleteCurrentOutGoingMessage();
PrimeNewOutgoingMessage();
cleanupAfterFailure.release();
return;
}
@ -2258,6 +2263,8 @@ WebSocketChannel::PrimeNewOutgoingMessage()
// mCurrentOut->Length() bytes from mCurrentOut. The latter may be
// coaleseced into the former for small messages or as the result of the
// compression process.
cleanupAfterFailure.release();
}
void

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

@ -4975,18 +4975,6 @@ HAVE_SYS_VFS_H
HAVE_SYS_MOUNT_H
"
dnl ========================================================
dnl Determine options to use for running the preprocessor.
dnl ========================================================
if test -z "$GNU_CC" -a "$OS_ARCH" = "WINNT"; then
PREPROCESS_OPTION="-P -Fi"
else
PREPROCESS_OPTION="-E -o "
fi
AC_SUBST(PREPROCESS_OPTION)
# Avoid using obsolete NSPR features
AC_DEFINE(NO_NSPR_10_SUPPORT)

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

@ -481,7 +481,7 @@ win64-ccov/debug:
tier: 3
worker-type: aws-provisioner-v1/gecko-{level}-b-win2012
worker:
max-run-time: 14400
max-run-time: 7200
env:
TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/win64/releng.manifest"
run:

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

@ -33,7 +33,7 @@ jobs:
by-project:
mozilla-beta: https://bounceradmin.mozilla.com/api
mozilla-release: https://bounceradmin.mozilla.com/api
maple: https://admin-bouncer.stage.mozaws.net/api/
maple: https://admin-bouncer-releng.stage.mozaws.net/api/
default: http://localhost/api
routes:
- index.releases.v1.{branch}.latest.fennec.latest.bouncer_submitter

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

@ -35,7 +35,7 @@ jobs:
by-project:
mozilla-beta: https://bounceradmin.mozilla.com/api
mozilla-release: https://bounceradmin.mozilla.com/api
maple: https://admin-bouncer.stage.mozaws.net/api/
maple: https://admin-bouncer-releng.stage.mozaws.net/api/
default: http://localhost/api
routes:
- index.releases.v1.{branch}.latest.fennec.latest.uptake_monitoring

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

@ -421,6 +421,7 @@ talos-xperf:
description: "Talos xperf"
try-name: xperf
treeherder-symbol: tc-T(x)
virtualization: virtual
run-on-projects:
by-test-platform:
windows7-32.*: ['mozilla-beta', 'mozilla-central', 'mozilla-inbound', 'autoland', 'try']
@ -430,17 +431,7 @@ talos-xperf:
- --suite=xperf
- --add-option
- --webServer,localhost
talos-xperf-stylo-disabled:
description: "Talos Stylo disabled xperf"
try-name: xperf-stylo-disabled
treeherder-symbol: tc-Tsd(x)
run-on-projects:
by-test-platform:
windows7-32.*: ['mozilla-beta', 'mozilla-central', 'try']
default: []
mozharness:
extra-options:
- --suite=xperf-stylo-disabled
- --add-option
- --webServer,localhost
config:
by-test-platform:
windows.*:
- talos/windows_vm_config.py

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

@ -895,6 +895,8 @@ def set_worker_type(config, tests):
if test.get('suite', '') == 'talos' and 'ccov' not in test['build-platform']:
if try_options.get('taskcluster_worker'):
test['worker-type'] = win_worker_type_platform['hardware']
elif test['virtualization'] == 'virtual':
test['worker-type'] = win_worker_type_platform[test['virtualization']]
else:
test['worker-type'] = 'buildbot-bridge/buildbot-bridge'
else:

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

@ -229,4 +229,4 @@ channel on irc.mozilla.org. Dont ask if you can ask a question, just
ask, and please wait for an answer as we might not be in your timezone.
[subscribe]: https://lists.mozilla.org/listinfo/tools-marionette
[archive]: http://groups.google.com/group/mozilla.tools.marionette
[archive]: https://groups.google.com/group/mozilla.tools.marionette

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

@ -602,4 +602,4 @@ There is also an IRC channel to talk about using and developing
geckodriver in #ateam on irc.mozilla.org.
[subscribe]: https://lists.mozilla.org/listinfo/tools-marionette
[archive]: http://groups.google.com/group/mozilla.tools.marionette
[archive]: https://groups.google.com/group/mozilla.tools.marionette

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

@ -204,4 +204,4 @@ channel on irc.mozilla.org. Dont ask if you can ask a question, just
ask, and please wait for an answer as we might not be in your timezone.
[subscribe]: https://lists.mozilla.org/listinfo/tools-marionette
[archive]: http://groups.google.com/group/mozilla.tools.marionette
[archive]: https://groups.google.com/group/mozilla.tools.marionette

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

@ -65,4 +65,4 @@ for an answer as we might not be in your timezone.
[WebDriver standard]: https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors
[reference client]: client/
[subscribe]: https://lists.mozilla.org/listinfo/tools-marionette
[archive]: http://groups.google.com/group/mozilla.tools.marionette
[archive]: https://groups.google.com/group/mozilla.tools.marionette

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

@ -2,17 +2,25 @@
Marionette
==========
Marionette is an automation driver for Mozilla's Gecko engine.
Marionette is the remote protocol that lets OOP programs communicate
with, instrument, and control Gecko.
Description
===========
Marionette is an automation driver for Mozillas Gecko engine.
It can remotely control either the UI or the internal JavaScript of
a Gecko platform, such as Firefox. It can control both the chrome
(i.e. menus and functions) or the content (the webpage loaded inside
the browsing context), giving a high level of control and ability
to replicate user actions. In addition to performing actions on the
browser, Marionette can also read the properties and attributes of
the DOM.
Gecko-based browsers, such as Firefox and Fennec. It can control
both the chrome and the content document, giving a high level of
control and ability to replicate user interaction. In addition
to performing actions on the browser, Marionette can also ready
properties and attributes of the DOM.
For users
=========
.. toctree::
:maxdepth: 1
@ -22,17 +30,42 @@ For users
See also:
* Documentation for `Marionette Python Client <http://marionette-client.readthedocs.io>`_,
which is used in-tree to write many kinds of Marionette-based tests.
* Documentation for `Firefox Puppeteer <http://firefox-puppeteer.readthedocs.io>`_, which is
used to in-tree to write Firefox UI tests.
* Documentation for `Marionette Python client`_., which is used
in-tree to write many kinds of Marionette-based tests.
* Documentation for `Firefox Puppeteer`_, which is used to in-tree
to write Firefox UI tests.
.. _Marionette Python client: http://marionette-client.readthedocs.io
.. _Firefox Puppeteer: http://firefox-puppeteer.readthedocs.io
For developers
==============
For marionette developers
==========================
.. toctree::
:maxdepth: 1
../CONTRIBUTING.md
NewContributors.md
Debugging.md
PythonTests.md
SeleniumAtoms.md
Bugs
====
Bugs are tracked in the `Testing :: Marionette` component.
Communication
=============
The mailing list for discussion is tools-marionette@lists.mozilla.org
(subscribe_, archive_). If you prefer real-time chat, there
is often someone in the #ateam IRC channel on irc.mozilla.org.
Dont ask if you can ask a question, just ask, and please wait
for an answer as we might not be in your timezone.
.. _subscribe: https://lists.mozilla.org/listinfo/tools-marionette
.. _archive: https://groups.google.com/group/mozilla.tools.marionette

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

@ -11,6 +11,9 @@
"C:\\$logfile": {
"ignore": true
},
"Z:\\$logfile": {
"ignore": true
},
"C:\\Windows\\Prefetch\\{prefetch}.pf": {
"ignore": true
},

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

@ -96033,18 +96033,6 @@
{}
]
],
"css/compositing/mix-blend-mode/mix-blend-mode-transition.html": [
[
"/css/compositing/mix-blend-mode/mix-blend-mode-transition.html",
[
[
"/css/compositing/mix-blend-mode/reference/mix-blend-mode-transition-ref.html",
"=="
]
],
{}
]
],
"css/compositing/mix-blend-mode/mix-blend-mode-video-sibling.html": [
[
"/css/compositing/mix-blend-mode/mix-blend-mode-video-sibling.html",
@ -228113,11 +228101,6 @@
{}
]
],
"css/compositing/mix-blend-mode/reference/mix-blend-mode-transition-ref.html": [
[
{}
]
],
"css/compositing/mix-blend-mode/reference/mix-blend-mode-video-notref.html": [
[
{}
@ -463558,10 +463541,6 @@
"b0cf703533a323305eb772c6def00afe21cdcdb8",
"reftest"
],
"css/compositing/mix-blend-mode/mix-blend-mode-transition.html": [
"2a9c826f5db1d9eb5a4748351a7d411b4c65a93b",
"reftest"
],
"css/compositing/mix-blend-mode/mix-blend-mode-video-sibling.html": [
"d9682264f4ce1859b0d7f22b8dfca5cc482028a8",
"reftest"
@ -463698,10 +463677,6 @@
"543892c3466ace307bd125801a2231dae3a95b92",
"support"
],
"css/compositing/mix-blend-mode/reference/mix-blend-mode-transition-ref.html": [
"2fdce2d337a053453bc339ffb7f9e0560c1f0095",
"support"
],
"css/compositing/mix-blend-mode/reference/mix-blend-mode-video-notref.html": [
"4407e55ee0412f2064caeee74acad93424a849c7",
"support"

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

@ -1,37 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Test: Blended element with transition</title>
<link rel="author" title="Mihai Tica" href="mailto:mitica@adobe.com">
<link rel="help" href="https://drafts.fxtf.org/compositing-1/#mix-blend-mode">
<meta name="assert" content="Test checks that an element having a transition applied on opacity blends with the parent element.">
<meta name="flags" content="dom"/>
<link rel="reviewer" title="Rik Cabanier" href="mailto:cabanier@adobe.com">
<link rel="reviewer" title="Mirela Budaes" href="mailto:mbudaes@adobe.com">
<link rel="match" href="reference/mix-blend-mode-transition-ref.html">
<style type="text/css">
div {
width: 100px;
height: 100px;
background: #FF0;
}
#blender {
background: #F00;
mix-blend-mode: difference;
transition: opacity 1s ease;
}
.opaqueBox {
opacity: 0.4;
}
</style>
</head>
<body>
<p>Test passes if you can see a fading green rectangle.</p>
<div><div id="blender"></div></div>
<script type="text/javascript">
setInterval(function(){ document.getElementById('blender').className = 'opaqueBox'; }, 100);
</script>
</body>
</html>

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

@ -1,30 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Test: Blended element with transition</title>
<link rel="author" title="Mihai Tica" href="mailto:mitica@adobe.com">
<meta name="flags" content="dom"/>
<style type="text/css">
div {
width: 100px;
height: 100px;
}
#blender {
background: #0F0;
transition: opacity 1s ease;
}
.opaqueBox {
opacity: 0.4;
}
</style>
</head>
<body>
<p>Test passes if you can see a fading green rectangle.</p>
<div style="background: #FF0;"><div id="blender"></div></div>
<script type="text/javascript">
setInterval(function(){ document.getElementById('blender').className = 'opaqueBox'; }, 100);
</script>
</body>
</html>

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

@ -8,4 +8,5 @@ skip-if = debug # Bug 1407501
skip-if = os == "android" && debug
[test_ext_contentscript_xrays.js]
[test_ext_contentScripts_register.js]
skip-if = os == "android"
[test_ext_adoption_with_xrays.js]

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

@ -9,5 +9,6 @@ skip-if = (toolkit == "cocoa" && e10s) # bug 1252223
[test_private_window_from_content.html]
[test_window_open_position_constraint.html]
skip-if = toolkit == 'android'
fail-if = (os == "win" && ccov) # bug 1421715
[test_window_open_units.html]
skip-if = toolkit == 'android'

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

@ -49,6 +49,7 @@ skip-if = os != 'win' || bits != 64
[test_crash_win64cfi_alloc_small.js]
head = head_crashreporter.js head_win64cfi.js
skip-if = os != 'win' || bits != 64
fail-if = os == 'win' && ccov
[test_crash_win64cfi_alloc_large.js]
head = head_crashreporter.js head_win64cfi.js
@ -61,6 +62,7 @@ skip-if = os != 'win' || bits != 64
[test_crash_win64cfi_save_nonvol_far.js]
head = head_crashreporter.js head_win64cfi.js
skip-if = os != 'win' || bits != 64
fail-if = os == 'win' && ccov
[test_crash_win64cfi_save_xmm128.js]
head = head_crashreporter.js head_win64cfi.js
@ -69,6 +71,7 @@ skip-if = os != 'win' || bits != 64
[test_crash_win64cfi_save_xmm128_far.js]
head = head_crashreporter.js head_win64cfi.js
skip-if = os != 'win' || bits != 64
fail-if = os == 'win' && ccov
[test_crash_win64cfi_epilog.js]
head = head_crashreporter.js head_win64cfi.js
@ -77,21 +80,25 @@ skip-if = os != 'win' || bits != 64
[test_crash_win64cfi_infinite_entry_chain.js]
head = head_crashreporter.js head_win64cfi.js
skip-if = os != 'win' || bits != 64
fail-if = os == 'win' && ccov
support-files = test_crash_win64cfi_infinite_entry_chain.exe
[test_crash_win64cfi_infinite_code_chain.js]
head = head_crashreporter.js head_win64cfi.js
skip-if = os != 'win' || bits != 64
fail-if = os == 'win' && ccov
support-files = test_crash_win64cfi_infinite_code_chain.exe
[test_crash_win64cfi_invalid_exception_rva.js]
head = head_crashreporter.js head_win64cfi.js
skip-if = os != 'win' || bits != 64
fail-if = os == 'win' && ccov
support-files = test_crash_win64cfi_invalid_exception_rva.exe
[test_crash_win64cfi_not_a_pe.js]
head = head_crashreporter.js head_win64cfi.js
skip-if = os != 'win' || bits != 64
fail-if = os == 'win' && ccov
support-files = test_crash_win64cfi_not_a_pe.exe

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

@ -30,6 +30,7 @@ tags = blocklist
[test_ProductAddonChecker.js]
[test_shutdown.js]
[test_system_update_blank.js]
fail-if = os == 'win' && ccov
[test_system_update_checkSizeHash.js]
[test_system_update_custom.js]
[test_system_update_empty.js]

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

@ -7,6 +7,7 @@
[DEFAULT]
tags = appupdate
head = head_update.js
fail-if = os == 'win' && ccov
[bootstrapSvc.js]
run-sequentially = Uses the Mozilla Maintenance Service.