Merge inbound to mozilla-central. a=merge

This commit is contained in:
Noemi Erli 2018-10-26 18:47:58 +03:00
commit 98d13d0806
18 changed files with 98 additions and 67 deletions

View File

@ -28,7 +28,7 @@ using namespace mozilla::a11y;
ARIAGridAccessible::
ARIAGridAccessible(nsIContent* aContent, DocAccessible* aDoc) :
AccessibleWrap(aContent, aDoc)
HyperTextAccessibleWrap(aContent, aDoc)
{
mGenericTypes |= eTable;
}
@ -534,7 +534,7 @@ ARIAGridAccessible::SetARIASelected(Accessible* aAccessible,
ARIARowAccessible::
ARIARowAccessible(nsIContent* aContent, DocAccessible* aDoc) :
AccessibleWrap(aContent, aDoc)
HyperTextAccessibleWrap(aContent, aDoc)
{
mGenericTypes |= eTableRow;
}

View File

@ -16,13 +16,13 @@ namespace a11y {
/**
* Accessible for ARIA grid and treegrid.
*/
class ARIAGridAccessible : public AccessibleWrap,
class ARIAGridAccessible : public HyperTextAccessibleWrap,
public TableAccessible
{
public:
ARIAGridAccessible(nsIContent* aContent, DocAccessible* aDoc);
NS_INLINE_DECL_REFCOUNTING_INHERITED(ARIAGridAccessible, AccessibleWrap)
NS_INLINE_DECL_REFCOUNTING_INHERITED(ARIAGridAccessible, HyperTextAccessibleWrap)
// Accessible
virtual a11y::role NativeRole() const override;
@ -68,12 +68,12 @@ protected:
/**
* Accessible for ARIA row.
*/
class ARIARowAccessible : public AccessibleWrap
class ARIARowAccessible : public HyperTextAccessibleWrap
{
public:
ARIARowAccessible(nsIContent* aContent, DocAccessible* aDoc);
NS_INLINE_DECL_REFCOUNTING_INHERITED(ARIARowAccessible, AccessibleWrap)
NS_INLINE_DECL_REFCOUNTING_INHERITED(ARIARowAccessible, HyperTextAccessibleWrap)
// Accessible
virtual a11y::role NativeRole() const override;

View File

@ -86,17 +86,17 @@ public:
/**
* HTML table row accessible (html:tr).
*/
class HTMLTableRowAccessible : public AccessibleWrap
class HTMLTableRowAccessible : public HyperTextAccessibleWrap
{
public:
HTMLTableRowAccessible(nsIContent* aContent, DocAccessible* aDoc) :
AccessibleWrap(aContent, aDoc)
HyperTextAccessibleWrap(aContent, aDoc)
{
mType = eHTMLTableRowType;
mGenericTypes |= eTableRow;
}
NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableRowAccessible, AccessibleWrap)
NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableRowAccessible, HyperTextAccessibleWrap)
// Accessible
virtual a11y::role NativeRole() const override;
@ -116,18 +116,18 @@ protected:
// data vs. layout heuristic
// #define SHOW_LAYOUT_HEURISTIC
class HTMLTableAccessible : public AccessibleWrap,
class HTMLTableAccessible : public HyperTextAccessibleWrap,
public TableAccessible
{
public:
HTMLTableAccessible(nsIContent* aContent, DocAccessible* aDoc) :
AccessibleWrap(aContent, aDoc)
HyperTextAccessibleWrap(aContent, aDoc)
{
mType = eHTMLTableType;
mGenericTypes |= eTable;
}
NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableAccessible, AccessibleWrap)
NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableAccessible, HyperTextAccessibleWrap)
// TableAccessible
virtual Accessible* Caption() const override;

View File

@ -230,7 +230,7 @@
relations: {
RELATION_LABELLED_BY: "caption",
},
interfaces: nsIAccessibleTable,
interfaces: [ nsIAccessibleText, nsIAccessibleHyperText, nsIAccessibleTable ],
children: [
{
role: ROLE_CAPTION,
@ -241,6 +241,7 @@
},
{ // td inside thead
role: ROLE_ROW,
interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
children: [
{
role: ROLE_COLUMNHEADER,

View File

@ -93,7 +93,7 @@
testTextRange(a11yrange, "selection range #7", document, 4, document, 5);
ok(a11yrange.crop(getAccessible("table")), "Range failed to crop #7.");
testTextRange(a11yrange, "cropped range #7", "c2", 5, "c2", 6);
testTextRange(a11yrange, "cropped range #7", "table", 0, "table", 1);
SimpleTest.finish();
}

View File

@ -21,7 +21,7 @@ static const uint32_t XPC_TABLE_DEFAULT_SIZE = 40;
// nsISupports
NS_IMPL_ISUPPORTS_INHERITED(xpcAccessibleTable,
xpcAccessibleGeneric,
xpcAccessibleHyperText,
nsIAccessibleTable)
////////////////////////////////////////////////////////////////////////////////

View File

@ -8,7 +8,7 @@
#define mozilla_a11y_xpcAccessibleTable_h_
#include "nsIAccessibleTable.h"
#include "xpcAccessibleGeneric.h"
#include "xpcAccessibleHyperText.h"
namespace mozilla {
namespace a11y {
@ -16,15 +16,15 @@ namespace a11y {
/**
* XPCOM wrapper around TableAccessible class.
*/
class xpcAccessibleTable : public xpcAccessibleGeneric,
class xpcAccessibleTable : public xpcAccessibleHyperText,
public nsIAccessibleTable
{
public:
explicit xpcAccessibleTable(Accessible* aIntl) :
xpcAccessibleGeneric(aIntl) { }
xpcAccessibleHyperText(aIntl) { }
xpcAccessibleTable(ProxyAccessible* aProxy, uint32_t aInterfaces) :
xpcAccessibleGeneric(aProxy, aInterfaces) {}
xpcAccessibleHyperText(aProxy, aInterfaces) {}
NS_DECL_ISUPPORTS_INHERITED

View File

@ -28,12 +28,14 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(PerformanceObserver)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mCallback)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mPerformance)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwner)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mQueuedEntries)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(PerformanceObserver)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCallback)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPerformance)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mQueuedEntries)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(PerformanceObserver)

View File

@ -4,5 +4,5 @@ support-files =
bug527935.html
bug527935_2.html
[browser_bug629172.js]
skip-if = toolkit == 'android'
skip-if = toolkit == 'android' || debug && ((os == 'mac') || (os == 'win' && os_version == '10.0' && bits == 64)) # Bug 1446282
support-files = bug629172.html

View File

@ -240,10 +240,6 @@ AnimationFrameDiscardingQueue::AdvanceInternal()
imgFrame*
AnimationFrameDiscardingQueue::Get(size_t aFrame, bool aForDisplay)
{
// If we are advancing on behalf of the animation, we don't expect it to be
// getting any frames (besides the first) until we get the desired frame.
MOZ_ASSERT(aFrame == 0 || mAdvance == 0);
// The first frame is stored separately. If we only need the frame for
// display purposes, we can return it right away. If we need it for advancing
// the animation, we want to verify the recreated first frame is available
@ -271,6 +267,10 @@ AnimationFrameDiscardingQueue::Get(size_t aFrame, bool aForDisplay)
return nullptr;
}
// If we are advancing on behalf of the animation, we don't expect it to be
// getting any frames (besides the first) until we get the desired frame.
MOZ_ASSERT(aFrame == 0 || mAdvance == 0);
// If we have space for the frame, it should always be available.
MOZ_ASSERT(mDisplay[offset]);
return mDisplay[offset].get();
@ -305,10 +305,13 @@ AnimationFrameDiscardingQueue::AddSizeOfExcludingThis(MallocSizeOf aMallocSizeOf
for (const RefPtr<imgFrame>& frame : mDisplay) {
++i;
if (mSize < i) {
// First frame again, we already covered it above.
MOZ_ASSERT(mFirstFrame.get() == frame.get());
i = 1;
continue;
if (mFirstFrame.get() == frame.get()) {
// First frame again, we already covered it above. We can have a
// different frame in the first frame position in the discard queue
// on subsequent passes of the animation. This is useful for recycling.
continue;
}
}
frame->AddSizeOfExcludingThis(aMallocSizeOf,

View File

@ -369,6 +369,18 @@ set_define('JS_JITSPEW',
set_config('JS_JITSPEW',
depends_if('--enable-jitspew')(lambda _: True))
# When enabled, masm will generate assumeUnreachable calls that act as
# assertions in the generated code. This option is worth disabling when you
# have to track mutated values through the generated code, to avoid constantly
# dumping registers on and off the stack.
js_option('--enable-masm-verbose',
default=depends(when=moz_debug)(lambda: True),
help='Enable MacroAssembler verbosity of generated code.')
set_define('JS_MASM_VERBOSE',
depends_if('--enable-masm-verbose')(lambda _: True))
set_config('JS_MASM_VERBOSE',
depends_if('--enable-masm-verbose')(lambda _: True))
js_option('--enable-more-deterministic', env='JS_MORE_DETERMINISTIC',
help='Enable changes that make the shell more deterministic')

View File

@ -939,6 +939,10 @@ frontend::CompileLazyBinASTFunction(JSContext* cx, Handle<LazyScript*> lazy, con
MOZ_ASSERT(lazy->enclosingScriptHasEverBeenCompiled());
MOZ_ASSERT(lazy->isBinAST());
AutoAssertReportedException assertException(cx);
Rooted<JSFunction*> fun(cx, lazy->functionNonDelazifying());
AutoAssertFunctionDelazificationCompletion delazificationCompletion(cx, fun);
CompileOptions options(cx);
options.setMutedErrors(lazy->mutedErrors())
.setFileAndLine(lazy->filename(), lazy->lineno())
@ -986,10 +990,8 @@ frontend::CompileLazyBinASTFunction(JSContext* cx, Handle<LazyScript*> lazy, con
return false;
}
if (!NameFunctions(cx, pn)) {
return false;
}
delazificationCompletion.complete();
assertException.reset();
return script;
}

View File

@ -50,9 +50,9 @@
* 1. ... JS work, which leads to a request to do GC ...
* 2. [first GC slice, which performs all root marking and possibly more marking]
* 3. ... more JS work is allowed to run ...
* 4. [GC mark slice, which runs entirely in drainMarkStack]
* 4. [GC mark slice, which runs entirely in GCRuntime::markUntilBudgetExhaused]
* 5. ... more JS work ...
* 6. [GC mark slice, which runs entirely in drainMarkStack]
* 6. [GC mark slice, which runs entirely in GCRuntime::markUntilBudgetExhaused]
* 7. ... more JS work ...
* 8. [GC marking finishes; sweeping done non-incrementally; GC is done]
* 9. ... JS continues uninterrupted now that GC is finishes ...

View File

@ -4814,8 +4814,7 @@ GCRuntime::markWeakReferences(gcstats::PhaseKind phase)
marker.enterWeakMarkingMode();
// TODO bug 1167452: Make weak marking incremental
auto unlimited = SliceBudget::unlimited();
MOZ_RELEASE_ASSERT(marker.drainMarkStack(unlimited));
drainMarkStack();
for (;;) {
bool markedAny = false;
@ -4831,8 +4830,7 @@ GCRuntime::markWeakReferences(gcstats::PhaseKind phase)
break;
}
auto unlimited = SliceBudget::unlimited();
MOZ_RELEASE_ASSERT(marker.drainMarkStack(unlimited));
drainMarkStack();
}
MOZ_ASSERT(marker.isDrained());
@ -4845,7 +4843,7 @@ GCRuntime::markWeakReferencesInCurrentGroup(gcstats::PhaseKind phase)
markWeakReferences<SweepGroupZonesIter>(phase);
}
template <class ZoneIterT, class CompartmentIterT>
template <class ZoneIterT>
void
GCRuntime::markGrayReferences(gcstats::PhaseKind phase)
{
@ -4860,14 +4858,13 @@ GCRuntime::markGrayReferences(gcstats::PhaseKind phase)
(*op)(&marker, grayRootTracer.data);
}
}
auto unlimited = SliceBudget::unlimited();
MOZ_RELEASE_ASSERT(marker.drainMarkStack(unlimited));
drainMarkStack();
}
void
GCRuntime::markGrayReferencesInCurrentGroup(gcstats::PhaseKind phase)
{
markGrayReferences<SweepGroupZonesIter, SweepGroupCompartmentsIter>(phase);
markGrayReferences<SweepGroupZonesIter>(phase);
}
void
@ -4879,7 +4876,7 @@ GCRuntime::markAllWeakReferences(gcstats::PhaseKind phase)
void
GCRuntime::markAllGrayReferences(gcstats::PhaseKind phase)
{
markGrayReferences<GCZonesIter, GCCompartmentsIter>(phase);
markGrayReferences<GCZonesIter>(phase);
}
#ifdef JS_GC_ZEAL
@ -5028,8 +5025,7 @@ js::gc::MarkingValidator::nonIncrementalMark(AutoGCSession& session)
gc->traceRuntimeForMajorGC(gcmarker, session);
gc->incrementalState = State::Mark;
auto unlimited = SliceBudget::unlimited();
MOZ_RELEASE_ASSERT(gc->marker.drainMarkStack(unlimited));
gc->drainMarkStack();
}
gc->incrementalState = State::Sweep;
@ -5559,8 +5555,7 @@ GCRuntime::markIncomingCrossCompartmentPointers(MarkColor color)
}
}
auto unlimited = SliceBudget::unlimited();
MOZ_RELEASE_ASSERT(marker.drainMarkStack(unlimited));
drainMarkStack();
}
static bool
@ -6263,7 +6258,7 @@ ArenaLists::foregroundFinalize(FreeOp* fop, AllocKind thingKind, SliceBudget& sl
}
IncrementalProgress
GCRuntime::drainMarkStack(SliceBudget& sliceBudget, gcstats::PhaseKind phase)
GCRuntime::markUntilBudgetExhaused(SliceBudget& sliceBudget, gcstats::PhaseKind phase)
{
// Marked GC things may vary between recording and replaying, so marking
// and sweeping should not perform any recorded events.
@ -6271,7 +6266,14 @@ GCRuntime::drainMarkStack(SliceBudget& sliceBudget, gcstats::PhaseKind phase)
/* Run a marking slice and return whether the stack is now empty. */
gcstats::AutoPhase ap(stats(), phase);
return marker.drainMarkStack(sliceBudget) ? Finished : NotFinished;
return marker.markUntilBudgetExhaused(sliceBudget) ? Finished : NotFinished;
}
void
GCRuntime::drainMarkStack()
{
auto unlimited = SliceBudget::unlimited();
MOZ_RELEASE_ASSERT(marker.markUntilBudgetExhaused(unlimited));
}
static void
@ -6980,7 +6982,7 @@ GCRuntime::performSweepActions(SliceBudget& budget)
if (initialState != State::Sweep) {
MOZ_ASSERT(marker.isDrained());
} else {
if (drainMarkStack(budget, gcstats::PhaseKind::SWEEP_MARK) == NotFinished) {
if (markUntilBudgetExhaused(budget, gcstats::PhaseKind::SWEEP_MARK) == NotFinished) {
return NotFinished;
}
}
@ -7295,7 +7297,7 @@ GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoGCSession& session)
isCompacting = false;
auto unlimited = SliceBudget::unlimited();
incrementalCollectSlice(unlimited, JS::gcreason::RESET, session);
incrementalSlice(unlimited, JS::gcreason::RESET, session);
isCompacting = wasCompacting;
@ -7316,7 +7318,7 @@ GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoGCSession& session)
isCompacting = false;
auto unlimited = SliceBudget::unlimited();
incrementalCollectSlice(unlimited, JS::gcreason::RESET, session);
incrementalSlice(unlimited, JS::gcreason::RESET, session);
isCompacting = wasCompacting;
@ -7331,7 +7333,7 @@ GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoGCSession& session)
zonesToMaybeCompact.ref().clear();
auto unlimited = SliceBudget::unlimited();
incrementalCollectSlice(unlimited, JS::gcreason::RESET, session);
incrementalSlice(unlimited, JS::gcreason::RESET, session);
isCompacting = wasCompacting;
break;
@ -7339,7 +7341,7 @@ GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoGCSession& session)
case State::Decommit: {
auto unlimited = SliceBudget::unlimited();
incrementalCollectSlice(unlimited, JS::gcreason::RESET, session);
incrementalSlice(unlimited, JS::gcreason::RESET, session);
break;
}
}
@ -7433,7 +7435,7 @@ ShouldCleanUpEverything(JS::gcreason::Reason reason, JSGCInvocationKind gckind)
}
GCRuntime::IncrementalResult
GCRuntime::incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason reason,
GCRuntime::incrementalSlice(SliceBudget& budget, JS::gcreason::Reason reason,
AutoGCSession& session)
{
AutoDisableBarriers disableBarriers(rt);
@ -7525,7 +7527,7 @@ GCRuntime::incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason rea
stats().nonincremental(AbortReason::GrayRootBufferingFailed);
}
if (drainMarkStack(budget, gcstats::PhaseKind::MARK) == NotFinished) {
if (markUntilBudgetExhaused(budget, gcstats::PhaseKind::MARK) == NotFinished) {
break;
}
@ -7941,7 +7943,7 @@ GCRuntime::gcCycle(bool nonincrementalByAPI, SliceBudget& budget,
gcTracer.traceMajorGCStart();
result = incrementalCollectSlice(budget, reason, session);
result = incrementalSlice(budget, reason, session);
chunkAllocationSinceLastGC = false;
@ -8738,7 +8740,7 @@ GCRuntime::runDebugGC()
}
} else if (hasIncrementalTwoSliceZealMode()) {
// These modes trigger incremental GC that happens in two slices and the
// supplied budget is ignored by incrementalCollectSlice.
// supplied budget is ignored by incrementalSlice.
budget = SliceBudget(WorkBudget(1));
if (!isIncrementalGCInProgress()) {

View File

@ -301,7 +301,7 @@ class GCMarker : public JSTracer
return isMarkStackEmpty() && !unmarkedArenaStackTop;
}
MOZ_MUST_USE bool drainMarkStack(SliceBudget& budget);
MOZ_MUST_USE bool markUntilBudgetExhaused(SliceBudget& budget);
void setGCMode(JSGCMode mode) { stack.setGCMode(mode); }

View File

@ -593,9 +593,9 @@ class GCRuntime
SliceBudget& budget,
JS::gcreason::Reason reason);
bool shouldRepeatForDeadZone(JS::gcreason::Reason reason);
IncrementalResult incrementalCollectSlice(SliceBudget& budget,
JS::gcreason::Reason reason,
AutoGCSession& session);
IncrementalResult incrementalSlice(SliceBudget& budget,
JS::gcreason::Reason reason,
AutoGCSession& session);
MOZ_MUST_USE bool shouldCollectNurseryForSlice(bool nonincrementalByAPI,
SliceBudget& budget);
@ -614,10 +614,11 @@ class GCRuntime
void traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark);
void maybeDoCycleCollection();
void markCompartments();
IncrementalProgress drainMarkStack(SliceBudget& sliceBudget, gcstats::PhaseKind phase);
template <class CompartmentIterT> void markWeakReferences(gcstats::PhaseKind phase);
IncrementalProgress markUntilBudgetExhaused(SliceBudget& sliceBudget, gcstats::PhaseKind phase);
void drainMarkStack();
template <class ZoneIterT> void markWeakReferences(gcstats::PhaseKind phase);
void markWeakReferencesInCurrentGroup(gcstats::PhaseKind phase);
template <class ZoneIterT, class CompartmentIterT> void markGrayReferences(gcstats::PhaseKind phase);
template <class ZoneIterT> void markGrayReferences(gcstats::PhaseKind phase);
void markBufferedGrayRoots(JS::Zone* zone);
void markGrayReferencesInCurrentGroup(gcstats::PhaseKind phase);
void markAllWeakReferences(gcstats::PhaseKind phase);

View File

@ -1623,7 +1623,7 @@ VisitTraceList(F f, const int32_t* traceList, uint8_t* memory, Args&&... args)
/*** Mark-stack Marking ***************************************************************************/
bool
GCMarker::drainMarkStack(SliceBudget& budget)
GCMarker::markUntilBudgetExhaused(SliceBudget& budget)
{
#ifdef DEBUG
MOZ_ASSERT(!strictCompartmentChecking);

View File

@ -2074,7 +2074,7 @@ MacroAssembler::handleFailure()
jump(excTail);
}
#ifdef DEBUG
#ifdef JS_MASM_VERBOSE
static void
AssumeUnreachable_(const char* output) {
MOZ_ReportAssertionFailure(output, __FILE__, __LINE__);
@ -2084,7 +2084,7 @@ AssumeUnreachable_(const char* output) {
void
MacroAssembler::assumeUnreachable(const char* output)
{
#ifdef DEBUG
#ifdef JS_MASM_VERBOSE
if (!IsCompilingWasm()) {
AllocatableRegisterSet regs(RegisterSet::Volatile());
LiveRegisterSet save(regs.asLiveSet());
@ -2119,6 +2119,7 @@ MacroAssembler::assertTestInt32(Condition cond, const T& value, const char* outp
template void MacroAssembler::assertTestInt32(Condition, const Address&, const char*);
#ifdef JS_MASM_VERBOSE
static void
Printf0_(const char* output)
{
@ -2129,10 +2130,12 @@ Printf0_(const char* output)
// output, and it's always unbuffered.
fprintf(stderr, "%s", output);
}
#endif
void
MacroAssembler::printf(const char* output)
{
#ifdef JS_MASM_VERBOSE
AllocatableRegisterSet regs(RegisterSet::Volatile());
LiveRegisterSet save(regs.asLiveSet());
PushRegsInMask(save);
@ -2145,8 +2148,10 @@ MacroAssembler::printf(const char* output)
callWithABI(JS_FUNC_TO_DATA_PTR(void*, Printf0_));
PopRegsInMask(save);
#endif
}
#ifdef JS_MASM_VERBOSE
static void
Printf1_(const char* output, uintptr_t value)
{
@ -2158,10 +2163,12 @@ Printf1_(const char* output, uintptr_t value)
}
fprintf(stderr, "%s", line.get());
}
#endif
void
MacroAssembler::printf(const char* output, Register value)
{
#ifdef JS_MASM_VERBOSE
AllocatableRegisterSet regs(RegisterSet::Volatile());
LiveRegisterSet save(regs.asLiveSet());
PushRegsInMask(save);
@ -2177,6 +2184,7 @@ MacroAssembler::printf(const char* output, Register value)
callWithABI(JS_FUNC_TO_DATA_PTR(void*, Printf1_));
PopRegsInMask(save);
#endif
}
#ifdef JS_TRACE_LOGGING