+ ++ + diff --git a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp index 12eb661d09f8..53f615db8a35 100644 --- a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp +++ b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp @@ -38,8 +38,6 @@ using namespace mozilla; using namespace mozilla::dom; -static NS_DEFINE_CID(kXMLDocumentCID, NS_XMLDOCUMENT_CID); - /** * Output Handler Factories */ @@ -1108,9 +1106,10 @@ txMozillaXSLTProcessor::reportError(nsresult aResult, void txMozillaXSLTProcessor::notifyError() { - nsCOMPtr
(std::move(codeTier), metadata,
- std::move(jumpTables),
- std::move(dataSegments),
- std::move(elemSegments));
+ MutableCode code = js_new(std::move(codeTier), metadata, std::move(jumpTables));
if (!code || !code->initialize(bytecode, linkData)) {
return nullptr;
}
diff --git a/js/src/wasm/WasmCode.h b/js/src/wasm/WasmCode.h
index 762b9e94cb2e..063e1b24da4b 100644
--- a/js/src/wasm/WasmCode.h
+++ b/js/src/wasm/WasmCode.h
@@ -213,7 +213,6 @@ class FuncExport
FuncType funcType_;
MOZ_INIT_OUTSIDE_CTOR struct CacheablePod {
uint32_t funcIndex_;
- uint32_t funcCodeRangeIndex_;
uint32_t eagerInterpEntryOffset_; // Machine code offset
bool hasEagerStubs_;
} pod;
@@ -224,7 +223,6 @@ class FuncExport
: funcType_(std::move(funcType))
{
pod.funcIndex_ = funcIndex;
- pod.funcCodeRangeIndex_ = UINT32_MAX;
pod.eagerInterpEntryOffset_ = UINT32_MAX;
pod.hasEagerStubs_ = hasEagerStubs;
}
@@ -233,10 +231,6 @@ class FuncExport
MOZ_ASSERT(hasEagerStubs());
pod.eagerInterpEntryOffset_ = entryOffset;
}
- void initFuncCodeRangeIndex(uint32_t codeRangeIndex) {
- MOZ_ASSERT(pod.funcCodeRangeIndex_ == UINT32_MAX);
- pod.funcCodeRangeIndex_ = codeRangeIndex;
- }
bool hasEagerStubs() const {
return pod.hasEagerStubs_;
@@ -247,10 +241,6 @@ class FuncExport
uint32_t funcIndex() const {
return pod.funcIndex_;
}
- uint32_t funcCodeRangeIndex() const {
- MOZ_ASSERT(pod.funcCodeRangeIndex_ != UINT32_MAX);
- return pod.funcCodeRangeIndex_;
- }
uint32_t eagerInterpEntryOffset() const {
MOZ_ASSERT(pod.eagerInterpEntryOffset_ != UINT32_MAX);
MOZ_ASSERT(hasEagerStubs());
@@ -491,6 +481,7 @@ struct MetadataTier
const Tier tier;
+ Uint32Vector funcToCodeRange;
CodeRangeVector codeRanges;
CallSiteVector callSites;
TrapSiteVectorArray trapSites;
@@ -499,11 +490,14 @@ struct MetadataTier
// Debug information, not serialized.
Uint32Vector debugTrapFarJumpOffsets;
- Uint32Vector debugFuncToCodeRange;
FuncExport& lookupFuncExport(uint32_t funcIndex, size_t* funcExportIndex = nullptr);
const FuncExport& lookupFuncExport(uint32_t funcIndex, size_t* funcExportIndex = nullptr) const;
+ const CodeRange& codeRange(const FuncExport& funcExport) const {
+ return codeRanges[funcToCodeRange[funcExport.funcIndex()]];
+ }
+
bool clone(const MetadataTier& src);
WASM_DECLARE_SERIALIZABLE(MetadataTier);
@@ -729,13 +723,11 @@ class Code : public ShareableBase
SharedMetadata metadata_;
ExclusiveData profilingLabels_;
JumpTables jumpTables_;
- const DataSegmentVector dataSegments_;
- const ElemSegmentVector elemSegments_;
public:
- Code(UniqueCodeTier tier1, const Metadata& metadata,
- JumpTables&& maybeJumpTables, DataSegmentVector&& dataSegments,
- ElemSegmentVector&& elemSegments);
+ Code(UniqueCodeTier tier1,
+ const Metadata& metadata,
+ JumpTables&& maybeJumpTables);
bool initialized() const { return tier1_->initialized(); }
bool initialize(const ShareableBytes& bytecode, const LinkData& linkData);
@@ -760,8 +752,6 @@ class Code : public ShareableBase
const CodeTier& codeTier(Tier tier) const;
const Metadata& metadata() const { return *metadata_; }
- const DataSegmentVector& dataSegments() const { return dataSegments_; }
- const ElemSegmentVector& elemSegments() const { return elemSegments_; }
const ModuleSegment& segment(Tier iter) const {
return codeTier(iter).segment();
diff --git a/js/src/wasm/WasmDebug.cpp b/js/src/wasm/WasmDebug.cpp
index bd1b58a130ec..e9717524648d 100644
--- a/js/src/wasm/WasmDebug.cpp
+++ b/js/src/wasm/WasmDebug.cpp
@@ -171,7 +171,7 @@ bool
DebugState::incrementStepModeCount(JSContext* cx, uint32_t funcIndex)
{
MOZ_ASSERT(debugEnabled());
- const CodeRange& codeRange = codeRanges(Tier::Debug)[debugFuncToCodeRangeIndex(funcIndex)];
+ const CodeRange& codeRange = codeRanges(Tier::Debug)[funcToCodeRangeIndex(funcIndex)];
MOZ_ASSERT(codeRange.isFunction());
StepModeCounters::AddPtr p = stepModeCounters_.lookupForAdd(funcIndex);
@@ -205,7 +205,7 @@ bool
DebugState::decrementStepModeCount(FreeOp* fop, uint32_t funcIndex)
{
MOZ_ASSERT(debugEnabled());
- const CodeRange& codeRange = codeRanges(Tier::Debug)[debugFuncToCodeRangeIndex(funcIndex)];
+ const CodeRange& codeRange = codeRanges(Tier::Debug)[funcToCodeRangeIndex(funcIndex)];
MOZ_ASSERT(codeRange.isFunction());
MOZ_ASSERT(!stepModeCounters_.empty());
@@ -402,7 +402,7 @@ DebugState::debugGetLocalTypes(uint32_t funcIndex, ValTypeVector* locals, size_t
}
// Decode local var types from wasm binary function body.
- const CodeRange& range = codeRanges(Tier::Debug)[debugFuncToCodeRangeIndex(funcIndex)];
+ const CodeRange& range = codeRanges(Tier::Debug)[funcToCodeRangeIndex(funcIndex)];
// In wasm, the Code points to the function start via funcLineOrBytecode.
MOZ_ASSERT(!metadata().isAsmJS() && maybeBytecode_);
size_t offsetInModule = range.funcLineOrBytecode();
diff --git a/js/src/wasm/WasmDebug.h b/js/src/wasm/WasmDebug.h
index d2b458f311b1..8e35e9cc9cf5 100644
--- a/js/src/wasm/WasmDebug.h
+++ b/js/src/wasm/WasmDebug.h
@@ -124,8 +124,8 @@ class DebugState
const CodeRangeVector& codeRanges(Tier t) const { return metadata(t).codeRanges; }
const CallSiteVector& callSites(Tier t) const { return metadata(t).callSites; }
- uint32_t debugFuncToCodeRangeIndex(uint32_t funcIndex) const {
- return metadata(Tier::Debug).debugFuncToCodeRange[funcIndex];
+ uint32_t funcToCodeRangeIndex(uint32_t funcIndex) const {
+ return metadata(Tier::Debug).funcToCodeRange[funcIndex];
}
// about:memory reporting:
diff --git a/js/src/wasm/WasmGenerator.cpp b/js/src/wasm/WasmGenerator.cpp
index 63b40f26b38b..c1fe910d8129 100644
--- a/js/src/wasm/WasmGenerator.cpp
+++ b/js/src/wasm/WasmGenerator.cpp
@@ -202,10 +202,10 @@ ModuleGenerator::init(Metadata* maybeAsmJSMetadata)
return false;
}
- // The funcToCodeRange_ maps function indices to code-range indices and all
+ // funcToCodeRange maps function indices to code-range indices and all
// elements will be initialized by the time module generation is finished.
- if (!funcToCodeRange_.appendN(BAD_CODE_RANGE, env_->funcTypes.length())) {
+ if (!metadataTier_->funcToCodeRange.appendN(BAD_CODE_RANGE, env_->funcTypes.length())) {
return false;
}
@@ -327,12 +327,12 @@ ModuleGenerator::init(Metadata* maybeAsmJSMetadata)
}
}
- for (ElemSegment& elems : env_->elemSegments) {
- if (env_->tables[elems.tableIndex].external) {
- if (!exportedFuncs.reserve(exportedFuncs.length() + elems.elemFuncIndices.length())) {
+ for (const ElemSegment* seg : env_->elemSegments) {
+ if (env_->tables[seg->tableIndex].external) {
+ if (!exportedFuncs.reserve(exportedFuncs.length() + seg->length())) {
return false;
}
- for (uint32_t funcIndex : elems.elemFuncIndices) {
+ for (uint32_t funcIndex : seg->elemFuncIndices) {
exportedFuncs.infallibleEmplaceBack(funcIndex, false);
}
}
@@ -414,14 +414,14 @@ ModuleGenerator::init(Metadata* maybeAsmJSMetadata)
bool
ModuleGenerator::funcIsCompiled(uint32_t funcIndex) const
{
- return funcToCodeRange_[funcIndex] != BAD_CODE_RANGE;
+ return metadataTier_->funcToCodeRange[funcIndex] != BAD_CODE_RANGE;
}
const CodeRange&
ModuleGenerator::funcCodeRange(uint32_t funcIndex) const
{
MOZ_ASSERT(funcIsCompiled(funcIndex));
- const CodeRange& cr = metadataTier_->codeRanges[funcToCodeRange_[funcIndex]];
+ const CodeRange& cr = metadataTier_->codeRanges[metadataTier_->funcToCodeRange[funcIndex]];
MOZ_ASSERT(cr.isFunction());
return cr;
}
@@ -538,8 +538,8 @@ ModuleGenerator::noteCodeRange(uint32_t codeRangeIndex, const CodeRange& codeRan
{
switch (codeRange.kind()) {
case CodeRange::Function:
- MOZ_ASSERT(funcToCodeRange_[codeRange.funcIndex()] == BAD_CODE_RANGE);
- funcToCodeRange_[codeRange.funcIndex()] = codeRangeIndex;
+ MOZ_ASSERT(metadataTier_->funcToCodeRange[codeRange.funcIndex()] == BAD_CODE_RANGE);
+ metadataTier_->funcToCodeRange[codeRange.funcIndex()] = codeRangeIndex;
break;
case CodeRange::InterpEntry:
metadataTier_->lookupFuncExport(codeRange.funcIndex())
@@ -922,33 +922,15 @@ ModuleGenerator::finishMetadata(const ShareableBytes& bytecode)
// These Vectors can get large and the excess capacity can be significant,
// so realloc them down to size.
+ metadataTier_->funcToCodeRange.podResizeToFit();
metadataTier_->codeRanges.podResizeToFit();
metadataTier_->callSites.podResizeToFit();
metadataTier_->trapSites.podResizeToFit();
metadataTier_->debugTrapFarJumpOffsets.podResizeToFit();
- metadataTier_->debugFuncToCodeRange.podResizeToFit();
for (Trap trap : MakeEnumeratedRange(Trap::Limit)) {
metadataTier_->trapSites[trap].podResizeToFit();
}
- // Complete function exports and element segments with code range indices,
- // now that every function has a code range.
-
- for (FuncExport& fe : metadataTier_->funcExports) {
- fe.initFuncCodeRangeIndex(funcToCodeRange_[fe.funcIndex()]);
- }
-
- for (ElemSegment& elems : env_->elemSegments) {
- Uint32Vector& codeRangeIndices = elems.elemCodeRangeIndices(tier());
- MOZ_ASSERT(codeRangeIndices.empty());
- if (!codeRangeIndices.reserve(elems.elemFuncIndices.length())) {
- return false;
- }
- for (uint32_t funcIndex : elems.elemFuncIndices) {
- codeRangeIndices.infallibleAppend(funcToCodeRange_[funcIndex]);
- }
- }
-
// Copy over additional debug information.
if (env_->debugEnabled()) {
@@ -967,7 +949,6 @@ ModuleGenerator::finishMetadata(const ShareableBytes& bytecode)
}
metadata_->debugFuncReturnTypes[i] = env_->funcTypes[i]->ret();
}
- metadataTier_->debugFuncToCodeRange = std::move(funcToCodeRange_);
static_assert(sizeof(ModuleHash) <= sizeof(mozilla::SHA1Sum::Hash),
"The ModuleHash size shall not exceed the SHA1 hash size.");
@@ -993,7 +974,7 @@ ModuleGenerator::finish(const ShareableBytes& bytecode)
}
#ifdef DEBUG
- for (uint32_t codeRangeIndex : funcToCodeRange_) {
+ for (uint32_t codeRangeIndex : metadataTier_->funcToCodeRange) {
MOZ_ASSERT(codeRangeIndex != BAD_CODE_RANGE);
}
#endif
@@ -1051,10 +1032,7 @@ ModuleGenerator::finishModule(const ShareableBytes& bytecode, UniqueLinkData* li
return nullptr;
}
- MutableCode code = js_new(std::move(codeTier), *metadata_,
- std::move(jumpTables),
- std::move(env_->dataSegments),
- std::move(env_->elemSegments));
+ MutableCode code = js_new(std::move(codeTier), *metadata_, std::move(jumpTables));
if (!code || !code->initialize(bytecode, *linkData_)) {
return nullptr;
}
@@ -1066,6 +1044,21 @@ ModuleGenerator::finishModule(const ShareableBytes& bytecode, UniqueLinkData* li
}
}
+ DataSegmentVector dataSegments;
+ if (!dataSegments.reserve(env_->dataSegments.length())) {
+ return nullptr;
+ }
+ for (DataSegmentEnv& srcSeg : env_->dataSegments) {
+ MutableDataSegment dstSeg = js_new(srcSeg);
+ if (!dstSeg) {
+ return nullptr;
+ }
+ if (!dstSeg->bytes.append(bytecode.begin() + srcSeg.bytecodeOffset, srcSeg.length)) {
+ return nullptr;
+ }
+ dataSegments.infallibleAppend(std::move(dstSeg));
+ }
+
UniqueBytes debugUnlinkedCode;
UniqueLinkData debugLinkData;
if (env_->debugEnabled()) {
@@ -1086,6 +1079,8 @@ ModuleGenerator::finishModule(const ShareableBytes& bytecode, UniqueLinkData* li
std::move(env_->imports),
std::move(env_->exports),
std::move(structTypes),
+ std::move(dataSegments),
+ std::move(env_->elemSegments),
bytecode,
std::move(debugUnlinkedCode),
std::move(debugLinkData)));
@@ -1122,8 +1117,8 @@ ModuleGenerator::finishTier2(Module& module)
return false;
}
- auto tier2 = js::MakeUnique(std::move(metadataTier_), std::move(moduleSegment));
- if (!tier2) {
+ auto code = js::MakeUnique(std::move(metadataTier_), std::move(moduleSegment));
+ if (!code) {
return false;
}
@@ -1133,7 +1128,7 @@ ModuleGenerator::finishTier2(Module& module)
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
- return module.finishTier2(*linkData_, std::move(tier2), std::move(*env_));
+ return module.finishTier2(*linkData_, std::move(code));
}
size_t
diff --git a/js/src/wasm/WasmInstance.cpp b/js/src/wasm/WasmInstance.cpp
index 1d2241e96086..9b26f6143b61 100644
--- a/js/src/wasm/WasmInstance.cpp
+++ b/js/src/wasm/WasmInstance.cpp
@@ -142,10 +142,10 @@ Instance::callImport(JSContext* cx, uint32_t funcImportIndex, unsigned argc, con
}
FuncImportTls& import = funcImportTls(fi);
- RootedFunction importFun(cx, &import.obj->as());
+ RootedFunction importFun(cx, import.fun);
MOZ_ASSERT(cx->realm() == importFun->realm());
- RootedValue fval(cx, ObjectValue(*import.obj));
+ RootedValue fval(cx, ObjectValue(*importFun));
RootedValue thisv(cx, UndefinedValue());
if (!Call(cx, fval, thisv, args, rval)) {
return false;
@@ -436,30 +436,20 @@ Instance::memCopy(Instance* instance, uint32_t dstByteOffset, uint32_t srcByteOf
/* static */ int32_t
Instance::memDrop(Instance* instance, uint32_t segIndex)
{
- DataSegmentInitVector& dataSegInitVec = instance->dataSegInitVec();
- size_t initVecLen = dataSegInitVec.length();
- MOZ_RELEASE_ASSERT(size_t(segIndex) < initVecLen, "ensured by validation");
+ MOZ_RELEASE_ASSERT(size_t(segIndex) < instance->passiveDataSegments_.length(),
+ "ensured by validation");
- const DataSegmentVector& dataSegs = instance->code().dataSegments();
- MOZ_ASSERT(dataSegs.length() == initVecLen);
-
- UniquePtr& segInit = dataSegInitVec[segIndex];
-
- // Check that the segment is available for passive use.
- if (!segInit) {
- JSContext* cx = TlsContext.get();
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
+ if (!instance->passiveDataSegments_[segIndex]) {
+ JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr,
JSMSG_WASM_INVALID_PASSIVE_DATA_SEG);
return -1;
}
- // If this is an active initializer, something is badly wrong.
- const DataSegment& seg = dataSegs[segIndex];
- MOZ_RELEASE_ASSERT(!seg.offsetIfActive);
+ SharedDataSegment& segRefPtr = instance->passiveDataSegments_[segIndex];
+ MOZ_RELEASE_ASSERT(!segRefPtr->active());
- // Free the initializer, and update the initializer vector accordingly.
- // This makes the initializer unavailable for future usage.
- segInit = nullptr;
+ // Drop this instance's reference to the DataSegment so it can be released.
+ segRefPtr = nullptr;
return 0;
}
@@ -495,36 +485,26 @@ Instance::memFill(Instance* instance, uint32_t byteOffset, uint32_t value, uint3
Instance::memInit(Instance* instance, uint32_t dstOffset, uint32_t srcOffset,
uint32_t len, uint32_t segIndex)
{
- const DataSegmentInitVector& dataSegInitVec = instance->dataSegInitVec();
- size_t initVecLen = dataSegInitVec.length();
- MOZ_RELEASE_ASSERT(size_t(segIndex) < initVecLen, "ensured by validation");
+ MOZ_RELEASE_ASSERT(size_t(segIndex) < instance->passiveDataSegments_.length(),
+ "ensured by validation");
- const DataSegmentVector& dataSegs = instance->code().dataSegments();
- MOZ_ASSERT(dataSegs.length() == initVecLen);
-
- const UniquePtr& segInit = dataSegInitVec[segIndex];
-
- // Check that the segment is available for passive use.
- if (!segInit) {
- JSContext* cx = TlsContext.get();
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
+ if (!instance->passiveDataSegments_[segIndex]) {
+ JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr,
JSMSG_WASM_INVALID_PASSIVE_DATA_SEG);
return -1;
}
- // If this is an active initializer, something is badly wrong.
- const DataSegment& seg = dataSegs[segIndex];
- MOZ_RELEASE_ASSERT(!seg.offsetIfActive);
+ const DataSegment& seg = *instance->passiveDataSegments_[segIndex];
+ MOZ_RELEASE_ASSERT(!seg.active());
- const uint32_t segLen = seg.length;
- MOZ_ASSERT(segLen == segInit->length());
+ const uint32_t segLen = seg.bytes.length();
WasmMemoryObject* mem = instance->memory();
const uint32_t memLen = mem->volatileMemoryLength();
// We are proposing to copy
//
- // segInit->begin()[ srcOffset .. srcOffset + len - 1 ]
+ // seg.bytes.begin()[ srcOffset .. srcOffset + len - 1 ]
// to
// memoryBase[ dstOffset .. dstOffset + len - 1 ]
@@ -546,13 +526,12 @@ Instance::memInit(Instance* instance, uint32_t dstOffset, uint32_t srcOffset,
ArrayBufferObjectMaybeShared& arrBuf = mem->buffer();
uint8_t* memoryBase = arrBuf.dataPointerEither().unwrap();
memcpy(memoryBase + dstOffset,
- (const char*)segInit->begin() + srcOffset, len);
+ (const char*)seg.bytes.begin() + srcOffset, len);
return 0;
}
}
- JSContext* cx = TlsContext.get();
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_WASM_OUT_OF_BOUNDS);
+ JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr, JSMSG_WASM_OUT_OF_BOUNDS);
return -1;
}
@@ -591,82 +570,102 @@ Instance::tableCopy(Instance* instance, uint32_t dstOffset, uint32_t srcOffset,
}
}
- JSContext* cx = TlsContext.get();
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_WASM_OUT_OF_BOUNDS);
+ JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr, JSMSG_WASM_OUT_OF_BOUNDS);
return -1;
}
/* static */ int32_t
Instance::tableDrop(Instance* instance, uint32_t segIndex)
{
- ElemSegmentInitVector& elemSegInitVec = instance->elemSegInitVec();
- size_t initVecLen = elemSegInitVec.length();
- MOZ_RELEASE_ASSERT(size_t(segIndex) < initVecLen, "ensured by validation");
+ MOZ_RELEASE_ASSERT(size_t(segIndex) < instance->passiveElemSegments_.length(),
+ "ensured by validation");
- const ElemSegmentVector& elemSegs = instance->code().elemSegments();
- MOZ_ASSERT(elemSegs.length() == initVecLen);
-
- UniquePtr& segInit = elemSegInitVec[segIndex];
-
- // Check that the segment is available for passive use.
- if (!segInit) {
- JSContext* cx = TlsContext.get();
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
- JSMSG_WASM_INVALID_PASSIVE_ELEM_SEG);
- return -1;
+ if (!instance->passiveElemSegments_[segIndex]) {
+ JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr,
+ JSMSG_WASM_INVALID_PASSIVE_ELEM_SEG);
+ return -1;
}
- // If this is an active initializer, something is badly wrong.
- const ElemSegment& seg = elemSegs[segIndex];
- MOZ_RELEASE_ASSERT(!seg.offsetIfActive);
+ SharedElemSegment& segRefPtr = instance->passiveElemSegments_[segIndex];
+ MOZ_RELEASE_ASSERT(!segRefPtr->active());
- // Free the initializer, and update the initializer vector accordingly.
- // This makes the initializer unavailable for future usage.
- segInit = nullptr;
+ // Drop this instance's reference to the ElemSegment so it can be released.
+ segRefPtr = nullptr;
return 0;
}
+void
+Instance::initElems(const ElemSegment& seg, uint32_t dstOffset, uint32_t srcOffset, uint32_t len)
+{
+ Table& table = *tables_[seg.tableIndex];
+ MOZ_ASSERT(dstOffset <= table.length());
+ MOZ_ASSERT(len <= table.length() - dstOffset);
+
+ Tier tier = code().bestTier();
+ const MetadataTier& metadataTier = metadata(tier);
+ const FuncImportVector& funcImports = metadataTier.funcImports;
+ const CodeRangeVector& codeRanges = metadataTier.codeRanges;
+ const Uint32Vector& funcToCodeRange = metadataTier.funcToCodeRange;
+ const Uint32Vector& elemFuncIndices = seg.elemFuncIndices;
+ MOZ_ASSERT(srcOffset <= elemFuncIndices.length());
+ MOZ_ASSERT(len <= elemFuncIndices.length() - srcOffset);
+
+ uint8_t* codeBaseTier = codeBase(tier);
+ for (uint32_t i = 0; i < len; i++) {
+ uint32_t funcIndex = elemFuncIndices[srcOffset + i];
+ if (funcIndex < funcImports.length()) {
+ FuncImportTls& import = funcImportTls(funcImports[funcIndex]);
+ JSFunction *fun = import.fun;
+ if (IsExportedWasmFunction(fun)) {
+ // This element is a wasm function imported from another
+ // instance. To preserve the === function identity required by
+ // the JS embedding spec, we must set the element to the
+ // imported function's underlying CodeRange.funcTableEntry and
+ // Instance so that future Table.get()s produce the same
+ // function object as was imported.
+ WasmInstanceObject* calleeInstanceObj = ExportedFunctionToInstanceObject(fun);
+ Instance& calleeInstance = calleeInstanceObj->instance();
+ Tier calleeTier = calleeInstance.code().bestTier();
+ const CodeRange& calleeCodeRange =
+ calleeInstanceObj->getExportedFunctionCodeRange(fun, calleeTier);
+ void* code = calleeInstance.codeBase(calleeTier) + calleeCodeRange.funcTableEntry();
+ table.set(dstOffset + i, code, &calleeInstance);
+ continue;
+ }
+ }
+ void* code = codeBaseTier + codeRanges[funcToCodeRange[funcIndex]].funcTableEntry();
+ table.set(dstOffset + i, code, this);
+ }
+}
+
/* static */ int32_t
Instance::tableInit(Instance* instance, uint32_t dstOffset, uint32_t srcOffset,
uint32_t len, uint32_t segIndex)
{
- const ElemSegmentInitVector& elemSegInitVec = instance->elemSegInitVec();
- size_t initVecLen = elemSegInitVec.length();
- MOZ_RELEASE_ASSERT(size_t(segIndex) < initVecLen, "ensured by validation");
+ MOZ_RELEASE_ASSERT(size_t(segIndex) < instance->passiveElemSegments_.length(),
+ "ensured by validation");
- const ElemSegmentVector& elemSegs = instance->code().elemSegments();
- MOZ_ASSERT(elemSegs.length() == initVecLen);
-
- const UniquePtr& segInit = elemSegInitVec[segIndex];
-
- // Check that the segment is available for passive use.
- if (!segInit) {
- JSContext* cx = TlsContext.get();
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
+ if (!instance->passiveElemSegments_[segIndex]) {
+ JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr,
JSMSG_WASM_INVALID_PASSIVE_ELEM_SEG);
return -1;
}
- // If this is an active initializer, something is badly wrong.
- const ElemSegment& seg = elemSegs[segIndex];
- MOZ_RELEASE_ASSERT(!seg.offsetIfActive);
-
- const uint32_t segLen = seg.elemFuncIndices.length();
- MOZ_ASSERT(segLen == segInit->length());
-
- const SharedTable& table = instance->tables()[0];
- const uint32_t tableLen = table->length();
+ const ElemSegment& seg = *instance->passiveElemSegments_[segIndex];
+ MOZ_RELEASE_ASSERT(!seg.active());
+ const Table& table = *instance->tables()[seg.tableIndex];
// We are proposing to copy
//
- // (*segInit)[ srcOffset .. srcOffset + len - 1 ]
+ // seg[ srcOffset .. srcOffset + len - 1 ]
// to
// tableBase[ dstOffset .. dstOffset + len - 1 ]
if (len == 0) {
// Even though the length is zero, we must check for valid offsets.
- if (dstOffset < tableLen && srcOffset < segLen)
+ if (dstOffset < table.length() && srcOffset < seg.length()) {
return 0;
+ }
} else {
// Here, we know that |len - 1| cannot underflow.
CheckedU32 lenMinus1 = CheckedU32(len - 1);
@@ -674,26 +673,15 @@ Instance::tableInit(Instance* instance, uint32_t dstOffset, uint32_t srcOffset,
CheckedU32 highestSrcOffset = CheckedU32(srcOffset) + lenMinus1;
if (highestDstOffset.isValid() &&
highestSrcOffset.isValid() &&
- highestDstOffset.value() < tableLen &&
- highestSrcOffset.value() < segLen)
+ highestDstOffset.value() < table.length() &&
+ highestSrcOffset.value() < seg.length())
{
- for (uint32_t i = 0; i < len; i++) {
- WasmCallee callee = (*segInit)[srcOffset + i];
- MOZ_ASSERT(callee.entry);
- MOZ_ASSERT(callee.instance);
- // An "internal" table implicitly means that the instance
- // pointer associated with each code entry point is the
- // instance that owns the table. So we need to ensure we're
- // not about to break that invariant.
- MOZ_ASSERT_IF(!table->external(), callee.instance == instance);
- table->set(dstOffset + i, callee.entry, callee.instance);
- }
+ instance->initElems(seg, dstOffset, srcOffset, len);
return 0;
}
}
- JSContext* cx = TlsContext.get();
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_WASM_OUT_OF_BOUNDS);
+ JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr, JSMSG_WASM_OUT_OF_BOUNDS);
return -1;
}
@@ -747,11 +735,11 @@ Instance::Instance(JSContext* cx,
#endif
Tier callerTier = code_->bestTier();
-
for (size_t i = 0; i < metadata(callerTier).funcImports.length(); i++) {
HandleFunction f = funcImports[i];
const FuncImport& fi = metadata(callerTier).funcImports[i];
FuncImportTls& import = funcImportTls(fi);
+ import.fun = f;
if (!isAsmJS() && IsExportedWasmFunction(f)) {
WasmInstanceObject* calleeInstanceObj = ExportedFunctionToInstanceObject(f);
Instance& calleeInstance = calleeInstanceObj->instance();
@@ -761,19 +749,16 @@ Instance::Instance(JSContext* cx,
import.realm = f->realm();
import.code = calleeInstance.codeBase(calleeTier) + codeRange.funcNormalEntry();
import.baselineScript = nullptr;
- import.obj = calleeInstanceObj;
} else if (void* thunk = MaybeGetBuiltinThunk(f, fi.funcType())) {
import.tls = tlsData();
import.realm = f->realm();
import.code = thunk;
import.baselineScript = nullptr;
- import.obj = f;
} else {
import.tls = tlsData();
import.realm = f->realm();
import.code = codeBase(callerTier) + fi.interpExitCodeOffset();
import.baselineScript = nullptr;
- import.obj = f;
}
}
@@ -842,8 +827,9 @@ Instance::Instance(JSContext* cx,
}
bool
-Instance::init(JSContext* cx, const ShareableBytes* bytecode,
- Handle funcImports)
+Instance::init(JSContext* cx,
+ const DataSegmentVector& dataSegments,
+ const ElemSegmentVector& elemSegments)
{
if (memory_ && memory_->movingGrowable() && !memory_->addMovingGrowObserver(cx, object_)) {
return false;
@@ -878,60 +864,22 @@ Instance::init(JSContext* cx, const ShareableBytes* bytecode,
preBarrierCode_ = jitRuntime->preBarrier(MIRType::Object);
#endif
- // Create a vector the same length as the data segment vector, holding a
- // copy of the initialising data for passive segments and |nullptr| for
- // active ones.
- MOZ_ASSERT(dataSegInitVec_.empty());
- if (!dataSegInitVec_.reserve(code().dataSegments().length())) {
- ReportOutOfMemory(cx);
+ if (!passiveDataSegments_.resize(dataSegments.length())) {
return false;
}
- for (const DataSegment& seg : code().dataSegments()) {
- UniquePtr dsi = nullptr;
- if (!seg.offsetIfActive) {
- // Passive initialiser.
- dsi.reset(js_new());
- if (!dsi || !dsi->initLengthUninitialized(seg.length)) {
- ReportOutOfMemory(cx);
- return false;
- }
- MOZ_ASSERT(seg.bytecodeOffset <= bytecode->length());
- MOZ_ASSERT(seg.length <= bytecode->length() - seg.bytecodeOffset);
- memcpy((char*)dsi->begin(),
- (char*)bytecode->begin() + seg.bytecodeOffset,
- seg.length);
+ for (size_t i = 0; i < dataSegments.length(); i++) {
+ if (!dataSegments[i]->active()) {
+ passiveDataSegments_[i] = dataSegments[i];
}
- dataSegInitVec_.infallibleAppend(std::move(dsi));
}
- // And similarly for the elem segment vector.
- MOZ_ASSERT(elemSegInitVec_.empty());
- if (!elemSegInitVec_.reserve(code().elemSegments().length())) {
- ReportOutOfMemory(cx);
+ if (!passiveElemSegments_.resize(elemSegments.length())) {
return false;
}
- for (const ElemSegment& seg : code().elemSegments()) {
- UniquePtr esi = nullptr;
- if (!seg.offsetIfActive) {
- // Passive initialiser.
- esi.reset(js_new());
- if (!esi || !esi->initLengthUninitialized(seg.elemFuncIndices.length())) {
- ReportOutOfMemory(cx);
- return false;
- }
-
- Tier tier = code().bestTier();
- const Table& table = *tables()[seg.tableIndex];
-
- MOZ_ASSERT(seg.elemCodeRangeIndices(tier).length() ==
- seg.elemFuncIndices.length());
-
- for (uint32_t i = 0; i < seg.elemCodeRangeIndices(tier).length(); i++) {
- ComputeWasmCallee(code(), this, funcImports, i, table, seg,
- &(*esi)[i]);
- }
+ for (size_t i = 0; i < elemSegments.length(); i++) {
+ if (!elemSegments[i]->active()) {
+ passiveElemSegments_[i] = elemSegments[i];
}
- elemSegInitVec_.infallibleAppend(std::move(esi));
}
return true;
@@ -1000,7 +948,7 @@ Instance::tracePrivate(JSTracer* trc)
// OK to just do one tier here; though the tiers have different funcImports
// tables, they share the tls object.
for (const FuncImport& fi : metadata(code().stableTier()).funcImports) {
- TraceNullableEdge(trc, &funcImportTls(fi).obj, "wasm import");
+ TraceNullableEdge(trc, &funcImportTls(fi).fun, "wasm import");
}
for (const SharedTable& table : tables_) {
diff --git a/js/src/wasm/WasmInstance.h b/js/src/wasm/WasmInstance.h
index b600ae01cc04..ae1d3de30de7 100644
--- a/js/src/wasm/WasmInstance.h
+++ b/js/src/wasm/WasmInstance.h
@@ -55,8 +55,8 @@ class Instance
const UniqueTlsData tlsData_;
GCPtrWasmMemoryObject memory_;
SharedTableVector tables_;
- DataSegmentInitVector dataSegInitVec_;
- ElemSegmentInitVector elemSegInitVec_;
+ DataSegmentVector passiveDataSegments_;
+ ElemSegmentVector passiveElemSegments_;
bool enterFrameTrapsEnabled_;
// Internal helpers:
@@ -83,8 +83,9 @@ class Instance
HandleValVector globalImportValues,
const WasmGlobalObjectVector& globalObjs);
~Instance();
- bool init(JSContext* cx, const ShareableBytes* bytecode,
- Handle funcImports);
+ bool init(JSContext* cx,
+ const DataSegmentVector& dataSegments,
+ const ElemSegmentVector& elemSegments);
void trace(JSTracer* trc);
JS::Realm* realm() const { return realm_; }
@@ -100,8 +101,6 @@ class Instance
const Metadata& metadata() const { return code_->metadata(); }
bool isAsmJS() const { return metadata().isAsmJS(); }
const SharedTableVector& tables() const { return tables_; }
- DataSegmentInitVector& dataSegInitVec() { return dataSegInitVec_; }
- ElemSegmentInitVector& elemSegInitVec() { return elemSegInitVec_; }
SharedMem memoryBase() const;
WasmMemoryObject* memory() const;
size_t memoryMappedSize() const;
@@ -154,6 +153,11 @@ class Instance
void onMovingGrowMemory(uint8_t* prevMemoryBase);
void onMovingGrowTable();
+ // Called to apply a single ElemSegment at a given offset, assuming
+ // that all bounds validation has already been performed.
+
+ void initElems(const ElemSegment& seg, uint32_t dstOffset, uint32_t srcOffset, uint32_t len);
+
// Debug support:
bool debugEnabled() const { return metadata().debugEnabled; }
diff --git a/js/src/wasm/WasmJS.cpp b/js/src/wasm/WasmJS.cpp
index 574b2e4e005b..01f20a0b6f6c 100644
--- a/js/src/wasm/WasmJS.cpp
+++ b/js/src/wasm/WasmJS.cpp
@@ -1157,6 +1157,8 @@ WasmInstanceObject::trace(JSTracer* trc, JSObject* obj)
/* static */ WasmInstanceObject*
WasmInstanceObject::create(JSContext* cx,
SharedCode code,
+ const DataSegmentVector& dataSegments,
+ const ElemSegmentVector& elemSegments,
UniqueDebugState debug,
UniqueTlsData tlsData,
HandleWasmMemoryObject memory,
@@ -1165,7 +1167,6 @@ WasmInstanceObject::create(JSContext* cx,
const GlobalDescVector& globals,
HandleValVector globalImportValues,
const WasmGlobalObjectVector& globalObjs,
- const ShareableBytes* bytecode,
HandleObject proto)
{
UniquePtr exports = js::MakeUnique();
@@ -1240,7 +1241,7 @@ WasmInstanceObject::create(JSContext* cx,
obj->initReservedSlot(INSTANCE_SLOT, PrivateValue(instance));
MOZ_ASSERT(!obj->isNewborn());
- if (!instance->init(cx, bytecode, funcImports)) {
+ if (!instance->init(cx, dataSegments, elemSegments)) {
return nullptr;
}
@@ -1487,12 +1488,12 @@ WasmInstanceObject::getExportedFunction(JSContext* cx, HandleWasmInstanceObject
}
const CodeRange&
-WasmInstanceObject::getExportedFunctionCodeRange(HandleFunction fun, Tier tier)
+WasmInstanceObject::getExportedFunctionCodeRange(JSFunction* fun, Tier tier)
{
uint32_t funcIndex = ExportedFunctionToFuncIndex(fun);
MOZ_ASSERT(exports().lookup(funcIndex)->value() == fun);
- const FuncExport& funcExport = instance().metadata(tier).lookupFuncExport(funcIndex);
- return instance().metadata(tier).codeRanges[funcExport.funcCodeRangeIndex()];
+ const MetadataTier& metadata = instance().metadata(tier);
+ return metadata.codeRange(metadata.lookupFuncExport(funcIndex));
}
/* static */ WasmInstanceScope*
@@ -2202,8 +2203,7 @@ WasmTableObject::setImpl(JSContext* cx, const CallArgs& args)
Instance& instance = instanceObj->instance();
Tier tier = instance.code().bestTier();
const MetadataTier& metadata = instance.metadata(tier);
- const FuncExport& funcExport = metadata.lookupFuncExport(funcIndex);
- const CodeRange& codeRange = metadata.codeRanges[funcExport.funcCodeRangeIndex()];
+ const CodeRange& codeRange = metadata.codeRange(metadata.lookupFuncExport(funcIndex));
void* code = instance.codeBase(tier) + codeRange.funcTableEntry();
table.set(index, code, &instance);
} else {
diff --git a/js/src/wasm/WasmJS.h b/js/src/wasm/WasmJS.h
index 6e26dbf84f1c..c340f876d664 100644
--- a/js/src/wasm/WasmJS.h
+++ b/js/src/wasm/WasmJS.h
@@ -214,6 +214,8 @@ class WasmInstanceObject : public NativeObject
static WasmInstanceObject* create(JSContext* cx,
RefPtr code,
+ const wasm::DataSegmentVector& dataSegments,
+ const wasm::ElemSegmentVector& elemSegments,
UniquePtr debug,
wasm::UniqueTlsData tlsData,
HandleWasmMemoryObject memory,
@@ -222,7 +224,6 @@ class WasmInstanceObject : public NativeObject
const wasm::GlobalDescVector& globals,
wasm::HandleValVector globalImportValues,
const WasmGlobalObjectVector& globalObjs,
- const wasm::ShareableBytes* bytecode,
HandleObject proto);
void initExportsObj(JSObject& exportsObj);
@@ -234,7 +235,7 @@ class WasmInstanceObject : public NativeObject
uint32_t funcIndex,
MutableHandleFunction fun);
- const wasm::CodeRange& getExportedFunctionCodeRange(HandleFunction fun, wasm::Tier tier);
+ const wasm::CodeRange& getExportedFunctionCodeRange(JSFunction* fun, wasm::Tier tier);
static WasmInstanceScope* getScope(JSContext* cx, HandleWasmInstanceObject instanceObj);
static WasmFunctionScope* getFunctionScope(JSContext* cx,
diff --git a/js/src/wasm/WasmModule.cpp b/js/src/wasm/WasmModule.cpp
index f9585c058123..56d367d3d50d 100644
--- a/js/src/wasm/WasmModule.cpp
+++ b/js/src/wasm/WasmModule.cpp
@@ -81,20 +81,16 @@ Module::startTier2(const CompileArgs& args)
}
bool
-Module::finishTier2(const LinkData& linkData, UniqueCodeTier tier2Arg, ModuleEnvironment&& env2)
+Module::finishTier2(const LinkData& linkData2, UniqueCodeTier code2)
{
- MOZ_ASSERT(code().bestTier() == Tier::Baseline && tier2Arg->tier() == Tier::Ion);
+ MOZ_ASSERT(code().bestTier() == Tier::Baseline && code2->tier() == Tier::Ion);
// Install the data in the data structures. They will not be visible
// until commitTier2().
- if (!code().setTier2(std::move(tier2Arg), *bytecode_, linkData)) {
+ if (!code().setTier2(std::move(code2), *bytecode_, linkData2)) {
return false;
}
- for (uint32_t i = 0; i < code().elemSegments().length(); i++) {
- code().elemSegments()[i]
- .setTier2(std::move(env2.elemSegments[i].elemCodeRangeIndices(Tier::Ion)));
- }
// Before we can make tier-2 live, we need to compile tier2 versions of any
// extant tier1 lazy stubs (otherwise, tiering would break the assumption
@@ -118,7 +114,6 @@ Module::finishTier2(const LinkData& linkData, UniqueCodeTier tier2Arg, ModuleEnv
if (fe.hasEagerStubs()) {
continue;
}
- MOZ_ASSERT(!env2.isAsmJS(), "only wasm functions are lazily exported");
if (!stubs1->hasStub(fe.funcIndex())) {
continue;
}
@@ -176,6 +171,8 @@ Module::serializedSize(const LinkData& linkData) const
SerializedVectorSize(imports_) +
SerializedVectorSize(exports_) +
SerializedVectorSize(structTypes_) +
+ SerializedVectorSize(dataSegments_) +
+ SerializedVectorSize(elemSegments_) +
code_->serializedSize();
}
@@ -191,6 +188,8 @@ Module::serialize(const LinkData& linkData, uint8_t* begin, size_t size) const
cursor = SerializeVector(cursor, imports_);
cursor = SerializeVector(cursor, exports_);
cursor = SerializeVector(cursor, structTypes_);
+ cursor = SerializeVector(cursor, dataSegments_);
+ cursor = SerializeVector(cursor, elemSegments_);
cursor = code_->serialize(cursor, linkData);
MOZ_RELEASE_ASSERT(cursor == begin + size);
}
@@ -239,6 +238,18 @@ Module::deserialize(const uint8_t* begin, size_t size, Metadata* maybeMetadata)
return nullptr;
}
+ DataSegmentVector dataSegments;
+ cursor = DeserializeVector(cursor, &dataSegments);
+ if (!cursor) {
+ return nullptr;
+ }
+
+ ElemSegmentVector elemSegments;
+ cursor = DeserializeVector(cursor, &elemSegments);
+ if (!cursor) {
+ return nullptr;
+ }
+
SharedCode code;
cursor = Code::deserialize(cursor, *bytecode, linkData, *metadata, &code);
if (!cursor) {
@@ -252,6 +263,8 @@ Module::deserialize(const uint8_t* begin, size_t size, Metadata* maybeMetadata)
std::move(imports),
std::move(exports),
std::move(structTypes),
+ std::move(dataSegments),
+ std::move(elemSegments),
*bytecode);
}
@@ -352,13 +365,15 @@ Module::addSizeOfMisc(MallocSizeOf mallocSizeOf,
SizeOfVectorExcludingThis(imports_, mallocSizeOf) +
SizeOfVectorExcludingThis(exports_, mallocSizeOf) +
SizeOfVectorExcludingThis(structTypes_, mallocSizeOf) +
+ SizeOfVectorExcludingThis(dataSegments_, mallocSizeOf) +
+ SizeOfVectorExcludingThis(elemSegments_, mallocSizeOf) +
bytecode_->sizeOfIncludingThisIfNotSeen(mallocSizeOf, seenBytes);
+
if (debugUnlinkedCode_) {
*data += debugUnlinkedCode_->sizeOfExcludingThis(mallocSizeOf);
}
}
-
// Extracting machine code as JS object. The result has the "code" property, as
// a Uint8Array, and the "segments" property as array objects. The objects
// contain offsets in the "code" array and basic information about a code
@@ -463,37 +478,6 @@ EvaluateInitExpr(HandleValVector globalImportValues, InitExpr initExpr)
MOZ_CRASH("bad initializer expression");
}
-void
-wasm::ComputeWasmCallee(const Code& code, const Instance* instance,
- Handle funcImports,
- uint32_t funcIndexIndex, const Table& table,
- const ElemSegment& seg, WasmCallee* out)
-{
- const Tier tier = code.bestTier();
- const CodeRangeVector& codeRanges = code.metadata(tier).codeRanges;
- uint8_t* codeBase = code.segment(tier).base();
-
- uint32_t funcIndex = seg.elemFuncIndices[funcIndexIndex];
- if (funcIndex < funcImports.length() && IsExportedWasmFunction(funcImports[funcIndex])) {
- MOZ_ASSERT(!code.metadata().isAsmJS());
- MOZ_ASSERT(!table.isTypedFunction());
-
- HandleFunction f = funcImports[funcIndex];
- WasmInstanceObject* exportInstanceObj = ExportedFunctionToInstanceObject(f);
- Instance& exportInstance = exportInstanceObj->instance();
- Tier exportTier = exportInstance.code().bestTier();
- const CodeRange& cr = exportInstanceObj->getExportedFunctionCodeRange(f, exportTier);
- *out = WasmCallee(&exportInstance, exportInstance.codeBase(exportTier) +
- cr.funcTableEntry());
- } else {
- const CodeRange& cr = codeRanges[seg.elemCodeRangeIndices(tier)[funcIndexIndex]];
- uint32_t entryOffset = table.isTypedFunction()
- ? cr.funcNormalEntry()
- : cr.funcTableEntry();
- *out = WasmCallee(instance, codeBase + entryOffset);
- }
-}
-
bool
Module::initSegments(JSContext* cx,
HandleWasmInstanceObject instanceObj,
@@ -504,26 +488,17 @@ Module::initSegments(JSContext* cx,
Instance& instance = instanceObj->instance();
const SharedTableVector& tables = instance.tables();
- Tier tier = code().bestTier();
-
// Perform all error checks up front so that this function does not perform
// partial initialization if an error is reported.
- for (const ElemSegment& seg : code_->elemSegments()) {
- // If this is a passive segment, there's nothing we can check at
- // this point. We'll have to perform the relevant checks later, if
- // and when the segment is used, that is, as an argument to the
- // table.init or table.drop instructions.
- if (!seg.offsetIfActive)
+ for (const ElemSegment* seg : elemSegments_) {
+ if (!seg->active())
continue;
- // Otherwise it's an active segment, so we check it now.
- uint32_t numElems = seg.elemCodeRangeIndices(tier).length();
+ uint32_t tableLength = tables[seg->tableIndex]->length();
+ uint32_t offset = EvaluateInitExpr(globalImportValues, seg->offset());
- uint32_t tableLength = tables[seg.tableIndex]->length();
- uint32_t offset = EvaluateInitExpr(globalImportValues, *seg.offsetIfActive);
-
- if (offset > tableLength || tableLength - offset < numElems) {
+ if (offset > tableLength || tableLength - offset < seg->length()) {
JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_FIT,
"elem", "table");
return false;
@@ -532,61 +507,45 @@ Module::initSegments(JSContext* cx,
if (memoryObj) {
uint32_t memoryLength = memoryObj->volatileMemoryLength();
- for (const DataSegment& seg : code_->dataSegments()) {
- // As with element segments just above, skip passive ones for now.
- if (!seg.offsetIfActive)
+ for (const DataSegment* seg : dataSegments_) {
+ if (!seg->active())
continue;
- uint32_t offset = EvaluateInitExpr(globalImportValues, *seg.offsetIfActive);
+ uint32_t offset = EvaluateInitExpr(globalImportValues, seg->offset());
- if (offset > memoryLength || memoryLength - offset < seg.length) {
+ if (offset > memoryLength || memoryLength - offset < seg->bytes.length()) {
JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_FIT,
"data", "memory");
return false;
}
}
} else {
- MOZ_ASSERT(code_->dataSegments().empty());
+ MOZ_ASSERT(dataSegments_.empty());
}
// Now that initialization can't fail partway through, write data/elem
// segments into memories/tables.
- for (const ElemSegment& seg : code_->elemSegments()) {
- // Skip passive segments. Those may get applied later, under
- // program control, per comments above.
- if (!seg.offsetIfActive)
- continue;
-
- // But apply active segments right now.
- Table& table = *tables[seg.tableIndex];
- uint32_t offset = EvaluateInitExpr(globalImportValues, *seg.offsetIfActive);
-
- MOZ_ASSERT(seg.elemCodeRangeIndices(tier).length() ==
- seg.elemFuncIndices.length());
-
- for (uint32_t i = 0; i < seg.elemCodeRangeIndices(tier).length(); i++) {
- WasmCallee callee;
- ComputeWasmCallee(code(), &instance, funcImports, i, table, seg, &callee);
- table.set(offset + i, callee.entry, callee.instance);
+ for (const ElemSegment* seg : elemSegments_) {
+ if (seg->active()) {
+ uint32_t offset = EvaluateInitExpr(globalImportValues, seg->offset());
+ instance.initElems(*seg, offset, 0, seg->length());
}
}
if (memoryObj) {
uint8_t* memoryBase = memoryObj->buffer().dataPointerEither().unwrap(/* memcpy */);
- for (const DataSegment& seg : code_->dataSegments()) {
- MOZ_ASSERT(seg.bytecodeOffset <= bytecode_->length());
- MOZ_ASSERT(seg.length <= bytecode_->length() - seg.bytecodeOffset);
- // Skip passive segments. Those may get applied later, under
- // program control, per comments above.
- if (!seg.offsetIfActive)
+ for (const DataSegment* seg : dataSegments_) {
+ if (!seg->active())
continue;
// But apply active segments right now.
- uint32_t offset = EvaluateInitExpr(globalImportValues, *seg.offsetIfActive);
- memcpy(memoryBase + offset, bytecode_->begin() + seg.bytecodeOffset, seg.length);
+ uint32_t offset = EvaluateInitExpr(globalImportValues, seg->offset());
+ memcpy(memoryBase + offset, seg->bytes.begin(), seg->bytes.length());
}
+ } else {
+ MOZ_ASSERT(dataSegments_.empty());
}
return true;
@@ -698,7 +657,7 @@ Module::instantiateMemory(JSContext* cx, MutableHandleWasmMemoryObject memory) c
{
if (!metadata().usesMemory()) {
MOZ_ASSERT(!memory);
- MOZ_ASSERT(code_->dataSegments().empty());
+ MOZ_ASSERT(dataSegments_.empty());
return true;
}
@@ -889,6 +848,50 @@ Module::instantiateGlobals(JSContext* cx, HandleValVector globalImportValues,
return true;
}
+SharedCode
+Module::getDebugEnabledCode() const
+{
+ MOZ_ASSERT(metadata().debugEnabled);
+ MOZ_ASSERT(debugUnlinkedCode_);
+ MOZ_ASSERT(debugLinkData_);
+
+ // The first time through, use the pre-linked code in the module but
+ // mark it as having been claimed. Subsequently, instantiate the copy of the
+ // code bytes that we keep around for debugging instead, because the
+ // debugger may patch the pre-linked code at any time.
+ if (debugCodeClaimed_.compareExchange(false, true)) {
+ return code_;
+ }
+
+ Tier tier = Tier::Baseline;
+ auto segment = ModuleSegment::create(tier, *debugUnlinkedCode_, *debugLinkData_);
+ if (!segment) {
+ return nullptr;
+ }
+
+ UniqueMetadataTier metadataTier = js::MakeUnique(tier);
+ if (!metadataTier || !metadataTier->clone(metadata(tier))) {
+ return nullptr;
+ }
+
+ auto codeTier = js::MakeUnique(std::move(metadataTier), std::move(segment));
+ if (!codeTier) {
+ return nullptr;
+ }
+
+ JumpTables jumpTables;
+ if (!jumpTables.init(CompileMode::Once, codeTier->segment(), metadata(tier).codeRanges)) {
+ return nullptr;
+ }
+
+ MutableCode debugCode = js_new(std::move(codeTier), metadata(), std::move(jumpTables));
+ if (!debugCode || !debugCode->initialize(*bytecode_, *debugLinkData_)) {
+ return nullptr;
+ }
+
+ return debugCode;
+}
+
static bool
GetFunctionExport(JSContext* cx,
HandleWasmInstanceObject instanceObj,
@@ -1018,80 +1021,15 @@ Module::instantiate(JSContext* cx,
return false;
}
+ // Debugging mutates code (for traps, stepping, etc) and thus may need to
+ // clone the code on each instantiation.
+
SharedCode code(code_);
-
if (metadata().debugEnabled) {
- MOZ_ASSERT(debugUnlinkedCode_);
- MOZ_ASSERT(debugLinkData_);
-
- // The first time through, use the pre-linked code in the module but
- // mark it as busy. Subsequently, instantiate the copy of the code
- // bytes that we keep around for debugging instead, because the debugger
- // may patch the pre-linked code at any time.
- if (!debugCodeClaimed_.compareExchange(false, true)) {
- Tier tier = Tier::Baseline;
- auto segment = ModuleSegment::create(tier, *debugUnlinkedCode_, *debugLinkData_);
- if (!segment) {
- ReportOutOfMemory(cx);
- return false;
- }
-
- UniqueMetadataTier metadataTier = js::MakeUnique(tier);
- if (!metadataTier || !metadataTier->clone(metadata(tier))) {
- return false;
- }
-
- auto codeTier = js::MakeUnique(std::move(metadataTier), std::move(segment));
- if (!codeTier) {
- return false;
- }
-
- JumpTables jumpTables;
- if (!jumpTables.init(CompileMode::Once, codeTier->segment(), metadata(tier).codeRanges)) {
- return false;
- }
-
- DataSegmentVector dataSegments;
- if (!dataSegments.appendAll(code_->dataSegments()))
- return false;
-
- ElemSegmentVector elemSegments;
- for (const ElemSegment& seg : code_->elemSegments()) {
- // This (debugging) code path is called only for tier 1.
- MOZ_ASSERT(seg.elemCodeRangeIndices2_.empty());
-
- // ElemSegment doesn't have a (fallible) copy constructor,
- // so we have to clone it "by hand".
- ElemSegment clone;
- clone.tableIndex = seg.tableIndex;
- clone.offsetIfActive = seg.offsetIfActive;
-
- MOZ_ASSERT(clone.elemFuncIndices.empty());
- if (!clone.elemFuncIndices.appendAll(seg.elemFuncIndices))
- return false;
-
- MOZ_ASSERT(clone.elemCodeRangeIndices1_.empty());
- if (!clone.elemCodeRangeIndices1_.appendAll(seg.elemCodeRangeIndices1_))
- return false;
-
- MOZ_ASSERT(clone.elemCodeRangeIndices2_.empty());
- if (!clone.elemCodeRangeIndices2_.appendAll(seg.elemCodeRangeIndices2_))
- return false;
-
- if (!elemSegments.append(std::move(clone)))
- return false;
- }
-
- MutableCode debugCode = js_new(std::move(codeTier), metadata(),
- std::move(jumpTables),
- std::move(dataSegments),
- std::move(elemSegments));
- if (!debugCode || !debugCode->initialize(*bytecode_, *debugLinkData_)) {
- ReportOutOfMemory(cx);
- return false;
- }
-
- code = debugCode;
+ code = getDebugEnabledCode();
+ if (!code) {
+ ReportOutOfMemory(cx);
+ return false;
}
}
@@ -1122,6 +1060,8 @@ Module::instantiate(JSContext* cx,
instance.set(WasmInstanceObject::create(cx,
code,
+ dataSegments_,
+ elemSegments_,
std::move(debug),
std::move(tlsData),
memory,
@@ -1130,7 +1070,6 @@ Module::instantiate(JSContext* cx,
metadata().globals,
globalImportValues,
globalObjs,
- bytecode_.get(),
instanceProto));
if (!instance) {
return false;
diff --git a/js/src/wasm/WasmModule.h b/js/src/wasm/WasmModule.h
index fb864a2a5726..03f963101ff4 100644
--- a/js/src/wasm/WasmModule.h
+++ b/js/src/wasm/WasmModule.h
@@ -52,6 +52,8 @@ class Module : public JS::WasmModule
const ImportVector imports_;
const ExportVector exports_;
const StructTypeVector structTypes_;
+ const DataSegmentVector dataSegments_;
+ const ElemSegmentVector elemSegments_;
const SharedBytes bytecode_;
// These fields are only meaningful when code_->metadata().debugEnabled.
@@ -83,6 +85,7 @@ class Module : public JS::WasmModule
Handle funcImports,
HandleWasmMemoryObject memory,
HandleValVector globalImportValues) const;
+ SharedCode getDebugEnabledCode() const;
class Tier2GeneratorTaskImpl;
@@ -91,6 +94,8 @@ class Module : public JS::WasmModule
ImportVector&& imports,
ExportVector&& exports,
StructTypeVector&& structTypes,
+ DataSegmentVector&& dataSegments,
+ ElemSegmentVector&& elemSegments,
const ShareableBytes& bytecode,
UniqueConstBytes debugUnlinkedCode = nullptr,
UniqueLinkData debugLinkData = nullptr)
@@ -98,6 +103,8 @@ class Module : public JS::WasmModule
imports_(std::move(imports)),
exports_(std::move(exports)),
structTypes_(std::move(structTypes)),
+ dataSegments_(std::move(dataSegments)),
+ elemSegments_(std::move(elemSegments)),
bytecode_(&bytecode),
debugCodeClaimed_(false),
debugUnlinkedCode_(std::move(debugUnlinkedCode)),
@@ -134,7 +141,7 @@ class Module : public JS::WasmModule
// be installed and made visible.
void startTier2(const CompileArgs& args);
- bool finishTier2(const LinkData& linkData, UniqueCodeTier tier2, ModuleEnvironment&& env2);
+ bool finishTier2(const LinkData& linkData2, UniqueCodeTier code2);
void testingBlockOnTier2Complete() const;
bool testingTier2Active() const { return testingTier2Active_; }
@@ -166,15 +173,6 @@ class Module : public JS::WasmModule
typedef RefPtr SharedModule;
-// Compute the (entry point, instance pointer) pair for an entry in the
-// function-indices vector of an element segment. |instance| must be the
-// Instance* that will eventually own the resulting WasmCallee.
-void
-ComputeWasmCallee(const Code& code, const Instance* instance,
- Handle funcImports,
- uint32_t funcIndexIndex, const Table& table,
- const ElemSegment& seg, WasmCallee* out);
-
// JS API implementations:
SharedModule
diff --git a/js/src/wasm/WasmSerialize.h b/js/src/wasm/WasmSerialize.h
index b6846351f308..884662971ac4 100644
--- a/js/src/wasm/WasmSerialize.h
+++ b/js/src/wasm/WasmSerialize.h
@@ -19,6 +19,8 @@
#ifndef wasm_serialize_h
#define wasm_serialize_h
+#include
+
#include "js/Vector.h"
namespace js {
@@ -181,6 +183,36 @@ DeserializePodVectorChecked(const uint8_t* cursor, size_t* remain, mozilla::Vect
return cursor;
}
+template
+inline size_t
+SerializableRefPtr::serializedSize() const
+{
+ return (*this)->serializedSize();
+}
+
+template
+inline uint8_t*
+SerializableRefPtr::serialize(uint8_t* cursor) const
+{
+ return (*this)->serialize(cursor);
+}
+
+template
+inline const uint8_t*
+SerializableRefPtr::deserialize(const uint8_t* cursor)
+{
+ auto* t = js_new>();
+ *this = t;
+ return t->deserialize(cursor);
+}
+
+template
+inline size_t
+SerializableRefPtr::sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const
+{
+ return (*this)->sizeOfExcludingThis(mallocSizeOf);
+}
+
} // namespace wasm
} // namespace js
diff --git a/js/src/wasm/WasmStubs.cpp b/js/src/wasm/WasmStubs.cpp
index 321ac6c5aede..ec67ced54e88 100644
--- a/js/src/wasm/WasmStubs.cpp
+++ b/js/src/wasm/WasmStubs.cpp
@@ -975,9 +975,10 @@ wasm::GenerateDirectCallFromJit(MacroAssembler& masm,
#endif
// Actual call.
- const wasm::CodeTier& codeTier = inst.code().codeTier(inst.code().bestTier());
- uint32_t offset = codeTier.metadata().codeRanges[fe.funcCodeRangeIndex()].funcNormalEntry();
- void* callee = codeTier.segment().base() + offset;
+ const CodeTier& codeTier = inst.code().codeTier(inst.code().bestTier());
+ const MetadataTier& metadata = codeTier.metadata();
+ const CodeRange& codeRange = metadata.codeRange(fe);
+ void* callee = codeTier.segment().base() + codeRange.funcNormalEntry();
masm.assertStackAlignment(WasmStackAlignment);
masm.callJit(ImmPtr(callee));
@@ -1412,7 +1413,7 @@ GenerateImportJitExit(MacroAssembler& masm, const FuncImport& fi, Label* throwLa
Register scratch = ABINonArgReturnReg1; // repeatedly clobbered
// 2.1. Get JSFunction callee
- masm.loadWasmGlobalPtr(fi.tlsDataOffset() + offsetof(FuncImportTls, obj), callee);
+ masm.loadWasmGlobalPtr(fi.tlsDataOffset() + offsetof(FuncImportTls, fun), callee);
// 2.2. Save callee
masm.storePtr(callee, Address(masm.getStackPointer(), argOffset));
diff --git a/js/src/wasm/WasmTypes.cpp b/js/src/wasm/WasmTypes.cpp
index d2362146e2d7..50c512eb3bc6 100644
--- a/js/src/wasm/WasmTypes.cpp
+++ b/js/src/wasm/WasmTypes.cpp
@@ -461,8 +461,7 @@ ElemSegment::serializedSize() const
{
return sizeof(tableIndex) +
sizeof(offsetIfActive) +
- SerializedPodVectorSize(elemFuncIndices) +
- SerializedPodVectorSize(elemCodeRangeIndices(Tier::Serialized));
+ SerializedPodVectorSize(elemFuncIndices);
}
uint8_t*
@@ -471,7 +470,6 @@ ElemSegment::serialize(uint8_t* cursor) const
cursor = WriteBytes(cursor, &tableIndex, sizeof(tableIndex));
cursor = WriteBytes(cursor, &offsetIfActive, sizeof(offsetIfActive));
cursor = SerializePodVector(cursor, elemFuncIndices);
- cursor = SerializePodVector(cursor, elemCodeRangeIndices(Tier::Serialized));
return cursor;
}
@@ -480,16 +478,43 @@ ElemSegment::deserialize(const uint8_t* cursor)
{
(cursor = ReadBytes(cursor, &tableIndex, sizeof(tableIndex))) &&
(cursor = ReadBytes(cursor, &offsetIfActive, sizeof(offsetIfActive))) &&
- (cursor = DeserializePodVector(cursor, &elemFuncIndices)) &&
- (cursor = DeserializePodVector(cursor, &elemCodeRangeIndices(Tier::Serialized)));
+ (cursor = DeserializePodVector(cursor, &elemFuncIndices));
return cursor;
}
size_t
ElemSegment::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const
{
- return elemFuncIndices.sizeOfExcludingThis(mallocSizeOf) +
- elemCodeRangeIndices(Tier::Serialized).sizeOfExcludingThis(mallocSizeOf);
+ return elemFuncIndices.sizeOfExcludingThis(mallocSizeOf);
+}
+
+size_t
+DataSegment::serializedSize() const
+{
+ return sizeof(offsetIfActive) +
+ SerializedPodVectorSize(bytes);
+}
+
+uint8_t*
+DataSegment::serialize(uint8_t* cursor) const
+{
+ cursor = WriteBytes(cursor, &offsetIfActive, sizeof(offsetIfActive));
+ cursor = SerializePodVector(cursor, bytes);
+ return cursor;
+}
+
+const uint8_t*
+DataSegment::deserialize(const uint8_t* cursor)
+{
+ (cursor = ReadBytes(cursor, &offsetIfActive, sizeof(offsetIfActive))) &&
+ (cursor = DeserializePodVector(cursor, &bytes));
+ return cursor;
+}
+
+size_t
+DataSegment::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const
+{
+ return bytes.sizeOfExcludingThis(mallocSizeOf);
}
// Heap length on ARM should fit in an ARM immediate. We approximate the set
diff --git a/js/src/wasm/WasmTypes.h b/js/src/wasm/WasmTypes.h
index 06ae09e12aec..07419176e4d1 100644
--- a/js/src/wasm/WasmTypes.h
+++ b/js/src/wasm/WasmTypes.h
@@ -138,6 +138,21 @@ typedef Vector VectorName;
const uint8_t* deserialize(const uint8_t* cursor) override; \
size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const override;
+template
+struct SerializableRefPtr : RefPtr
+{
+ using RefPtr::operator=;
+
+ SerializableRefPtr() = default;
+
+ template
+ MOZ_IMPLICIT SerializableRefPtr(U&& u)
+ : RefPtr(std::forward(u))
+ {}
+
+ WASM_DECLARE_SERIALIZABLE(SerializableRefPtr)
+};
+
// This reusable base class factors out the logic for a resource that is shared
// by multiple instances/modules but should only be counted once when computing
// about:memory stats.
@@ -860,6 +875,7 @@ class InitExpr
};
private:
+ // Note: all this private data is currently (de)serialized via memcpy().
Kind kind_;
union U {
LitVal val_;
@@ -1088,122 +1104,80 @@ class GlobalDesc
typedef Vector GlobalDescVector;
-// ElemSegment represents an element segment in the module where each element
-// describes both its function index and its code range.
-//
-// The codeRangeIndices are laid out in a nondeterminstic order as a result of
-// parallel compilation.
-//
-// NB: if you add members to this, or change the type of existing ones,
-// remember to update the ElemSegment copying code in Module::instantiate
-// accordingly.
+// When a ElemSegment is "passive" it is shared between a wasm::Module and its
+// wasm::Instances. To allow each segment to be released as soon as the last
+// Instance table.drops it and the Module is destroyed, each ElemSegment is
+// individually atomically ref-counted.
-struct ElemSegment
+struct ElemSegment : AtomicRefCounted
{
uint32_t tableIndex;
Maybe offsetIfActive;
Uint32Vector elemFuncIndices;
- Uint32Vector elemCodeRangeIndices1_;
- mutable Uint32Vector elemCodeRangeIndices2_;
- ElemSegment() = default;
- ElemSegment(uint32_t tableIndex, Maybe&& offsetIfActive,
- Uint32Vector&& elemFuncIndices)
- : tableIndex(tableIndex),
- offsetIfActive(std::move(offsetIfActive)),
- elemFuncIndices(std::move(elemFuncIndices))
- {}
-
- Uint32Vector& elemCodeRangeIndices(Tier t) {
- switch (t) {
- case Tier::Baseline:
- return elemCodeRangeIndices1_;
- case Tier::Ion:
- return elemCodeRangeIndices2_;
- default:
- MOZ_CRASH("No such tier");
- }
+ bool active() const {
+ return !!offsetIfActive;
}
- const Uint32Vector& elemCodeRangeIndices(Tier t) const {
- switch (t) {
- case Tier::Baseline:
- return elemCodeRangeIndices1_;
- case Tier::Ion:
- return elemCodeRangeIndices2_;
- default:
- MOZ_CRASH("No such tier");
- }
+ InitExpr offset() const {
+ return *offsetIfActive;
}
- void setTier2(Uint32Vector&& elemCodeRangeIndices) const {
- MOZ_ASSERT(elemCodeRangeIndices2_.length() == 0);
- elemCodeRangeIndices2_ = std::move(elemCodeRangeIndices);
+ size_t length() const {
+ return elemFuncIndices.length();
}
WASM_DECLARE_SERIALIZABLE(ElemSegment)
};
-// The ElemSegmentVector is laid out in a deterministic order.
+typedef RefPtr MutableElemSegment;
+typedef SerializableRefPtr SharedElemSegment;
+typedef Vector ElemSegmentVector;
-typedef Vector ElemSegmentVector;
+// DataSegmentEnv holds the initial results of decoding a data segment from the
+// bytecode and is stored in the ModuleEnvironment during compilation. When
+// compilation completes, (non-Env) DataSegments are created and stored in
+// the wasm::Module which contain copies of the data segment payload. This
+// allows non-compilation uses of wasm validation to avoid expensive copies.
+//
+// When a DataSegment is "passive" it is shared between a wasm::Module and its
+// wasm::Instances. To allow each segment to be released as soon as the last
+// Instance mem.drops it and the Module is destroyed, each DataSegment is
+// individually atomically ref-counted.
-// DataSegment describes the offset of a data segment in the bytecode that is
-// to be copied at a given offset into linear memory upon instantiation.
-
-struct DataSegment
+struct DataSegmentEnv
{
Maybe offsetIfActive;
uint32_t bytecodeOffset;
uint32_t length;
};
-typedef Vector DataSegmentVector;
+typedef Vector DataSegmentEnvVector;
-// A pairing of entry point and instance pointer, used for lazy table
-// initialisation.
-
-struct WasmCallee
+struct DataSegment : AtomicRefCounted
{
- WasmCallee() : instance(nullptr), entry(nullptr) {}
- WasmCallee(const Instance* instance, void* entry)
- : instance(instance),
- entry(entry)
+ Maybe offsetIfActive;
+ Bytes bytes;
+
+ DataSegment() = default;
+ explicit DataSegment(const DataSegmentEnv& src)
+ : offsetIfActive(src.offsetIfActive)
{}
- // The instance associated with the code address.
- const Instance* instance;
- // The table entry code address.
- void* entry;
+
+ bool active() const {
+ return !!offsetIfActive;
+ }
+
+ InitExpr offset() const {
+ return *offsetIfActive;
+ }
+
+ WASM_DECLARE_SERIALIZABLE(DataSegment)
};
-// Support for passive data and element segments -- lazy initialisation.
-//
-// At instantiation time, we prepare the required initialising data for each
-// passive segment, copying it into new memory. This is done separately for
-// data segments and elem segments. We also create a vector of pointers to
-// this copied data, with nullptr for entries corresponding to active
-// segments. This vector has the same length as the vector of data/elem
-// segments respectively in the originating module.
-//
-// The vector of pointers and the prepared data are owned by the instance
-// that is constructed. We have to do this so that the initialising data is
-// available at run time in the instance, in particular to
-// Instance::{mem,table}{Init,Drop}.
-//
-// The final structures have type DataSegmentInitVector and
-// ElemSegmentInitVector respectively.
-
-typedef Vector DataSegmentInit;
-typedef Vector ElemSegmentInit;
-
-// We store (unique) pointers rather than references to the initialising
-// vectors in order that they can be incrementally freed as we execute
-// {memory,table}.drop instructions.
-
-typedef Vector, 0, SystemAllocPolicy>
- DataSegmentInitVector;
-typedef Vector, 0, SystemAllocPolicy>
- ElemSegmentInitVector;
+typedef RefPtr MutableDataSegment;
+typedef SerializableRefPtr SharedDataSegment;
+typedef Vector DataSegmentVector;
// FuncTypeIdDesc describes a function type that can be used by call_indirect
// and table-entry prologues to structurally compare whether the caller and
@@ -2033,11 +2007,10 @@ struct FuncImportTls
// for bidirectional registration purposes.
jit::BaselineScript* baselineScript;
- // A GC pointer which keeps the callee alive. For imported wasm functions,
- // this points to the wasm function's WasmInstanceObject. For all other
- // imported functions, 'obj' points to the JSFunction.
- GCPtrObject obj;
- static_assert(sizeof(GCPtrObject) == sizeof(void*), "for JIT access");
+ // A GC pointer which keeps the callee alive and is used to recover import
+ // values for lazy table initialization.
+ GCPtrFunction fun;
+ static_assert(sizeof(GCPtrFunction) == sizeof(void*), "for JIT access");
};
// TableTls describes the region of wasm global memory allocated in the
diff --git a/js/src/wasm/WasmValidate.cpp b/js/src/wasm/WasmValidate.cpp
index fb873519258e..5ed0a8394239 100644
--- a/js/src/wasm/WasmValidate.cpp
+++ b/js/src/wasm/WasmValidate.cpp
@@ -2202,6 +2202,10 @@ DecodeElemSection(Decoder& d, ModuleEnvironment* env)
return d.fail("too many elem segments");
}
+ if (!env->elemSegments.reserve(numSegments)) {
+ return false;
+ }
+
for (uint32_t i = 0; i < numSegments; i++) {
uint32_t initializerKind;
if (!d.readVarU32(&initializerKind)) {
@@ -2219,7 +2223,13 @@ DecodeElemSection(Decoder& d, ModuleEnvironment* env)
return d.fail("elem segment requires a table section");
}
- Maybe offsetIfActive;
+ MutableElemSegment seg = js_new();
+ if (!seg) {
+ return false;
+ }
+
+ seg->tableIndex = 0;
+
if (initializerKind == uint32_t(InitializerKind::Active)) {
InitExpr offset;
if (!DecodeInitializerExpression(d, env->gcTypesEnabled(), env->globals, ValType::I32,
@@ -2227,7 +2237,7 @@ DecodeElemSection(Decoder& d, ModuleEnvironment* env)
{
return false;
}
- offsetIfActive.emplace(offset);
+ seg->offsetIfActive.emplace(offset);
}
uint32_t numElems;
@@ -2239,17 +2249,16 @@ DecodeElemSection(Decoder& d, ModuleEnvironment* env)
return d.fail("too many table elements");
}
- Uint32Vector elemFuncIndices;
- if (!elemFuncIndices.resize(numElems)) {
+ if (!seg->elemFuncIndices.reserve(numElems)) {
return false;
}
for (uint32_t i = 0; i < numElems; i++) {
- if (!d.readVarU32(&elemFuncIndices[i])) {
+ uint32_t funcIndex;
+ if (!d.readVarU32(&funcIndex)) {
return d.fail("failed to read element function index");
}
- uint32_t funcIndex = elemFuncIndices[i];
if (funcIndex >= env->numFuncs()) {
return d.fail("table element out of range");
}
@@ -2263,17 +2272,16 @@ DecodeElemSection(Decoder& d, ModuleEnvironment* env)
#ifdef WASM_PRIVATE_REFTYPES
if (env->tables[0].importedOrExported &&
- !FuncTypeIsJSCompatible(d, *env->funcTypes[elemFuncIndices[i]]))
+ !FuncTypeIsJSCompatible(d, *env->funcTypes[funcIndex]))
{
return false;
}
#endif
+
+ seg->elemFuncIndices.infallibleAppend(funcIndex);
}
- if (!env->elemSegments.emplaceBack(0, std::move(offsetIfActive),
- std::move(elemFuncIndices))) {
- return false;
- }
+ env->elemSegments.infallibleAppend(std::move(seg));
}
return d.finishSection(*range, "elem");
@@ -2463,7 +2471,7 @@ DecodeDataSection(Decoder& d, ModuleEnvironment* env)
return d.fail("data segment requires a memory section");
}
- DataSegment seg;
+ DataSegmentEnv seg;
if (initializerKind == uint32_t(InitializerKind::Active)) {
InitExpr segOffset;
if (!DecodeInitializerExpression(d, env->gcTypesEnabled(), env->globals, ValType::I32,
diff --git a/js/src/wasm/WasmValidate.h b/js/src/wasm/WasmValidate.h
index 58b0fc61027f..e36e37487718 100644
--- a/js/src/wasm/WasmValidate.h
+++ b/js/src/wasm/WasmValidate.h
@@ -178,7 +178,7 @@ struct ModuleEnvironment
MaybeSectionRange codeSection;
// Fields decoded as part of the wasm module tail:
- DataSegmentVector dataSegments;
+ DataSegmentEnvVector dataSegments;
Maybe moduleName;
NameInBytecodeVector funcNames;
CustomSectionVector customSections;
diff --git a/js/xpconnect/idl/xpccomponents.idl b/js/xpconnect/idl/xpccomponents.idl
index c9cdf0756940..29a82b9efe3f 100644
--- a/js/xpconnect/idl/xpccomponents.idl
+++ b/js/xpconnect/idl/xpccomponents.idl
@@ -727,6 +727,9 @@ interface nsIXPCComponents_Utils : nsISupports
/* Create a commandline object. */
nsISupports createCommandLine();
+ /* Create a command params object. */
+ nsICommandParams createCommandParams();
+
/* Create a loadcontext object. */
nsILoadContext createLoadContext();
diff --git a/js/xpconnect/src/XPCComponents.cpp b/js/xpconnect/src/XPCComponents.cpp
index 789437de14e4..2037ffba95ad 100644
--- a/js/xpconnect/src/XPCComponents.cpp
+++ b/js/xpconnect/src/XPCComponents.cpp
@@ -44,6 +44,7 @@
#include "GeckoProfiler.h"
#include "mozilla/EditorSpellCheck.h"
#include "nsCommandLine.h"
+#include "nsCommandParams.h"
#include "nsPersistentProperties.h"
using namespace mozilla;
@@ -3233,6 +3234,15 @@ nsXPCComponents_Utils::CreateCommandLine(nsISupports** aCommandLine)
return NS_OK;
}
+NS_IMETHODIMP
+nsXPCComponents_Utils::CreateCommandParams(nsICommandParams** aCommandParams)
+{
+ NS_ENSURE_ARG_POINTER(aCommandParams);
+ nsCOMPtr commandParams = new nsCommandParams();
+ commandParams.forget(aCommandParams);
+ return NS_OK;
+}
+
NS_IMETHODIMP
nsXPCComponents_Utils::CreateLoadContext(nsILoadContext** aLoadContext)
{
diff --git a/js/xpconnect/src/XPCShellImpl.cpp b/js/xpconnect/src/XPCShellImpl.cpp
index 416b9bc39a54..30ef48dbba95 100644
--- a/js/xpconnect/src/XPCShellImpl.cpp
+++ b/js/xpconnect/src/XPCShellImpl.cpp
@@ -381,8 +381,7 @@ Load(JSContext* cx, unsigned argc, Value* vp)
return false;
}
JS::CompileOptions options(cx);
- options.setUTF8(true)
- .setFileAndLine(filename.get(), 1)
+ options.setFileAndLine(filename.get(), 1)
.setIsRunOnce(true);
JS::Rooted script(cx);
JS::Rooted global(cx, JS::CurrentGlobalOrNull(cx));
@@ -735,8 +734,7 @@ ProcessUtf8Line(AutoJSAPI& jsapi, const char* buffer, int startline)
JSContext* cx = jsapi.cx();
JS::CompileOptions options(cx);
options.setFileAndLine("typein", startline)
- .setIsRunOnce(true)
- .setUTF8(true);
+ .setIsRunOnce(true);
JS::RootedScript script(cx);
if (!JS::CompileUtf8(cx, options, buffer, strlen(buffer), &script)) {
@@ -800,8 +798,7 @@ ProcessFile(AutoJSAPI& jsapi, const char* filename, FILE* file, bool forceTTY)
JS::RootedScript script(cx);
JS::RootedValue unused(cx);
JS::CompileOptions options(cx);
- options.setUTF8(true)
- .setFileAndLine(filename, 1)
+ options.setFileAndLine(filename, 1)
.setIsRunOnce(true)
.setNoScriptRval(true);
if (!JS::CompileUtf8File(cx, options, file, &script)) {
@@ -1032,9 +1029,9 @@ ProcessArgs(AutoJSAPI& jsapi, char** argv, int argc, XPCShellDirProvider* aDirPr
}
JS::CompileOptions opts(cx);
- opts.setUTF8(true)
- .setFileAndLine("-e", 1);
- JS::Evaluate(cx, opts, argv[i], strlen(argv[i]), &rval);
+ opts.setFileAndLine("-e", 1);
+
+ JS::EvaluateUtf8(cx, opts, argv[i], strlen(argv[i]), &rval);
isInteractive = false;
break;
diff --git a/layout/base/AccessibleCaretManager.cpp b/layout/base/AccessibleCaretManager.cpp
index b8b6fc60289d..30a736cc2943 100644
--- a/layout/base/AccessibleCaretManager.cpp
+++ b/layout/base/AccessibleCaretManager.cpp
@@ -27,9 +27,6 @@
#include "nsFrameSelection.h"
#include "nsGenericHTMLElement.h"
#include "nsIHapticFeedback.h"
-#ifdef MOZ_WIDGET_ANDROID
-#include "nsWindow.h"
-#endif
namespace mozilla {
@@ -894,17 +891,6 @@ AccessibleCaretManager::SetSelectionDragState(bool aState) const
if (fs) {
fs->SetDragState(aState);
}
-
- // Pin Fennecs DynamicToolbarAnimator in place before/after dragging,
- // to avoid co-incident screen scrolling.
-#ifdef MOZ_WIDGET_ANDROID
- if (XRE_IsParentProcess()) {
- nsIDocument* doc = mPresShell->GetDocument();
- MOZ_ASSERT(doc);
- nsIWidget* widget = nsContentUtils::WidgetForDocument(doc);
- static_cast(widget)->SetSelectionDragState(aState);
- }
-#endif
}
bool
diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp
index 7330fbf7cefe..84801c2c7a37 100644
--- a/layout/base/nsPresContext.cpp
+++ b/layout/base/nsPresContext.cpp
@@ -1634,7 +1634,7 @@ nsITheme*
nsPresContext::GetTheme()
{
if (!sNoTheme && !mTheme) {
- mTheme = NS_NewNativeTheme();
+ mTheme = do_GetService("@mozilla.org/chrome/chrome-native-theme;1");
if (!mTheme)
sNoTheme = true;
}
diff --git a/layout/build/nsContentDLF.cpp b/layout/build/nsContentDLF.cpp
index b0ed9ebb10dc..5b38947343c8 100644
--- a/layout/build/nsContentDLF.cpp
+++ b/layout/build/nsContentDLF.cpp
@@ -30,24 +30,19 @@
#include "nsCharsetSource.h"
#include "nsMimeTypes.h"
#include "DecoderTraits.h"
+#ifdef MOZ_XUL
+#include "XULDocument.h"
+#endif
// plugins
#include "nsIPluginHost.h"
#include "nsPluginHost.h"
-static NS_DEFINE_CID(kPluginDocumentCID, NS_PLUGINDOCUMENT_CID);
// Factory code for creating variations on html documents
#undef NOISY_REGISTRY
-static NS_DEFINE_IID(kHTMLDocumentCID, NS_HTMLDOCUMENT_CID);
-static NS_DEFINE_IID(kXMLDocumentCID, NS_XMLDOCUMENT_CID);
-static NS_DEFINE_IID(kSVGDocumentCID, NS_SVGDOCUMENT_CID);
-static NS_DEFINE_IID(kVideoDocumentCID, NS_VIDEODOCUMENT_CID);
-static NS_DEFINE_IID(kImageDocumentCID, NS_IMAGEDOCUMENT_CID);
-static NS_DEFINE_IID(kXULDocumentCID, NS_XULDOCUMENT_CID);
-
already_AddRefed NS_NewContentViewer();
static const char* const gHTMLTypes[] = {
@@ -185,7 +180,12 @@ nsContentDLF::CreateInstance(const char* aCommand,
nsContentUtils::IsPlainTextType(contentType)) {
return CreateDocument(aCommand,
aChannel, aLoadGroup,
- aContainer, kHTMLDocumentCID,
+ aContainer, [] () -> already_AddRefed {
+ nsCOMPtr doc;
+ nsresult rv = NS_NewHTMLDocument(getter_AddRefs(doc));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
aDocListener, aDocViewer);
}
@@ -193,7 +193,12 @@ nsContentDLF::CreateInstance(const char* aCommand,
if (IsTypeInList(contentType, gXMLTypes)) {
return CreateDocument(aCommand,
aChannel, aLoadGroup,
- aContainer, kXMLDocumentCID,
+ aContainer, [] () -> already_AddRefed {
+ nsCOMPtr doc;
+ nsresult rv = NS_NewXMLDocument(getter_AddRefs(doc));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
aDocListener, aDocViewer);
}
@@ -201,7 +206,12 @@ nsContentDLF::CreateInstance(const char* aCommand,
if (IsTypeInList(contentType, gSVGTypes)) {
return CreateDocument(aCommand,
aChannel, aLoadGroup,
- aContainer, kSVGDocumentCID,
+ aContainer, [] () -> already_AddRefed {
+ nsCOMPtr doc;
+ nsresult rv = NS_NewSVGDocument(getter_AddRefs(doc));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
aDocListener, aDocViewer);
}
@@ -219,7 +229,12 @@ nsContentDLF::CreateInstance(const char* aCommand,
/* DecoderDoctorDiagnostics* */ nullptr)) {
return CreateDocument(aCommand,
aChannel, aLoadGroup,
- aContainer, kVideoDocumentCID,
+ aContainer, [] () -> already_AddRefed {
+ nsCOMPtr doc;
+ nsresult rv = NS_NewVideoDocument(getter_AddRefs(doc));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
aDocListener, aDocViewer);
}
@@ -227,7 +242,12 @@ nsContentDLF::CreateInstance(const char* aCommand,
if (IsImageContentType(contentType.get())) {
return CreateDocument(aCommand,
aChannel, aLoadGroup,
- aContainer, kImageDocumentCID,
+ aContainer, [] () -> already_AddRefed {
+ nsCOMPtr doc;
+ nsresult rv = NS_NewImageDocument(getter_AddRefs(doc));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
aDocListener, aDocViewer);
}
@@ -238,7 +258,12 @@ nsContentDLF::CreateInstance(const char* aCommand,
nsPluginHost::eExcludeNone)) {
return CreateDocument(aCommand,
aChannel, aLoadGroup,
- aContainer, kPluginDocumentCID,
+ aContainer, [] () -> already_AddRefed {
+ nsCOMPtr doc;
+ nsresult rv = NS_NewPluginDocument(getter_AddRefs(doc));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ return doc.forget();
+ },
aDocListener, aDocViewer);
}
@@ -269,7 +294,8 @@ nsContentDLF::CreateBlankDocument(nsILoadGroup* aLoadGroup,
nsDocShell* aContainer)
{
// create a new blank HTML document
- nsCOMPtr blankDoc(do_CreateInstance(kHTMLDocumentCID));
+ nsCOMPtr blankDoc;
+ mozilla::Unused << NS_NewHTMLDocument(getter_AddRefs(blankDoc));
if (!blankDoc) {
return nullptr;
@@ -324,16 +350,18 @@ nsContentDLF::CreateBlankDocument(nsILoadGroup* aLoadGroup,
return blankDoc.forget();
}
-
nsresult
nsContentDLF::CreateDocument(const char* aCommand,
nsIChannel* aChannel,
nsILoadGroup* aLoadGroup,
nsIDocShell* aContainer,
- const nsCID& aDocumentCID,
+ nsContentDLF::DocumentCreator
+ aDocumentCreator,
nsIStreamListener** aDocListener,
nsIContentViewer** aContentViewer)
{
+ MOZ_ASSERT(aDocumentCreator);
+
nsresult rv = NS_ERROR_FAILURE;
nsCOMPtr aURL;
@@ -350,8 +378,8 @@ nsContentDLF::CreateDocument(const char* aCommand,
#endif
// Create the document
- nsCOMPtr doc = do_CreateInstance(aDocumentCID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr doc = aDocumentCreator();
+ NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
// Create the content viewer XXX: could reuse content viewer here!
nsCOMPtr contentViewer = NS_NewContentViewer();
@@ -379,8 +407,8 @@ nsContentDLF::CreateXULDocument(const char* aCommand,
nsIStreamListener** aDocListener,
nsIContentViewer** aContentViewer)
{
- nsresult rv;
- nsCOMPtr doc = do_CreateInstance(kXULDocumentCID, &rv);
+ nsCOMPtr doc;
+ nsresult rv = NS_NewXULDocument(getter_AddRefs(doc));
if (NS_FAILED(rv)) return rv;
nsCOMPtr contentViewer = NS_NewContentViewer();
diff --git a/layout/build/nsContentDLF.h b/layout/build/nsContentDLF.h
index 20a567e66c0b..3edc12fc2b3b 100644
--- a/layout/build/nsContentDLF.h
+++ b/layout/build/nsContentDLF.h
@@ -32,11 +32,12 @@ public:
nsresult InitUAStyleSheet();
+ typedef already_AddRefed (*DocumentCreator)();
nsresult CreateDocument(const char* aCommand,
nsIChannel* aChannel,
nsILoadGroup* aLoadGroup,
nsIDocShell* aContainer,
- const nsCID& aDocumentCID,
+ DocumentCreator aDocumentCreator,
nsIStreamListener** aDocListener,
nsIContentViewer** aContentViewer);
diff --git a/layout/build/nsLayoutCID.h b/layout/build/nsLayoutCID.h
index f0ee006aca2c..bae5af73d9bf 100644
--- a/layout/build/nsLayoutCID.h
+++ b/layout/build/nsLayoutCID.h
@@ -23,10 +23,6 @@
#define NS_SDBCONNECTION_CID \
{ 0xae2793c0, 0x2ba3, 0x4adb, { 0x9c, 0x5e, 0xc2, 0x35, 0x25, 0x81, 0x2c, 0x64 } }
-// {A746DECD-AE74-4d86-8E75-4FDA81A9BE90}
-#define NS_DOMSESSIONSTORAGEMANAGER_CID \
-{ 0xa746decd, 0xae74, 0x4d86, { 0x8e, 0x75, 0x4f, 0xda, 0x81, 0xa9, 0xbe, 0x90 } }
-
// {656DB07C-AA80-49e4-BCE8-E431BAAE697D}
#define NS_DOMLOCALSTORAGEMANAGER_CID \
{ 0x656db07c, 0xaa80, 0x49e4, { 0xbc, 0xe8, 0xe4, 0x31, 0xba, 0xae, 0x69, 0x7d } }
diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp
index e552e4bf3792..a92166a77435 100644
--- a/layout/build/nsLayoutModule.cpp
+++ b/layout/build/nsLayoutModule.cpp
@@ -24,7 +24,6 @@
#include "nsIContentViewer.h"
#include "nsIController.h"
#include "nsIControllers.h"
-#include "nsIDocument.h"
#include "nsIDocumentEncoder.h"
#include "nsIFactory.h"
#include "nsIIdleService.h"
@@ -69,7 +68,6 @@
#include "mozilla/dom/network/UDPSocketChild.h"
#include "mozilla/dom/quota/QuotaManagerService.h"
#include "mozilla/dom/ServiceWorkerManager.h"
-#include "mozilla/dom/SessionStorageManager.h"
#include "mozilla/dom/StorageActivityService.h"
#include "mozilla/dom/WorkerDebuggerManager.h"
#include "mozilla/dom/Notification.h"
@@ -114,10 +112,6 @@ class nsIDocumentLoaderFactory;
#include "inDeepTreeWalker.h"
-#ifdef MOZ_XUL
-#include "XULDocument.h"
-#endif
-
static void Shutdown();
#include "nsGeolocation.h"
@@ -175,7 +169,6 @@ already_AddRefed NS_CreatePresentationService();
typedef mozilla::dom::BlobURL::Mutator BlobURLMutator;
NS_GENERIC_FACTORY_CONSTRUCTOR(BlobURLMutator)
NS_GENERIC_FACTORY_CONSTRUCTOR(LocalStorageManager)
-NS_GENERIC_FACTORY_CONSTRUCTOR(SessionStorageManager)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(DOMRequestService,
DOMRequestService::FactoryCreate)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(QuotaManagerService,
@@ -326,10 +319,6 @@ MAKE_CTOR(CreateNewFrameTraversal, nsIFrameTraversal, NS_CreateFrameTr
NS_GENERIC_FACTORY_CONSTRUCTOR(inDeepTreeWalker)
MAKE_CTOR2(CreateContentViewer, nsIContentViewer, NS_NewContentViewer)
-MAKE_CTOR(CreateHTMLDocument, nsIDocument, NS_NewHTMLDocument)
-MAKE_CTOR(CreateXMLDocument, nsIDocument, NS_NewXMLDocument)
-MAKE_CTOR(CreateSVGDocument, nsIDocument, NS_NewSVGDocument)
-MAKE_CTOR(CreateImageDocument, nsIDocument, NS_NewImageDocument)
MAKE_CTOR(CreateTextEncoder, nsIDocumentEncoder, NS_NewTextEncoder)
MAKE_CTOR(CreateHTMLCopyTextEncoder, nsIDocumentEncoder, NS_NewHTMLCopyTextEncoder)
MAKE_CTOR(CreateXMLContentSerializer, nsIContentSerializer, NS_NewXMLContentSerializer)
@@ -337,9 +326,6 @@ MAKE_CTOR(CreateHTMLContentSerializer, nsIContentSerializer, NS_NewHTM
MAKE_CTOR(CreateXHTMLContentSerializer, nsIContentSerializer, NS_NewXHTMLContentSerializer)
MAKE_CTOR(CreatePlainTextSerializer, nsIContentSerializer, NS_NewPlainTextSerializer)
MAKE_CTOR(CreateContentPolicy, nsIContentPolicy, NS_NewContentPolicy)
-#ifdef MOZ_XUL
-MAKE_CTOR(CreateXULDocument, nsIDocument, NS_NewXULDocument)
-#endif
MAKE_CTOR(CreateContentDLF, nsIDocumentLoaderFactory, NS_NewContentDocumentLoaderFactory)
MAKE_CTOR(CreateEventListenerService, nsIEventListenerService, NS_NewEventListenerService)
MAKE_CTOR(CreateGlobalMessageManager, nsISupports, NS_NewGlobalMessageManager)
@@ -347,8 +333,6 @@ MAKE_CTOR(CreateParentMessageManager, nsISupports, NS_NewPar
MAKE_CTOR(CreateChildMessageManager, nsISupports, NS_NewChildProcessMessageManager)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDataDocumentContentPolicy)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsNoDataProtocolContentPolicy)
-MAKE_CTOR(CreatePluginDocument, nsIDocument, NS_NewPluginDocument)
-MAKE_CTOR(CreateVideoDocument, nsIDocument, NS_NewVideoDocument)
MAKE_CTOR(CreateFocusManager, nsIFocusManager, NS_NewFocusManager)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsStyleSheetService, Init)
@@ -445,10 +429,6 @@ NS_DEFINE_NAMED_CID(NS_LAYOUT_DEBUGGER_CID);
NS_DEFINE_NAMED_CID(NS_FRAMETRAVERSAL_CID);
NS_DEFINE_NAMED_CID(IN_DEEPTREEWALKER_CID);
NS_DEFINE_NAMED_CID(NS_CONTENT_VIEWER_CID);
-NS_DEFINE_NAMED_CID(NS_HTMLDOCUMENT_CID);
-NS_DEFINE_NAMED_CID(NS_XMLDOCUMENT_CID);
-NS_DEFINE_NAMED_CID(NS_SVGDOCUMENT_CID);
-NS_DEFINE_NAMED_CID(NS_IMAGEDOCUMENT_CID);
NS_DEFINE_NAMED_CID(NS_TEXT_ENCODER_CID);
NS_DEFINE_NAMED_CID(NS_HTMLCOPY_TEXT_ENCODER_CID);
NS_DEFINE_NAMED_CID(NS_XMLCONTENTSERIALIZER_CID);
@@ -460,21 +440,15 @@ NS_DEFINE_NAMED_CID(NS_SCRIPTABLEUNESCAPEHTML_CID);
NS_DEFINE_NAMED_CID(NS_CONTENTPOLICY_CID);
NS_DEFINE_NAMED_CID(NS_DATADOCUMENTCONTENTPOLICY_CID);
NS_DEFINE_NAMED_CID(NS_NODATAPROTOCOLCONTENTPOLICY_CID);
-#ifdef MOZ_XUL
-NS_DEFINE_NAMED_CID(NS_XULDOCUMENT_CID);
-#endif
NS_DEFINE_NAMED_CID(NS_CONTENT_DOCUMENT_LOADER_FACTORY_CID);
NS_DEFINE_NAMED_CID(NS_JSPROTOCOLHANDLER_CID);
NS_DEFINE_NAMED_CID(NS_JSURI_CID);
NS_DEFINE_NAMED_CID(NS_JSURIMUTATOR_CID);
NS_DEFINE_NAMED_CID(NS_PLUGINDOCLOADERFACTORY_CID);
-NS_DEFINE_NAMED_CID(NS_PLUGINDOCUMENT_CID);
-NS_DEFINE_NAMED_CID(NS_VIDEODOCUMENT_CID);
NS_DEFINE_NAMED_CID(NS_STYLESHEETSERVICE_CID);
NS_DEFINE_NAMED_CID(NS_HOSTOBJECTURI_CID);
NS_DEFINE_NAMED_CID(NS_HOSTOBJECTURIMUTATOR_CID);
NS_DEFINE_NAMED_CID(NS_SDBCONNECTION_CID);
-NS_DEFINE_NAMED_CID(NS_DOMSESSIONSTORAGEMANAGER_CID);
NS_DEFINE_NAMED_CID(NS_DOMLOCALSTORAGEMANAGER_CID);
NS_DEFINE_NAMED_CID(DOMREQUEST_SERVICE_CID);
NS_DEFINE_NAMED_CID(QUOTAMANAGER_SERVICE_CID);
@@ -538,10 +512,6 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
{ &kNS_FRAMETRAVERSAL_CID, false, nullptr, CreateNewFrameTraversal },
{ &kIN_DEEPTREEWALKER_CID, false, nullptr, inDeepTreeWalkerConstructor },
{ &kNS_CONTENT_VIEWER_CID, false, nullptr, CreateContentViewer },
- { &kNS_HTMLDOCUMENT_CID, false, nullptr, CreateHTMLDocument },
- { &kNS_XMLDOCUMENT_CID, false, nullptr, CreateXMLDocument },
- { &kNS_SVGDOCUMENT_CID, false, nullptr, CreateSVGDocument },
- { &kNS_IMAGEDOCUMENT_CID, false, nullptr, CreateImageDocument },
{ &kNS_TEXT_ENCODER_CID, false, nullptr, CreateTextEncoder },
{ &kNS_HTMLCOPY_TEXT_ENCODER_CID, false, nullptr, CreateHTMLCopyTextEncoder },
{ &kNS_XMLCONTENTSERIALIZER_CID, false, nullptr, CreateXMLContentSerializer },
@@ -553,21 +523,15 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
{ &kNS_CONTENTPOLICY_CID, false, nullptr, CreateContentPolicy },
{ &kNS_DATADOCUMENTCONTENTPOLICY_CID, false, nullptr, nsDataDocumentContentPolicyConstructor },
{ &kNS_NODATAPROTOCOLCONTENTPOLICY_CID, false, nullptr, nsNoDataProtocolContentPolicyConstructor },
-#ifdef MOZ_XUL
- { &kNS_XULDOCUMENT_CID, false, nullptr, CreateXULDocument },
-#endif
{ &kNS_CONTENT_DOCUMENT_LOADER_FACTORY_CID, false, nullptr, CreateContentDLF },
{ &kNS_JSPROTOCOLHANDLER_CID, false, nullptr, nsJSProtocolHandler::Create },
{ &kNS_JSURI_CID, false, nullptr, nsJSURIMutatorConstructor }, // do_CreateInstance returns mutator
{ &kNS_JSURIMUTATOR_CID, false, nullptr, nsJSURIMutatorConstructor },
{ &kNS_PLUGINDOCLOADERFACTORY_CID, false, nullptr, CreateContentDLF },
- { &kNS_PLUGINDOCUMENT_CID, false, nullptr, CreatePluginDocument },
- { &kNS_VIDEODOCUMENT_CID, false, nullptr, CreateVideoDocument },
{ &kNS_STYLESHEETSERVICE_CID, false, nullptr, nsStyleSheetServiceConstructor },
{ &kNS_HOSTOBJECTURI_CID, false, nullptr, BlobURLMutatorConstructor }, // do_CreateInstance returns mutator
{ &kNS_HOSTOBJECTURIMUTATOR_CID, false, nullptr, BlobURLMutatorConstructor },
{ &kNS_SDBCONNECTION_CID, false, nullptr, SDBConnection::Create },
- { &kNS_DOMSESSIONSTORAGEMANAGER_CID, false, nullptr, SessionStorageManagerConstructor },
{ &kNS_DOMLOCALSTORAGEMANAGER_CID, false, nullptr, LocalStorageManagerConstructor },
{ &kDOMREQUEST_SERVICE_CID, false, nullptr, DOMRequestServiceConstructor },
{ &kQUOTAMANAGER_SERVICE_CID, false, nullptr, QuotaManagerServiceConstructor },
@@ -623,8 +587,6 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
XPCONNECT_CONTRACTS
{ "@mozilla.org/inspector/deep-tree-walker;1", &kIN_DEEPTREEWALKER_CID },
- { "@mozilla.org/xml/xml-document;1", &kNS_XMLDOCUMENT_CID },
- { "@mozilla.org/svg/svg-document;1", &kNS_SVGDOCUMENT_CID },
{ NS_DOC_ENCODER_CONTRACTID_BASE "text/xml", &kNS_TEXT_ENCODER_CID },
{ NS_DOC_ENCODER_CONTRACTID_BASE "application/xml", &kNS_TEXT_ENCODER_CID },
{ NS_DOC_ENCODER_CONTRACTID_BASE "application/xhtml+xml", &kNS_TEXT_ENCODER_CID },
@@ -650,7 +612,6 @@ static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
{ NS_STYLESHEETSERVICE_CONTRACTID, &kNS_STYLESHEETSERVICE_CID },
{ NS_SDBCONNECTION_CONTRACTID, &kNS_SDBCONNECTION_CID },
{ "@mozilla.org/dom/localStorage-manager;1", &kNS_DOMLOCALSTORAGEMANAGER_CID },
- { "@mozilla.org/dom/sessionStorage-manager;1", &kNS_DOMSESSIONSTORAGEMANAGER_CID },
{ DOMREQUEST_SERVICE_CONTRACTID, &kDOMREQUEST_SERVICE_CID },
{ QUOTAMANAGER_SERVICE_CONTRACTID, &kQUOTAMANAGER_SERVICE_CID },
{ SERVICEWORKERMANAGER_CONTRACTID, &kSERVICEWORKERMANAGER_CID },
diff --git a/layout/generic/TextDrawTarget.h b/layout/generic/TextDrawTarget.h
index 2370d51f54d7..1f20f0f4eba6 100644
--- a/layout/generic/TextDrawTarget.h
+++ b/layout/generic/TextDrawTarget.h
@@ -448,7 +448,7 @@ public:
MOZ_RELEASE_ASSERT(aPattern.GetType() == PatternType::COLOR &&
aStrokeOptions.mDashLength == 0);
- wr::BorderWidths widths = {
+ wr::LayoutSideOffsets widths = {
aStrokeOptions.mLineWidth,
aStrokeOptions.mLineWidth,
aStrokeOptions.mLineWidth,
diff --git a/layout/svg/nsSVGOuterSVGFrame.cpp b/layout/svg/nsSVGOuterSVGFrame.cpp
index 03ce0650be98..7551f0556570 100644
--- a/layout/svg/nsSVGOuterSVGFrame.cpp
+++ b/layout/svg/nsSVGOuterSVGFrame.cpp
@@ -240,6 +240,9 @@ nsSVGOuterSVGFrame::GetIntrinsicRatio()
// We only have an intrinsic size/ratio if our width and height attributes
// are both specified and set to non-percentage values, or we have a viewBox
// rect: http://www.w3.org/TR/SVGMobile12/coords.html#IntrinsicSizing
+ // Unfortunately we have to return the ratio as two nscoords whereas what
+ // we have are two floats. Using app units allows for some floating point
+ // values to work but really small or large numbers will fail.
SVGSVGElement *content = static_cast(GetContent());
const nsSVGLength2& width =
@@ -248,8 +251,9 @@ nsSVGOuterSVGFrame::GetIntrinsicRatio()
content->mLengthAttributes[SVGSVGElement::ATTR_HEIGHT];
if (!width.IsPercentage() && !height.IsPercentage()) {
- nsSize ratio(NSToCoordRoundWithClamp(width.GetAnimValue(content)),
- NSToCoordRoundWithClamp(height.GetAnimValue(content)));
+ nsSize ratio(
+ nsPresContext::CSSPixelsToAppUnits(width.GetAnimValue(content)),
+ nsPresContext::CSSPixelsToAppUnits(height.GetAnimValue(content)));
if (ratio.width < 0) {
ratio.width = 0;
}
@@ -279,8 +283,8 @@ nsSVGOuterSVGFrame::GetIntrinsicRatio()
if (viewBoxHeight < 0.0f) {
viewBoxHeight = 0.0f;
}
- return nsSize(NSToCoordRoundWithClamp(viewBoxWidth),
- NSToCoordRoundWithClamp(viewBoxHeight));
+ return nsSize(nsPresContext::CSSPixelsToAppUnits(viewBoxWidth),
+ nsPresContext::CSSPixelsToAppUnits(viewBoxHeight));
}
return nsSVGDisplayContainerFrame::GetIntrinsicRatio();
diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp
index bc227ddc5605..f23adfcda4e5 100644
--- a/layout/tables/nsTableFrame.cpp
+++ b/layout/tables/nsTableFrame.cpp
@@ -7554,7 +7554,7 @@ BCBlockDirSeg::CreateWebRenderCommands(BCPaintBorderIterator& aIter,
// All border style is set to none except left side. So setting the widths of
// each side to width of rect is fine.
- wr::BorderWidths borderWidths = wr::ToBorderWidths(roundedRect.size.width,
+ wr::LayoutSideOffsets borderWidths = wr::ToBorderWidths(roundedRect.size.width,
roundedRect.size.width,
roundedRect.size.width,
roundedRect.size.width);
@@ -7841,7 +7841,7 @@ BCInlineDirSeg::CreateWebRenderCommands(BCPaintBorderIterator& aIter,
// All border style is set to none except top side. So setting the widths of
// each side to height of rect is fine.
- wr::BorderWidths borderWidths = wr::ToBorderWidths(roundedRect.size.height,
+ wr::LayoutSideOffsets borderWidths = wr::ToBorderWidths(roundedRect.size.height,
roundedRect.size.height,
roundedRect.size.height,
roundedRect.size.height);
@@ -8086,7 +8086,7 @@ nsTableFrame::CreateWebRenderCommandsForBCBorders(wr::DisplayListBuilder& aBuild
LayoutDeviceRect allBorderRect;
wr::BorderSide wrSide[4];
- wr::BorderWidths wrWidths;
+ wr::LayoutSideOffsets wrWidths;
wr::BorderRadius borderRadii = wr::EmptyBorderRadius();
bool backfaceIsVisible = false;
NS_FOR_CSS_SIDES(side) {
diff --git a/layout/xul/nsBox.cpp b/layout/xul/nsBox.cpp
index 589c1dcba2fb..15d1b07c4cf8 100644
--- a/layout/xul/nsBox.cpp
+++ b/layout/xul/nsBox.cpp
@@ -63,17 +63,15 @@ nsBox::EndXULLayout(nsBoxLayoutState& aState)
}
bool nsBox::gGotTheme = false;
-StaticRefPtr nsBox::gTheme;
+nsITheme* nsBox::gTheme = nullptr;
nsBox::nsBox(ClassID aID)
: nsIFrame(aID)
{
MOZ_COUNT_CTOR(nsBox);
if (!gGotTheme) {
- gTheme = NS_NewNativeTheme();
- if (gTheme) {
- gGotTheme = true;
- }
+ gGotTheme = true;
+ CallGetService("@mozilla.org/chrome/chrome-native-theme;1", &gTheme);
}
}
@@ -88,7 +86,7 @@ nsBox::~nsBox()
nsBox::Shutdown()
{
gGotTheme = false;
- gTheme = nullptr;
+ NS_IF_RELEASE(gTheme);
}
nsresult
diff --git a/layout/xul/nsBox.h b/layout/xul/nsBox.h
index 7bff1aaf7ed9..5c3a8e75a173 100644
--- a/layout/xul/nsBox.h
+++ b/layout/xul/nsBox.h
@@ -8,7 +8,6 @@
#define nsBox_h___
#include "mozilla/Attributes.h"
-#include "mozilla/StaticPtr.h"
#include "nsIFrame.h"
class nsITheme;
@@ -80,7 +79,7 @@ protected:
nsresult EndXULLayout(nsBoxLayoutState& aState);
static bool gGotTheme;
- static mozilla::StaticRefPtr gTheme;
+ static nsITheme* gTheme;
enum eMouseThrough {
unset,
diff --git a/media/mtransport/third_party/nICEr/src/net/transport_addr.c b/media/mtransport/third_party/nICEr/src/net/transport_addr.c
index fffb1f0d3782..6b3dfdc45d2b 100644
--- a/media/mtransport/third_party/nICEr/src/net/transport_addr.c
+++ b/media/mtransport/third_party/nICEr/src/net/transport_addr.c
@@ -99,12 +99,12 @@ int nr_transport_addr_fmt_ifname_addr_string(const nr_transport_addr *addr, char
switch(addr->ip_version){
case NR_IPV4:
if (!inet_ntop(AF_INET, &addr->u.addr4.sin_addr,buffer,sizeof(buffer))) {
- strncpy(buffer, "[error]", len);
+ strncpy(buffer, "[error]", sizeof(buffer));
}
break;
case NR_IPV6:
if (!inet_ntop(AF_INET6, &addr->u.addr6.sin6_addr,buffer,sizeof(buffer))) {
- strncpy(buffer, "[error]", len);
+ strncpy(buffer, "[error]", sizeof(buffer));
}
break;
default:
diff --git a/mobile/android/chrome/geckoview/GeckoViewContent.js b/mobile/android/chrome/geckoview/GeckoViewContent.js
index 5c4019a618a6..3cb00243c48e 100644
--- a/mobile/android/chrome/geckoview/GeckoViewContent.js
+++ b/mobile/android/chrome/geckoview/GeckoViewContent.js
@@ -49,6 +49,7 @@ class GeckoViewContent extends GeckoViewContentModule {
addEventListener("pageshow", this, options);
addEventListener("focusin", this, options);
addEventListener("focusout", this, options);
+ addEventListener("mozcaretstatechanged", this, options);
XPCOMUtils.defineLazyGetter(this, "_autoFill", () =>
new GeckoViewAutoFill(this.eventDispatcher));
@@ -236,6 +237,7 @@ class GeckoViewContent extends GeckoViewContentModule {
}
}
+ // eslint-disable-next-line complexity
handleEvent(aEvent) {
debug `handleEvent: ${aEvent.type}`;
@@ -336,6 +338,14 @@ class GeckoViewContent extends GeckoViewContentModule {
this._autoFill.scanDocument(aEvent.target);
}
break;
+ case "mozcaretstatechanged":
+ if (aEvent.reason === "presscaret" || aEvent.reason === "releasecaret") {
+ this.eventDispatcher.sendRequest({
+ type: "GeckoView:PinOnScreen",
+ pinned: aEvent.reason === "presscaret",
+ });
+ }
+ break;
}
}
diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt
index 622840ac3d3b..ec3046fda59c 100644
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt
@@ -8,6 +8,7 @@ import org.mozilla.geckoview.GeckoResponse
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoSession.SelectionActionDelegate.*
import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled
+import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.NullDelegate
import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.WithDevToolsAPI
import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.WithDisplay
import org.mozilla.geckoview.test.util.Callbacks
@@ -158,6 +159,31 @@ class SelectionActionDelegateTest : BaseSessionTest() {
hasSelectionAt(selectedContent.initialContent.length))
}
+ @Test fun pagehide() {
+ // Navigating to another page should hide selection action.
+ testThat(selectedContent, { mainSession.loadTestPath(HELLO_HTML_PATH) }, clearsSelection())
+ }
+
+ @Test fun deactivate() {
+ // Blurring the window should hide selection action.
+ testThat(selectedContent, { mainSession.setFocused(false) }, clearsSelection())
+ mainSession.setFocused(true)
+ }
+
+ @NullDelegate(GeckoSession.SelectionActionDelegate::class)
+ @Test fun clearDelegate() {
+ var counter = 0
+ mainSession.selectionActionDelegate = object : Callbacks.SelectionActionDelegate {
+ override fun onHideAction(session: GeckoSession, reason: Int) {
+ counter++
+ }
+ }
+
+ mainSession.selectionActionDelegate = null
+ assertThat("Hide action should be called when clearing delegate",
+ counter, equalTo(1))
+ }
+
/** Interface that defines behavior for a particular type of content */
private interface SelectedContent {
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerSession.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerSession.java
index 12237ec3269a..e2f1fea2a76d 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerSession.java
@@ -140,13 +140,6 @@ public class LayerSession {
private void updateOverscrollOffset(final float x, final float y) {
LayerSession.this.updateOverscrollOffset(x, y);
}
-
- @WrapForJNI(calledFrom = "ui")
- private void onSelectionCaretDrag(final boolean dragging) {
- // Active SelectionCaretDrag requires DynamicToolbarAnimator to be pinned to
- // avoid unwanted scroll interactions.
- LayerSession.this.onSelectionCaretDrag(dragging);
- }
}
protected final Compositor mCompositor = new Compositor();
@@ -482,13 +475,13 @@ public class LayerSession {
mOverscroll.setDistance(y, OverscrollEdgeEffect.AXIS_Y);
}
- /* package */ void onSelectionCaretDrag(final boolean dragging) {
+ protected void setShouldPinOnScreen(final boolean pinned) {
if (DEBUG) {
ThreadUtils.assertOnUiThread();
}
if (mToolbar != null) {
- mToolbar.setPinned(dragging, DynamicToolbarAnimator.PinReason.CARET_DRAG);
+ mToolbar.setPinned(pinned, DynamicToolbarAnimator.PinReason.CARET_DRAG);
}
}
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java
index 7c8c99598c9d..57c9b292e365 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java
@@ -59,4 +59,17 @@ public class GeckoDisplay {
session.onScreenOriginChanged(left, top);
}
}
+
+ /**
+ * Return whether the display should be pinned on the screen. When pinned, the display
+ * should not be moved on the screen due to animation, scrolling, etc. A common reason
+ * for the display being pinned is when the user is dragging a selection caret inside
+ * the display; normal user interaction would be disrupted in that case if the display
+ * was moved on screen.
+ *
+ * @return True if display should be pinned on the screen.
+ */
+ public boolean shouldPinOnScreen() {
+ return session.getDisplay() == this && session.shouldPinOnScreen();
+ }
}
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
index 7caaee200109..3439cf3e7164 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
@@ -101,6 +101,8 @@ public final class GeckoSession extends LayerSession
private String mId = UUID.randomUUID().toString().replace("-", "");
/* package */ String getId() { return mId; }
+ private boolean mShouldPinOnScreen;
+
/* package */ static abstract class CallbackResult extends GeckoResult
implements EventCallback {
@Override
@@ -813,6 +815,7 @@ public final class GeckoSession extends LayerSession
private class Listener implements BundleEventListener {
/* package */ void registerListeners() {
getEventDispatcher().registerUiThreadListener(this,
+ "GeckoView:PinOnScreen",
"GeckoView:Prompt",
null);
}
@@ -824,7 +827,9 @@ public final class GeckoSession extends LayerSession
Log.d(LOGTAG, "handleMessage: event = " + event);
}
- if ("GeckoView:Prompt".equals(event)) {
+ if ("GeckoView:PinOnScreen".equals(event)) {
+ GeckoSession.this.setShouldPinOnScreen(message.getBoolean("pinned"));
+ } else if ("GeckoView:Prompt".equals(event)) {
handlePromptEvent(GeckoSession.this, message, callback);
}
}
@@ -1992,6 +1997,17 @@ public final class GeckoSession extends LayerSession
}
}
+ @Override
+ protected void setShouldPinOnScreen(final boolean pinned) {
+ super.setShouldPinOnScreen(pinned);
+ mShouldPinOnScreen = pinned;
+ }
+
+ /* package */ boolean shouldPinOnScreen() {
+ ThreadUtils.assertOnUiThread();
+ return mShouldPinOnScreen;
+ }
+
public EventDispatcher getEventDispatcher() {
return mEventDispatcher;
}
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java
index 92231779b6eb..01a93bc3ca27 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java
@@ -159,6 +159,10 @@ public class GeckoView extends FrameLayout {
mDisplay.screenOriginChanged(mOrigin[0], mOrigin[1]);
}
}
+
+ public boolean shouldPinOnScreen() {
+ return mDisplay != null ? mDisplay.shouldPinOnScreen() : false;
+ }
}
public GeckoView(final Context context) {
@@ -212,6 +216,19 @@ public class GeckoView extends FrameLayout {
}
}
+ /**
+ * Return whether the view should be pinned on the screen. When pinned, the view
+ * should not be moved on the screen due to animation, scrolling, etc. A common reason
+ * for the view being pinned is when the user is dragging a selection caret inside
+ * the view; normal user interaction would be disrupted in that case if the view
+ * was moved on screen.
+ *
+ * @return True if view should be pinned on the screen.
+ */
+ public boolean shouldPinOnScreen() {
+ return mDisplay.shouldPinOnScreen();
+ }
+
/* package */ void setActive(final boolean active) {
if (mSession != null) {
mSession.setActive(active);
diff --git a/mobile/android/modules/ActionBarHandler.jsm b/mobile/android/modules/ActionBarHandler.jsm
index fd551a2babd7..f152d93ccb1f 100644
--- a/mobile/android/modules/ActionBarHandler.jsm
+++ b/mobile/android/modules/ActionBarHandler.jsm
@@ -52,6 +52,16 @@ var ActionBarHandler = {
handleEvent: function(e) {
e.stopImmediatePropagation();
+ if (e.reason === "presscaret" || e.reason === "releasecaret") {
+ const dispatcher = this._getDispatcher(Services.focus.focusedWindow);
+ if (dispatcher) {
+ dispatcher.sendRequest({
+ type: "GeckoView:PinOnScreen",
+ pinned: e.reason === "presscaret",
+ });
+ }
+ }
+
// Close an open ActionBar, if carets no longer logically visible.
if (this._selectionID && !e.caretVisible) {
this._uninit(false);
diff --git a/modules/pdfium/moz.build b/modules/pdfium/moz.build
index 48547e2f2ac7..9ede8dfbe8bc 100644
--- a/modules/pdfium/moz.build
+++ b/modules/pdfium/moz.build
@@ -562,4 +562,4 @@ AllowCompilerWarnings()
GeckoSharedLibrary('pdfium', linkage=None)
if CONFIG['OS_TARGET'] == 'WINNT':
- DEFFILE = SRCDIR + '/pdfium.def'
+ DEFFILE = 'pdfium.def'
diff --git a/mozglue/build/WindowsDllBlocklistDefs.h b/mozglue/build/WindowsDllBlocklistDefs.h
index f3639dc23c50..0c823b9edf39 100644
--- a/mozglue/build/WindowsDllBlocklistDefs.h
+++ b/mozglue/build/WindowsDllBlocklistDefs.h
@@ -197,6 +197,9 @@ DLL_BLOCKLIST_ENTRY("gdkbfltdll64.dll", MAKE_VERSION(1, 0, 14141, 240))
DLL_BLOCKLIST_ENTRY("dbroverlayiconnotbackuped.dll", MAKE_VERSION(1, 8, 0, 9))
DLL_BLOCKLIST_ENTRY("dbroverlayiconbackuped.dll", MAKE_VERSION(1, 8, 0, 9))
+// NVIDIA nView Desktop Management causes crashes, bug 1465787
+DLL_BLOCKLIST_ENTRY("nviewh64.dll", MAKE_VERSION(6, 14, 10, 14847))
+
#ifdef ENABLE_TESTS
// DLLs used by TestDllBlocklist* gTests
diff --git a/mozglue/build/moz.build b/mozglue/build/moz.build
index 4945d1663f5c..dacfa1a2e226 100644
--- a/mozglue/build/moz.build
+++ b/mozglue/build/moz.build
@@ -30,7 +30,7 @@ if CONFIG['MOZ_UBSAN']:
]
if CONFIG['OS_TARGET'] == 'WINNT':
- DEFFILE = 'mozglue.def'
+ DEFFILE = '!mozglue.def'
# We'll break the DLL blocklist if we immediately load user32.dll
DELAYLOAD_DLLS += [
'user32.dll',
diff --git a/mozglue/misc/TimeStamp_windows.cpp b/mozglue/misc/TimeStamp_windows.cpp
index 95af0e7fb46b..5a994124794b 100644
--- a/mozglue/misc/TimeStamp_windows.cpp
+++ b/mozglue/misc/TimeStamp_windows.cpp
@@ -168,7 +168,9 @@ PerformanceCounter()
LARGE_INTEGER pc;
::QueryPerformanceCounter(&pc);
- if (!sHasStableTSC) {
+ // As an experiment, we want to have a monotonicity sentinel
+ // even if the TSC is reported as stable.
+ if (true || !sHasStableTSC) {
// This is a simple go-backward protection for faulty hardware
AutoCriticalSection lock(&sTimeStampLock);
diff --git a/other-licenses/7zstub/README.mozilla b/other-licenses/7zstub/README.mozilla
index 526b14609a72..854aece1dac2 100644
--- a/other-licenses/7zstub/README.mozilla
+++ b/other-licenses/7zstub/README.mozilla
@@ -19,7 +19,9 @@ versions which are no longer supported by the build system used for the main
application; that means we can show an error message specifically informing
users that their OS is too old, instead of the generic "not a valid Win32
application" error that Windows would generate if we used the newer toolchain
-and that isn't very helpful to most users.
+and that isn't very helpful to most users. Using a precompiled binary also
+allows the installer build procedure to work without a compiler toolchain
+being configured (e.g., for artifact builds).
The firefox/ directory also contains an icon and a manifest which were edited
into 7zSD.sfx's resources after build time. The icon had to be added this way
@@ -28,3 +30,33 @@ compiler included with VC6 does not support the 128x128 PNG image included in
our icon file. Similarly, the manifest had to be edited in because the older
resource compiler does not support manifests (and the 7-zip build files do not
try to use any).
+
+The version info in the compiled binary was also edited after build time. There
+isn't a technical reason why the version info changes couldn't be included at
+build time, but since the goal is just to avoid confusing users about the origin
+of the Firefox installer, not to appear to be making the claim that we wrote the
+LZMA SDK, a more targeted change is appropriate.
+
+Step-by-step instructions for generating 7zSD.sfx:
+1) Install Microsoft Visual C++ 6 Professional or Enterprise edition (the
+ Standard edition does not include the optimizing compiler, so it should
+ not be used). You'll likely want a virtual machine running Windows XP,
+ because running VC6 under more modern Windows versions is tricky.
+2) Install an appropriate Windows SDK version. The Windows XP Service Pack 2 SDK
+ is known to work well, but that particular version appears to only be
+ available from archive.org:
+https://web.archive.org/web/20080209175723/http://www.microsoft.com:80/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
+3) Run the tool included with the SDK that configures Visual C++ to use it.
+4) If using a fresh copy of the LZMA SDK sources, apply the patch in
+ mozilla_customizations.diff. The copy in the Firefox source tree already
+ has these changes applied.
+5) Open the workspace file at src\CPP\7zip\Bundles\SFXSetup\SFXSetup.dsw and
+ build it using the "SFXSetup - Win32 ReleaseD" configuration. The output
+ executable should be at the path ReleaseD\7zSD.sfx relative to SFXSetup.dsw.
+6) Use Resource Hacker (available from http://angusj.com/resourcehacker/) to
+ replace the existing icon on 7zSD.sfx and to add the manifest as a new
+ resource. Also edit the version info resource to replace CompanyName and
+ LegalCopyright with "Mozilla" (or appropriate vendor name) and
+ FileDescription and ProductName with "Firefox" (or appropriate product name).
+ Be sure to recompile the resources using the green "play" button in the
+ toolbar (or by pressing F5) before saving the file.
diff --git a/other-licenses/7zstub/firefox/7zSD.sfx b/other-licenses/7zstub/firefox/7zSD.sfx
index 22c06905b615..9cb1d5645fda 100644
Binary files a/other-licenses/7zstub/firefox/7zSD.sfx and b/other-licenses/7zstub/firefox/7zSD.sfx differ
diff --git a/python/mozbuild/mozbuild/backend/base.py b/python/mozbuild/mozbuild/backend/base.py
index 4dfa57bc191f..14023e45cb5a 100644
--- a/python/mozbuild/mozbuild/backend/base.py
+++ b/python/mozbuild/mozbuild/backend/base.py
@@ -317,6 +317,7 @@ class BuildBackend(LoggingMixin):
top_srcdir=obj.topsrcdir,
topobjdir=obj.topobjdir,
srcdir=srcdir,
+ srcdir_rel=mozpath.relpath(srcdir, mozpath.dirname(obj.output_path)),
relativesrcdir=mozpath.relpath(srcdir, obj.topsrcdir) or '.',
DEPTH=mozpath.relpath(obj.topobjdir, mozpath.dirname(obj.output_path)) or '.',
)
diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py
index fe4b251338df..b046def182f2 100644
--- a/python/mozbuild/mozbuild/backend/recursivemake.py
+++ b/python/mozbuild/mozbuild/backend/recursivemake.py
@@ -1677,6 +1677,7 @@ class RecursiveMakeBackend(CommonBackend):
pp.handleLine(b'topobjdir := @topobjdir@\n')
pp.handleLine(b'topsrcdir := @top_srcdir@\n')
pp.handleLine(b'srcdir := @srcdir@\n')
+ pp.handleLine(b'srcdir_rel := @srcdir_rel@\n')
pp.handleLine(b'VPATH := @srcdir@\n')
pp.handleLine(b'relativesrcdir := @relativesrcdir@\n')
pp.handleLine(b'include $(DEPTH)/config/@autoconfmk@\n')
diff --git a/python/mozbuild/mozbuild/frontend/context.py b/python/mozbuild/mozbuild/frontend/context.py
index b72094eac1e6..76109447c89a 100644
--- a/python/mozbuild/mozbuild/frontend/context.py
+++ b/python/mozbuild/mozbuild/frontend/context.py
@@ -1614,7 +1614,7 @@ VARIABLES = {
This variable can only be used on Windows.
"""),
- 'DEFFILE': (unicode, unicode,
+ 'DEFFILE': (Path, unicode,
"""The program .def (module definition) file.
This variable can only be used on Windows.
diff --git a/python/mozbuild/mozbuild/frontend/emitter.py b/python/mozbuild/mozbuild/frontend/emitter.py
index ab22d59dd732..6d4211520537 100644
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -1036,7 +1036,6 @@ class TreeMetadataEmitter(LoggingMixin):
'RCFILE',
'RESFILE',
'RCINCLUDE',
- 'DEFFILE',
'WIN32_EXE_LDFLAGS',
'USE_EXTENSION_MANIFEST',
'NO_JS_MANIFEST',
@@ -1067,13 +1066,28 @@ class TreeMetadataEmitter(LoggingMixin):
if 'LDFLAGS' in context and context['LDFLAGS']:
computed_link_flags.resolve_flags('MOZBUILD', context['LDFLAGS'])
- deffile = context['DEFFILE']
- if deffile and context.config.substs.get('OS_ARCH') == 'WINNT':
+ deffile = context.get('DEFFILE')
+ if deffile and context.config.substs.get('OS_TARGET') == 'WINNT':
+ if isinstance(deffile, SourcePath):
+ if not os.path.exists(deffile.full_path):
+ raise SandboxValidationError(
+ 'Path specified in DEFFILE does not exist: %s '
+ '(resolved to %s)' % (deffile,
+ deffile.full_path), context)
+ path = mozpath.relpath(deffile.full_path, context.objdir)
+ else:
+ path = deffile.target_basename
+
+ # We don't have any better way to indicate that the def file
+ # is a dependency to whatever we're building beyond stuffing
+ # it into EXTRA_DEPS.
+ passthru.variables['EXTRA_DEPS'] = [path]
+
if context.config.substs.get('GNU_CC'):
- computed_link_flags.resolve_flags('DEFFILE', [deffile])
+ computed_link_flags.resolve_flags('DEFFILE', [path])
else:
computed_link_flags.resolve_flags('DEFFILE',
- ['-DEF:' + deffile])
+ ['-DEF:' + path])
dist_install = context['DIST_INSTALL']
if dist_install is True:
diff --git a/python/mozbuild/mozbuild/test/backend/data/variable_passthru/baz.def b/python/mozbuild/mozbuild/test/backend/data/variable_passthru/baz.def
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
index 33b794953652..348849fb687b 100644
--- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
@@ -225,6 +225,7 @@ class TestRecursiveMakeBackend(BackendTester):
'topobjdir := %s' % env.topobjdir,
'topsrcdir := %s' % env.topsrcdir,
'srcdir := %s' % env.topsrcdir,
+ 'srcdir_rel := %s' % mozpath.relpath(env.topsrcdir, env.topobjdir),
'VPATH := %s' % env.topsrcdir,
'relativesrcdir := .',
'include $(DEPTH)/config/autoconf.mk',
@@ -242,7 +243,7 @@ class TestRecursiveMakeBackend(BackendTester):
self.assertTrue(os.path.exists(p))
lines = [l.strip() for l in open(p, 'rt').readlines()]
- self.assertEqual(len(lines), 10)
+ self.assertEqual(len(lines), 11)
self.assertTrue(lines[0].startswith('# THIS FILE WAS AUTOMATICALLY'))
@@ -325,8 +326,10 @@ class TestRecursiveMakeBackend(BackendTester):
'RCINCLUDE': [
'RCINCLUDE := bar.rc',
],
- 'DEFFILE': [
- 'DEFFILE := baz.def',
+ 'EXTRA_DEPS': [
+ 'EXTRA_DEPS += %s' % mozpath.join(mozpath.relpath(env.topsrcdir,
+ env.topobjdir),
+ 'baz.def'),
],
'WIN32_EXE_LDFLAGS': [
'WIN32_EXE_LDFLAGS += -subsystem:console',
diff --git a/python/mozbuild/mozbuild/test/frontend/data/variable-passthru/baz.def b/python/mozbuild/mozbuild/test/frontend/data/variable-passthru/baz.def
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/python/mozbuild/mozbuild/test/frontend/test_emitter.py b/python/mozbuild/mozbuild/test/frontend/test_emitter.py
index 784464ea0321..d4c7ee84e4ab 100644
--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py
+++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py
@@ -190,7 +190,9 @@ class TestEmitterBasic(unittest.TestCase):
'RCFILE': 'foo.rc',
'RESFILE': 'bar.res',
'RCINCLUDE': 'bar.rc',
- 'DEFFILE': 'baz.def',
+ 'EXTRA_DEPS': [mozpath.join(mozpath.relpath(reader.config.topsrcdir,
+ reader.config.topobjdir),
+ 'baz.def')],
'WIN32_EXE_LDFLAGS': ['-subsystem:console'],
}
diff --git a/testing/geckodriver/src/prefs.rs b/testing/geckodriver/src/prefs.rs
index bb765f94a515..9f058e653cef 100644
--- a/testing/geckodriver/src/prefs.rs
+++ b/testing/geckodriver/src/prefs.rs
@@ -62,7 +62,6 @@ lazy_static! {
("browser.uitour.enabled", Pref::new(false)),
// Do not warn on quitting Firefox
- // TODO: Remove once minimum supported Firefox release is 61.
("browser.warnOnQuit", Pref::new(false)),
// Do not show datareporting policy notifications which can
diff --git a/testing/marionette/client/marionette_driver/geckoinstance.py b/testing/marionette/client/marionette_driver/geckoinstance.py
index 09e6febb2043..5b885188cacf 100644
--- a/testing/marionette/client/marionette_driver/geckoinstance.py
+++ b/testing/marionette/client/marionette_driver/geckoinstance.py
@@ -569,6 +569,9 @@ class DesktopInstance(GeckoInstance):
# tests that don't expect it to be there.
"browser.urlbar.userMadeSearchSuggestionsChoice": True,
+ # Don't warn when exiting the browser
+ "browser.warnOnQuit": False,
+
# Disable first-run welcome page
"startup.homepage_welcome_url": "about:blank",
"startup.homepage_welcome_url.additional": "",
diff --git a/testing/mozbase/mozprofile/mozprofile/profile.py b/testing/mozbase/mozprofile/mozprofile/profile.py
index 81dfc091a913..e79ae0d6b52b 100644
--- a/testing/mozbase/mozprofile/mozprofile/profile.py
+++ b/testing/mozbase/mozprofile/mozprofile/profile.py
@@ -427,61 +427,22 @@ class Profile(BaseProfile):
class FirefoxProfile(Profile):
"""Specialized Profile subclass for Firefox"""
-
- preferences = { # Don't automatically update the application
- 'app.update.disabledForTesting': True,
- 'security.turn_off_all_security_so_that_viruses_can_take_over_this_computer': True,
- # Don't restore the last open set of tabs if the browser has crashed
- 'browser.sessionstore.resume_from_crash': False,
- # Don't check for the default web browser during startup
- 'browser.shell.checkDefaultBrowser': False,
- # Don't warn on exit when multiple tabs are open
- 'browser.tabs.warnOnClose': False,
- # Don't warn when exiting the browser
- 'browser.warnOnQuit': False,
- # Don't send Firefox health reports to the production server
- 'datareporting.healthreport.documentServerURI': 'http://%(server)s/healthreport/',
- # Skip data reporting policy notifications
- 'datareporting.policy.dataSubmissionPolicyBypassNotification': True,
- # Only install add-ons from the profile and the application scope
- # Also ensure that those are not getting disabled.
- # see: https://developer.mozilla.org/en/Installing_extensions
- 'extensions.enabledScopes': 5,
- 'extensions.autoDisableScopes': 10,
- # Don't send the list of installed addons to AMO
- 'extensions.getAddons.cache.enabled': False,
- # Don't install distribution add-ons from the app folder
- 'extensions.installDistroAddons': False,
- # Don't automatically update add-ons
- 'extensions.update.enabled': False,
- # Don't open a dialog to show available add-on updates
- 'extensions.update.notifyUser': False,
- # Enable test mode to run multiple tests in parallel
- 'focusmanager.testmode': True,
- # Enable test mode to not raise an OS level dialog for location sharing
- 'geo.provider.testing': True,
- # Suppress delay for main action in popup notifications
- 'security.notification_enable_delay': 0,
- # Suppress automatic safe mode after crashes
- 'toolkit.startup.max_resumed_crashes': -1,
- # Don't send Telemetry reports to the production server. This is
- # needed as Telemetry sends pings also if FHR upload is enabled.
- 'toolkit.telemetry.server': 'http://%(server)s/telemetry-dummy/',
- }
+ preferences = {}
class ThunderbirdProfile(Profile):
"""Specialized Profile subclass for Thunderbird"""
- preferences = {'extensions.update.enabled': False,
- 'extensions.update.notifyUser': False,
- 'browser.shell.checkDefaultBrowser': False,
- 'browser.tabs.warnOnClose': False,
- 'browser.warnOnQuit': False,
- 'browser.sessionstore.resume_from_crash': False,
- # prevents the 'new e-mail address' wizard on new profile
- 'mail.provider.enabled': False,
- }
+ preferences = {
+ 'extensions.update.enabled': False,
+ 'extensions.update.notifyUser': False,
+ 'browser.shell.checkDefaultBrowser': False,
+ 'browser.tabs.warnOnClose': False,
+ 'browser.warnOnQuit': False,
+ 'browser.sessionstore.resume_from_crash': False,
+ # prevents the 'new e-mail address' wizard on new profile
+ 'mail.provider.enabled': False,
+ }
class ChromeProfile(BaseProfile):
diff --git a/testing/mozbase/mozprofile/tests/test_profile_view.py b/testing/mozbase/mozprofile/tests/test_profile_view.py
index 1bc27a94df20..bf97ea520061 100644
--- a/testing/mozbase/mozprofile/tests/test_profile_view.py
+++ b/testing/mozbase/mozprofile/tests/test_profile_view.py
@@ -17,14 +17,8 @@ here = os.path.dirname(os.path.abspath(__file__))
def test_profileprint(tmpdir):
- """
- test the summary function
- """
-
- keys = set(['Files', 'Path', 'user.js'])
- ff_prefs = mozprofile.FirefoxProfile.preferences # shorthand
- pref_string = '\n'.join(['%s: %s' % (key, ff_prefs[key])
- for key in sorted(ff_prefs.keys())])
+ """Test the summary function."""
+ keys = set(['Files', 'Path'])
tmpdir = tmpdir.strpath
profile = mozprofile.FirefoxProfile(tmpdir)
@@ -33,7 +27,6 @@ def test_profileprint(tmpdir):
assert parts['Path'] == tmpdir
assert set(parts.keys()) == keys
- assert pref_string == parts['user.js'].strip()
def test_str_cast():
diff --git a/testing/profiles/moz.build b/testing/profiles/moz.build
index fa2627b8fd81..24e8228dd5b3 100644
--- a/testing/profiles/moz.build
+++ b/testing/profiles/moz.build
@@ -8,8 +8,10 @@ profile_files = [
'common/*',
'perf/*',
'profiles.json',
+ 'profileserver/*',
'reftest/*',
'unittest/*',
+ 'web-platform/*'
]
TEST_HARNESS_FILES.reftest.profile_data += profile_files
diff --git a/testing/profiles/profiles.json b/testing/profiles/profiles.json
index f461c256204a..3cf26dde8b72 100644
--- a/testing/profiles/profiles.json
+++ b/testing/profiles/profiles.json
@@ -1,9 +1,9 @@
{
"mochitest": ["common", "unittest"],
- "profileserver": ["common", "unittest"],
+ "profileserver": ["common", "unittest", "profileserver"],
"raptor": ["common", "perf", "raptor"],
"reftest": ["common", "reftest"],
"talos": ["common", "perf"],
"valgrind": ["common", "unittest"],
- "web-platform-tests": ["common", "unittest"]
+ "web-platform-tests": ["common", "unittest", "web-platform"]
}
diff --git a/testing/profiles/profileserver/extensions/README.txt b/testing/profiles/profileserver/extensions/README.txt
new file mode 100644
index 000000000000..9ec618a6aa0f
--- /dev/null
+++ b/testing/profiles/profileserver/extensions/README.txt
@@ -0,0 +1,2 @@
+Dropping extensions here will get them installed in all test harnesses
+that make use of this profile.
diff --git a/build/pgo/prefs_override.js b/testing/profiles/profileserver/user.js
similarity index 65%
rename from build/pgo/prefs_override.js
rename to testing/profiles/profileserver/user.js
index 9c10afa6811e..0870016d2302 100644
--- a/build/pgo/prefs_override.js
+++ b/testing/profiles/profileserver/user.js
@@ -1,2 +1,4 @@
+// Preferences file for profileserver.
+/* globals user_pref */
// Turn off budget throttling for the profile server
user_pref("dom.timeout.enable_budget_timer_throttling", false);
diff --git a/testing/profiles/web-platform/extensions/README.txt b/testing/profiles/web-platform/extensions/README.txt
new file mode 100644
index 000000000000..9ec618a6aa0f
--- /dev/null
+++ b/testing/profiles/web-platform/extensions/README.txt
@@ -0,0 +1,2 @@
+Dropping extensions here will get them installed in all test harnesses
+that make use of this profile.
diff --git a/testing/profiles/web-platform/user.js b/testing/profiles/web-platform/user.js
new file mode 100644
index 000000000000..6f074ce7f1d0
--- /dev/null
+++ b/testing/profiles/web-platform/user.js
@@ -0,0 +1,22 @@
+// Base preferences file for web-platform-tests.
+/* globals user_pref */
+// Don't restore the last open set of tabs if the browser has crashed
+user_pref("browser.sessionstore.resume_from_crash", false);
+// Only install add-ons from the profile and the application scope
+// Also ensure that those are not getting disabled.
+// see: https://developer.mozilla.org/en/Installing_extensions
+user_pref("extensions.autoDisableScopes", 10);
+// Don't open a dialog to show available add-on updates
+user_pref("extensions.update.notifyUser", false);
+// Enable test mode to run multiple tests in parallel
+user_pref("focusmanager.testmode", true);
+// Enable pre-fetching of resources
+user_pref("network.preload", true);
+// Enable direct connection
+user_pref("network.proxy.type", 0);
+// Web-platform-tests load a lot of URLs very quickly. This puts avoidable and
+// unnecessary I/O pressure on the Places DB (measured to be in the
+// gigabytes).
+user_pref("places.history.enabled", false);
+// Suppress automatic safe mode after crashes
+user_pref("toolkit.startup.max_resumed_crashes", -1);
diff --git a/testing/web-platform/meta/MANIFEST.json b/testing/web-platform/meta/MANIFEST.json
index 5ecfcdf1cebf..4b4aed703504 100644
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -13585,6 +13585,12 @@
{}
]
],
+ "pointerevents/extension/pointerevent_pointerrawmove_in_pointerlock-manual.html": [
+ [
+ "/pointerevents/extension/pointerevent_pointerrawmove_in_pointerlock-manual.html",
+ {}
+ ]
+ ],
"pointerevents/extension/pointerevent_touch-action-pan-down-css_touch-manual.html": [
[
"/pointerevents/extension/pointerevent_touch-action-pan-down-css_touch-manual.html",
@@ -14131,12 +14137,30 @@
{}
]
],
+ "presentation-api/controlling-ua/reconnectToMultiplePresentations_success-manual.https.html": [
+ [
+ "/presentation-api/controlling-ua/reconnectToMultiplePresentations_success-manual.https.html",
+ {}
+ ]
+ ],
+ "presentation-api/controlling-ua/reconnectToPresentation_notfound_error-manual.https.html": [
+ [
+ "/presentation-api/controlling-ua/reconnectToPresentation_notfound_error-manual.https.html",
+ {}
+ ]
+ ],
"presentation-api/controlling-ua/reconnectToPresentation_success-manual.https.html": [
[
"/presentation-api/controlling-ua/reconnectToPresentation_success-manual.https.html",
{}
]
],
+ "presentation-api/controlling-ua/startMultiplePresentations_success-manual.https.html": [
+ [
+ "/presentation-api/controlling-ua/startMultiplePresentations_success-manual.https.html",
+ {}
+ ]
+ ],
"presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.https.html": [
[
"/presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.https.html",
@@ -109525,18 +109549,6 @@
{}
]
],
- "css/css-contain/contain-layout-008.html": [
- [
- "/css/css-contain/contain-layout-008.html",
- [
- [
- "/css/css-contain/reference/contain-paint-013-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"css/css-contain/contain-layout-009.html": [
[
"/css/css-contain/contain-layout-009.html",
@@ -109717,6 +109729,42 @@
{}
]
],
+ "css/css-contain/contain-layout-independent-formatting-context-001.html": [
+ [
+ "/css/css-contain/contain-layout-independent-formatting-context-001.html",
+ [
+ [
+ "/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-contain/contain-layout-independent-formatting-context-002.html": [
+ [
+ "/css/css-contain/contain-layout-independent-formatting-context-002.html",
+ [
+ [
+ "/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-contain/contain-layout-independent-formatting-context-003.html": [
+ [
+ "/css/css-contain/contain-layout-independent-formatting-context-003.html",
+ [
+ [
+ "/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-contain/contain-layout-ink-overflow-013.html": [
[
"/css/css-contain/contain-layout-ink-overflow-013.html",
@@ -109957,18 +110005,6 @@
{}
]
],
- "css/css-contain/contain-paint-013.html": [
- [
- "/css/css-contain/contain-paint-013.html",
- [
- [
- "/css/css-contain/reference/contain-paint-013-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"css/css-contain/contain-paint-014.html": [
[
"/css/css-contain/contain-paint-014.html",
@@ -110281,6 +110317,42 @@
{}
]
],
+ "css/css-contain/contain-paint-independent-formatting-context-001.html": [
+ [
+ "/css/css-contain/contain-paint-independent-formatting-context-001.html",
+ [
+ [
+ "/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-contain/contain-paint-independent-formatting-context-002.html": [
+ [
+ "/css/css-contain/contain-paint-independent-formatting-context-002.html",
+ [
+ [
+ "/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-contain/contain-paint-independent-formatting-context-003.html": [
+ [
+ "/css/css-contain/contain-paint-independent-formatting-context-003.html",
+ [
+ [
+ "/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-contain/contain-paint-size-001.html": [
[
"/css/css-contain/contain-paint-size-001.html",
@@ -133969,6 +134041,30 @@
{}
]
],
+ "css/css-tables/percentages-grandchildren-quirks-mode-001.html": [
+ [
+ "/css/css-tables/percentages-grandchildren-quirks-mode-001.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-tables/percentages-grandchildren-quirks-mode-002.html": [
+ [
+ "/css/css-tables/percentages-grandchildren-quirks-mode-002.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-tables/table-has-box-sizing-border-box-001.html": [
[
"/css/css-tables/table-has-box-sizing-border-box-001.html",
@@ -185617,12 +185713,24 @@
{}
]
],
- "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap.html": [
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-negative-margin.html": [
[
- "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap.html",
+ "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-negative-margin.html",
[
[
- "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-ref.html",
+ "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/no-red-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-position-relative.html": [
+ [
+ "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-position-relative.html",
+ [
+ [
+ "/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-position-relative-ref.html",
"=="
]
],
@@ -221465,6 +221573,16 @@
{}
]
],
+ "cookie-store/resources/helper_iframe.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "cookie-store/resources/helpers.js": [
+ [
+ {}
+ ]
+ ],
"cookie-store/resources/http_cookie_and_set_cookie_headers.js": [
[
{}
@@ -247645,11 +247763,6 @@
{}
]
],
- "css/css-contain/reference/contain-paint-013-ref.html": [
- [
- {}
- ]
- ],
"css/css-contain/reference/contain-paint-022-ref.html": [
[
{}
@@ -247670,6 +247783,16 @@
{}
]
],
+ "css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-contain/reference/contain-paint-size-001-ref.html": [
[
{}
@@ -271385,6 +271508,11 @@
{}
]
],
+ "css/cssom/support/getComputedStyle-insets.js": [
+ [
+ {}
+ ]
+ ],
"css/cssom/support/import-charset.css": [
[
{}
@@ -279665,6 +279793,16 @@
{}
]
],
+ "feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
"feature-policy/experimental-features/resources/async-script.js": [
[
{}
@@ -279705,6 +279843,11 @@
{}
]
],
+ "feature-policy/experimental-features/resources/lazyload-contents.html": [
+ [
+ {}
+ ]
+ ],
"feature-policy/experimental-features/resources/parser-blocking-script.js": [
[
{}
@@ -288320,7 +288463,7 @@
{}
]
],
- "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-ref.html": [
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-position-relative-ref.html": [
[
{}
]
@@ -288405,6 +288548,11 @@
{}
]
],
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/no-red-ref.html": [
+ [
+ {}
+ ]
+ ],
"html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/resources/fieldset-vertical.css": [
[
{}
@@ -295510,6 +295658,11 @@
{}
]
],
+ "pointerevents/resources/pointerevent_pointerrawmove_in_pointerlock-iframe.html": [
+ [
+ {}
+ ]
+ ],
"pointerlock/META.yml": [
[
{}
@@ -331088,6 +331241,18 @@
{}
]
],
+ "cookie-store/cookieStore_get_set_across_frames.tentative.https.html": [
+ [
+ "/cookie-store/cookieStore_get_set_across_frames.tentative.https.html",
+ {}
+ ]
+ ],
+ "cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html": [
+ [
+ "/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html",
+ {}
+ ]
+ ],
"cookie-store/cookieStore_get_set_basic.tentative.https.window.js": [
[
"/cookie-store/cookieStore_get_set_basic.tentative.https.window.html",
@@ -338638,6 +338803,12 @@
{}
]
],
+ "css/css-transitions/historical.html": [
+ [
+ "/css/css-transitions/historical.html",
+ {}
+ ]
+ ],
"css/css-transitions/idlharness.html": [
[
"/css/css-transitions/idlharness.html",
@@ -342396,6 +342567,42 @@
{}
]
],
+ "css/cssom/getComputedStyle-insets-absolute.html": [
+ [
+ "/css/cssom/getComputedStyle-insets-absolute.html",
+ {}
+ ]
+ ],
+ "css/cssom/getComputedStyle-insets-fixed.html": [
+ [
+ "/css/cssom/getComputedStyle-insets-fixed.html",
+ {}
+ ]
+ ],
+ "css/cssom/getComputedStyle-insets-nobox.html": [
+ [
+ "/css/cssom/getComputedStyle-insets-nobox.html",
+ {}
+ ]
+ ],
+ "css/cssom/getComputedStyle-insets-relative.html": [
+ [
+ "/css/cssom/getComputedStyle-insets-relative.html",
+ {}
+ ]
+ ],
+ "css/cssom/getComputedStyle-insets-static.html": [
+ [
+ "/css/cssom/getComputedStyle-insets-static.html",
+ {}
+ ]
+ ],
+ "css/cssom/getComputedStyle-insets-sticky.html": [
+ [
+ "/css/cssom/getComputedStyle-insets-sticky.html",
+ {}
+ ]
+ ],
"css/cssom/getComputedStyle-pseudo.html": [
[
"/css/cssom/getComputedStyle-pseudo.html",
@@ -343466,6 +343673,12 @@
{}
]
],
+ "custom-elements/parser/parser-custom-element-in-foreign-content.html": [
+ [
+ "/custom-elements/parser/parser-custom-element-in-foreign-content.html",
+ {}
+ ]
+ ],
"custom-elements/parser/parser-fallsback-to-unknown-element.html": [
[
"/custom-elements/parser/parser-fallsback-to-unknown-element.html",
@@ -355314,6 +355527,18 @@
{}
]
],
+ "feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html": [
+ [
+ "/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html",
+ {}
+ ]
+ ],
+ "feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html": [
+ [
+ "/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html",
+ {}
+ ]
+ ],
"feature-policy/experimental-features/sync-script.tentative.https.sub.html": [
[
"/feature-policy/experimental-features/sync-script.tentative.https.sub.html",
@@ -385898,12 +386123,6 @@
{}
]
],
- "presentation-api/controlling-ua/reconnectToPresentation_notfound_error.https.html": [
- [
- "/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.https.html",
- {}
- ]
- ],
"presentation-api/controlling-ua/reconnectToPresentation_sandboxing_success.https.html": [
[
"/presentation-api/controlling-ua/reconnectToPresentation_sandboxing_success.https.html",
@@ -397676,6 +397895,22 @@
{}
]
],
+ "speech-api/SpeechSynthesis-pause-resume.tentative.html": [
+ [
+ "/speech-api/SpeechSynthesis-pause-resume.tentative.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "speech-api/SpeechSynthesis-speak-events.html": [
+ [
+ "/speech-api/SpeechSynthesis-speak-events.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"speech-api/SpeechSynthesis-speak-ownership.html": [
[
"/speech-api/SpeechSynthesis-speak-ownership.html",
@@ -397692,14 +397927,6 @@
}
]
],
- "speech-api/SpeechSynthesis-speak-with-activation-succeeds.html": [
- [
- "/speech-api/SpeechSynthesis-speak-with-activation-succeeds.html",
- {
- "testdriver": true
- }
- ]
- ],
"speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html": [
[
"/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html",
@@ -399744,6 +399971,12 @@
{}
]
],
+ "trusted-types/Element-setAttributeNS.tentative.html": [
+ [
+ "/trusted-types/Element-setAttributeNS.tentative.html",
+ {}
+ ]
+ ],
"trusted-types/HTMLElement-generic.tentative.html": [
[
"/trusted-types/HTMLElement-generic.tentative.html",
@@ -399846,6 +400079,12 @@
{}
]
],
+ "trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html": [
+ [
+ "/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html",
+ {}
+ ]
+ ],
"trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [
[
"/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html",
@@ -402728,12 +402967,6 @@
{}
]
],
- "webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [
- [
- "/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html",
- {}
- ]
- ],
"webaudio/the-audio-api/the-iirfilternode-interface/ctor-iirfilter.html": [
[
"/webaudio/the-audio-api/the-iirfilternode-interface/ctor-iirfilter.html",
@@ -438898,15 +439131,15 @@
"manual"
],
"accname/name_test_case_661-manual.html": [
- "e1f25ba7c66276f0c61c8006767f4afc29fc7583",
+ "2bb16f9ffc02ffda2dcc830fe6c8fbd41361cea8",
"manual"
],
"accname/name_test_case_662-manual.html": [
- "4d69b0f1b57dc65f750dbb2423bdaf2eb76e5b4c",
+ "5587569438147f0c0997079bcf8f0b8bde177ef4",
"manual"
],
"accname/name_test_case_663a-manual.html": [
- "95ec2f857b7e33aafebb658b35911d908c0912da",
+ "3fc3d17ccdf207677f6c1c32bca4e438f796cf0c",
"manual"
],
"accname/name_test_case_721-manual.html": [
@@ -463045,6 +463278,14 @@
"fc9645d3e2e98063da8cf03ef50823af363c6b9c",
"testharness"
],
+ "cookie-store/cookieStore_get_set_across_frames.tentative.https.html": [
+ "fe5c1f14605815d9914a7a968b91d77d54b604ca",
+ "testharness"
+ ],
+ "cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html": [
+ "5cbe542e32b37b45857e1cecb0c5ddb045bd9f5c",
+ "testharness"
+ ],
"cookie-store/cookieStore_get_set_basic.tentative.https.window.js": [
"2a082de9d30927ec5ee152acdd76cde04ed730d5",
"testharness"
@@ -463117,6 +463358,14 @@
"980347f1d185649ad4366f4d86fb03c030baa03f",
"support"
],
+ "cookie-store/resources/helper_iframe.sub.html": [
+ "8e91cb7bed48c44a7b5e0cbe98bd3c198b372269",
+ "support"
+ ],
+ "cookie-store/resources/helpers.js": [
+ "98f9ff6cb09808fcfe4db095994e5040ea24ba1c",
+ "support"
+ ],
"cookie-store/resources/http_cookie_and_set_cookie_headers.js": [
"0fcf6b604290ddbdb165502e9fc514e20990b47b",
"support"
@@ -530469,10 +530718,6 @@
"39be5fe7fd06edc63704ee2e10c20dee14d01738",
"reftest"
],
- "css/css-contain/contain-layout-008.html": [
- "d442bebb065db400b3de429f1b2418f6f7b2423c",
- "reftest"
- ],
"css/css-contain/contain-layout-009.html": [
"fc57bbd18204ff20190301025727edfd136dab41",
"reftest"
@@ -530533,6 +530778,18 @@
"3e4f3dafbf213c18a09cfd2a7512dd485c13f839",
"reftest"
],
+ "css/css-contain/contain-layout-independent-formatting-context-001.html": [
+ "94c88bc49cb123e98b114136b7836cd6f24c9574",
+ "reftest"
+ ],
+ "css/css-contain/contain-layout-independent-formatting-context-002.html": [
+ "a7e8baed56db08e70c1c536cacd971d3885002b0",
+ "reftest"
+ ],
+ "css/css-contain/contain-layout-independent-formatting-context-003.html": [
+ "a10afd3cdee90b988e0c3d25b533d3c1b4e8bb06",
+ "reftest"
+ ],
"css/css-contain/contain-layout-ink-overflow-013.html": [
"d1431737352ef766f333e160888334b9efa0f66b",
"reftest"
@@ -530613,10 +530870,6 @@
"471726a99c659ab0d6a7870ee2519994051b425f",
"reftest"
],
- "css/css-contain/contain-paint-013.html": [
- "3b6b3a76dc63028e1ae22b81c4ba06112c5aceb7",
- "reftest"
- ],
"css/css-contain/contain-paint-014.html": [
"ee6bc7876f6f0a1f3653c62819fd16553b1610b7",
"reftest"
@@ -530721,6 +530974,18 @@
"b8a03936cbcc3ddcc88dc1237fab0af56f4bd72b",
"reftest"
],
+ "css/css-contain/contain-paint-independent-formatting-context-001.html": [
+ "e4c06a992b351974d5506070db3dd8dadd53173e",
+ "reftest"
+ ],
+ "css/css-contain/contain-paint-independent-formatting-context-002.html": [
+ "353196970c99e9b5ed556b850d4eda034d16df77",
+ "reftest"
+ ],
+ "css/css-contain/contain-paint-independent-formatting-context-003.html": [
+ "fe1f7f2775db9cd82292c181560c2f9997de197d",
+ "reftest"
+ ],
"css/css-contain/contain-paint-size-001.html": [
"930429b7ecc5af860fa6782cff30a8803393d3cd",
"reftest"
@@ -531001,10 +531266,6 @@
"b94055eb1b7830696b36be17f7bde1474ea605c4",
"support"
],
- "css/css-contain/reference/contain-paint-013-ref.html": [
- "af758703a3b75b45223491a4fe97eb1da20d5320",
- "support"
- ],
"css/css-contain/reference/contain-paint-022-ref.html": [
"b3bb7576f2944f6ef51c16024767b93e8f30c329",
"support"
@@ -531021,6 +531282,14 @@
"229c8c2d74ba3f2b5cede6824091575835807092",
"support"
],
+ "css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html": [
+ "08900b201b12099e3b0c00f1e21b4b7890d2bcb9",
+ "support"
+ ],
+ "css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html": [
+ "0cef592ba5cc6cc56a0fc3a7439cec330d1856b0",
+ "support"
+ ],
"css/css-contain/reference/contain-paint-size-001-ref.html": [
"9aad8a490b4b740991c968a17f1c74571e758d36",
"support"
@@ -555357,6 +555626,14 @@
"a8745487b6702b8b8e8ac85bd843014dc296b717",
"reftest"
],
+ "css/css-tables/percentages-grandchildren-quirks-mode-001.html": [
+ "b6b6d245ab2f2c56ae5ac51c96a771e5acd5f084",
+ "reftest"
+ ],
+ "css/css-tables/percentages-grandchildren-quirks-mode-002.html": [
+ "a24556aa0dedfab35ff7792f03b804f44c0f4160",
+ "reftest"
+ ],
"css/css-tables/support/base.css": [
"52be1bb4e52e5705319ebf5525f6d89839356d65",
"support"
@@ -565573,6 +565850,10 @@
"4d17d4ad41e73c4c5e7830d10973384614353ce5",
"testharness"
],
+ "css/css-transitions/historical.html": [
+ "8d0360a8ecf7a37b81acb10917b63abc7c9543cc",
+ "testharness"
+ ],
"css/css-transitions/idlharness.html": [
"4cc7ee50eb4915fcf95843f7eeee266abfa7b81a",
"testharness"
@@ -577961,6 +578242,30 @@
"aa49dc33ef79a6f8d6e7e1051d963708e05e7622",
"testharness"
],
+ "css/cssom/getComputedStyle-insets-absolute.html": [
+ "196f5f26f31f71253aa33b581f7a64ce3604e8da",
+ "testharness"
+ ],
+ "css/cssom/getComputedStyle-insets-fixed.html": [
+ "e57e774fe6eb27be91fa95d920096ba107512b1b",
+ "testharness"
+ ],
+ "css/cssom/getComputedStyle-insets-nobox.html": [
+ "ca55ace7f4ed42ae25dab7968b347f83a998b958",
+ "testharness"
+ ],
+ "css/cssom/getComputedStyle-insets-relative.html": [
+ "c48f2eb555ee51c464753d980deeac514c84fd29",
+ "testharness"
+ ],
+ "css/cssom/getComputedStyle-insets-static.html": [
+ "854a8e3dba4085ab1fa8fe3c48fde4ef2c27bca6",
+ "testharness"
+ ],
+ "css/cssom/getComputedStyle-insets-sticky.html": [
+ "10520232d738a6547ee430797c74763649e06224",
+ "testharness"
+ ],
"css/cssom/getComputedStyle-pseudo.html": [
"340f9eed9b955467eb39c957222328baf2c41d4a",
"testharness"
@@ -578070,7 +578375,7 @@
"testharness"
],
"css/cssom/shorthand-serialization.html": [
- "44af6737e3ef3b3c71ccd259b1d75104c4a92061",
+ "97e11da8b8a266c7efa3826272e3fdb7ce55ed86",
"testharness"
],
"css/cssom/shorthand-values.html": [
@@ -578165,6 +578470,10 @@
"85dd7324815b8f8ef1a1d0496224c1a0661db9d8",
"support"
],
+ "css/cssom/support/getComputedStyle-insets.js": [
+ "7bd34fe87a2806d3cc79625001c694159743f862",
+ "support"
+ ],
"css/cssom/support/import-charset.css": [
"9f44090c94a7945c3adbf850da3290c85a60a0ab",
"support"
@@ -590589,6 +590898,10 @@
"3f13c50a0e1b10e7c914038c785b60b92abff4a9",
"testharness"
],
+ "custom-elements/parser/parser-custom-element-in-foreign-content.html": [
+ "2ae0f1309c62b42ba8253e40fb045f3ba7748897",
+ "testharness"
+ ],
"custom-elements/parser/parser-fallsback-to-unknown-element.html": [
"82e970f1ae810f54a3d37c5c5b142143422bda11",
"testharness"
@@ -590910,7 +591223,7 @@
"support"
],
"docs/_writing-tests/lint-tool.md": [
- "d818f4b0b38190e2527f74c4bb590c5781f9488b",
+ "498df7f293d893043c1efc221c444d48b5092e30",
"support"
],
"docs/_writing-tests/manual.md": [
@@ -595689,12 +596002,28 @@
"db2dcbc1929b9e1264855e9b80f77dfbda5d4f38",
"support"
],
+ "feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html": [
+ "5b9034b63841209bd64c5115e91dc2a69a81d90d",
+ "testharness"
+ ],
+ "feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html.headers": [
+ "d0bac47e01a7e903d78ffab7b73838f0852852d6",
+ "support"
+ ],
+ "feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html": [
+ "2e0a791f374cecac3eb02c1292ab599535b20d1d",
+ "testharness"
+ ],
+ "feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html.headers": [
+ "83b744e2bc4e09b771c7997fc044802f77f65407",
+ "support"
+ ],
"feature-policy/experimental-features/resources/async-script.js": [
"3c0ee6d02343891b0234f31c0fb229929ae1b24b",
"support"
],
"feature-policy/experimental-features/resources/common.js": [
- "08d3aef9874894f03941a0dc74dd4061ebe021d3",
+ "10c28be7741b718794f264c0b720304b8c5b7cb7",
"support"
],
"feature-policy/experimental-features/resources/defer-script.js": [
@@ -595721,6 +596050,10 @@
"73ca820915bbdccdf4fd2d3960c795f1cea8e181",
"support"
],
+ "feature-policy/experimental-features/resources/lazyload-contents.html": [
+ "a6e98c24e6add4976571141ad2409e1cce96d173",
+ "support"
+ ],
"feature-policy/experimental-features/resources/parser-blocking-script.js": [
"c61efee8a0a15801d474fd8b384de01e565e37ce",
"support"
@@ -607361,12 +607694,16 @@
"c38944ae795807628ce1c5cd114e5832263b2ff2",
"testharness"
],
- "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-ref.html": [
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-negative-margin.html": [
+ "563a2aa68d833175767c2fe6507e460c25378d8e",
+ "reftest"
+ ],
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-position-relative-ref.html": [
"95e2347121e26ec7cc7d080caf9db6ff253231c6",
"support"
],
- "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap.html": [
- "4d2269632c0eeeaf057b2008351ae98d4ddbdbca",
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-gap-position-relative.html": [
+ "1dbef479a9fd41933ad204f1540e6c45675a54b7",
"reftest"
],
"html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-border-radius-hittest.html": [
@@ -607557,6 +607894,10 @@
"92c33029701b41678f4f514d28c6260338bd8e77",
"testharness"
],
+ "html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/no-red-ref.html": [
+ "32b7d46d6ffe54d92c9a1e2197df57583c68df83",
+ "support"
+ ],
"html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/resources/fieldset-vertical.css": [
"b358d925a76fb571eda42292e2abbf7c1c75062f",
"support"
@@ -617782,7 +618123,7 @@
"support"
],
"interfaces/background-fetch.idl": [
- "130d5d825a5bef49fd651c0cb326b9b40a7fa2c7",
+ "0dbe3fbad3cf343c36977380653c73144c6659d8",
"support"
],
"interfaces/battery-status.idl": [
@@ -617806,7 +618147,7 @@
"support"
],
"interfaces/cookie-store.idl": [
- "d872b7aadb25b4720e78d98f3bf04c0c15151084",
+ "f5c44b60bd05dac2d54f6c36438aa0dd4a7d4471",
"support"
],
"interfaces/cors-rfc1918.idl": [
@@ -617910,7 +618251,7 @@
"support"
],
"interfaces/feature-policy.idl": [
- "de2f0464683394194f347c7155c38ad48bfc190c",
+ "c09cc33ce14daefd44db0a84c1a9b39264e856a1",
"support"
],
"interfaces/fetch.idl": [
@@ -618062,7 +618403,7 @@
"support"
],
"interfaces/payment-request.idl": [
- "05790c7d76d6e5f36b47fbf23615822b4a68c18a",
+ "e3afbd47db3b4d2c85a1e53599862b2cb273f828",
"support"
],
"interfaces/performance-timeline.idl": [
@@ -618146,7 +618487,7 @@
"support"
],
"interfaces/service-workers.idl": [
- "2c9cbf6955e7f267a098b7b2562aeebf8378ad7d",
+ "ed02af117172c654ec41b45281803e3c4d5441f4",
"support"
],
"interfaces/shape-detection-api.idl": [
@@ -618242,11 +618583,11 @@
"support"
],
"interfaces/webrtc-stats.idl": [
- "ee5cce403f8d325b73661f45b65bd09f5faae861",
+ "4df720a0fc183389be33d4c3fa7089e70e9e1543",
"support"
],
"interfaces/webrtc.idl": [
- "c06e91e6de7b1f44e5f92e2c8eb1d0fabb792b7d",
+ "c4ca910d6d18bf8c8d817c76deacb03a74cef59e",
"support"
],
"interfaces/webusb.idl": [
@@ -620066,7 +620407,7 @@
"support"
],
"mimesniff/mime-types/resources/mime-types.json": [
- "1d0b1528892b66d944724c26f0bac5ace9ed4364",
+ "8918b355bf5a4f287904834a14378be94eb26dca",
"support"
],
"mixed-content/META.yml": [
@@ -630010,7 +630351,7 @@
"testharness"
],
"payment-request/MerchantValidationEvent/constructor.https.html": [
- "952c0f734a30f170964053bb00e55225d57cce0b",
+ "ec8a4ff1ed0925a354f2631d8459337e47ab079d",
"testharness"
],
"payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html": [
@@ -630473,6 +630814,10 @@
"0c4ccf9ad48d49c62b3d138845dfa3ac631a8e4e",
"manual"
],
+ "pointerevents/extension/pointerevent_pointerrawmove_in_pointerlock-manual.html": [
+ "30fff15bd92f536de826b7ef98419b6a30284d41",
+ "manual"
+ ],
"pointerevents/extension/pointerevent_touch-action-pan-down-css_touch-manual.html": [
"592139f9f41abb2a3fe6bf1b99af87d1c5e651f3",
"manual"
@@ -630518,11 +630863,11 @@
"manual"
],
"pointerevents/pointerevent_capture_mouse-manual.html": [
- "c4c7bc8c7c435c81780be86a21e1653835e2e79c",
+ "ee31e225722a2c9af1bfffef3b6746e12510cd2c",
"manual"
],
"pointerevents/pointerevent_capture_suppressing_mouse-manual.html": [
- "763e17916e9fd2d7f200679658cf65120f1d72c9",
+ "127b07a9ee0c36004e2a5c1113b01c18633672d4",
"manual"
],
"pointerevents/pointerevent_change-touch-action-onpointerdown_touch-manual.html": [
@@ -630554,11 +630899,11 @@
"manual"
],
"pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html": [
- "ca305f74f78114b4fbecfe70b0c8c76979f8cf0e",
+ "f4fe2b424e6e837a1e0e1ea625ede17619e797b4",
"manual"
],
"pointerevents/pointerevent_lostpointercapture_is_first-manual.html": [
- "e446d1844295684df3bbea03e82c02aef12c4957",
+ "9e460b872e22474f7aa897b9295299d405c2931f",
"manual"
],
"pointerevents/pointerevent_multiple_primary_pointers_boundary_events-manual.html": [
@@ -630634,11 +630979,11 @@
"manual"
],
"pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-manual.html": [
- "105e3b5a9740ef38fe2c9b77704694db3894a4f4",
+ "497840041f6b6f67326bede1fbfef442f403f7b7",
"manual"
],
"pointerevents/pointerevent_releasepointercapture_onpointerup_mouse-manual.html": [
- "df515436c057d81b221f0f7c08b195f432fd75a0",
+ "24fe40d5834b71247d19ce9aa0d35ceb74ca52fa",
"manual"
],
"pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html": [
@@ -630670,7 +631015,7 @@
"manual"
],
"pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html": [
- "bc3195127279fca7685c1702664bffc73b54d99d",
+ "bc1bb93c7168764dd8d1ae7ea96fdc1cf3c0add7",
"manual"
],
"pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html": [
@@ -630682,7 +631027,7 @@
"support"
],
"pointerevents/pointerevent_support.js": [
- "bf68f85fe08cba9043ce8d201392417087e9b905",
+ "5c35e016a0ed51353868e0307af0896c62db64de",
"support"
],
"pointerevents/pointerevent_suppress_compat_events_on_click-manual.html": [
@@ -630809,6 +631154,10 @@
"ab33560b35216ea0976d1c037650122d9336ae39",
"support"
],
+ "pointerevents/resources/pointerevent_pointerrawmove_in_pointerlock-iframe.html": [
+ "505fc2cae40b80612fdd67ba98918aafad2f1b0a",
+ "support"
+ ],
"pointerlock/META.yml": [
"bb639b4417ef4975e0f5a1649d010f6a7565e87c",
"support"
@@ -631149,9 +631498,13 @@
"52aa8c55328c7b9226581779793955b62b4d5126",
"testharness"
],
- "presentation-api/controlling-ua/reconnectToPresentation_notfound_error.https.html": [
- "390e42eae771f50f6f2a82bd87169ad31b162420",
- "testharness"
+ "presentation-api/controlling-ua/reconnectToMultiplePresentations_success-manual.https.html": [
+ "211e8a01058cdc4c1e4756edcd21cb6369875f25",
+ "manual"
+ ],
+ "presentation-api/controlling-ua/reconnectToPresentation_notfound_error-manual.https.html": [
+ "41cb360bb1d330181652e9a38eeb2b21cc5ad634",
+ "manual"
],
"presentation-api/controlling-ua/reconnectToPresentation_sandboxing_success.https.html": [
"96505aca05be3902255830080264ebda90b442da",
@@ -631161,6 +631514,10 @@
"7521b4fd23c8e3362d4e576b0f1b4253f6c2a4fc",
"manual"
],
+ "presentation-api/controlling-ua/startMultiplePresentations_success-manual.https.html": [
+ "0268bd87e8fd41a32f20abf096855ca42bc595aa",
+ "manual"
+ ],
"presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.https.html": [
"73570d50f03fe091a437b02f4345a80e0e0c1265",
"manual"
@@ -645801,6 +646158,14 @@
"e4741b7fc6f450a5038f99c1b3de15ae4f5b0db0",
"manual"
],
+ "speech-api/SpeechSynthesis-pause-resume.tentative.html": [
+ "a7aa2bbf6fa25fec45845b1b08801148649fc4a2",
+ "testharness"
+ ],
+ "speech-api/SpeechSynthesis-speak-events.html": [
+ "babfe3c388e92aee8c4e6ea62cd3c038eb5bcb2d",
+ "testharness"
+ ],
"speech-api/SpeechSynthesis-speak-ownership.html": [
"f2121fc561de1f25a4de27372ca42a2b1e97a10a",
"testharness"
@@ -645809,10 +646174,6 @@
"3e0388b9cf37cae2075380faf48414a48b4092e9",
"testharness"
],
- "speech-api/SpeechSynthesis-speak-with-activation-succeeds.html": [
- "55dec5c123ff6384e6a30694c6a9fb6b27bc5b51",
- "testharness"
- ],
"speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html": [
"acf0d7d575b5dc7f9b348d82b056aa90089b6639",
"testharness"
@@ -650510,7 +650871,7 @@
"support"
],
"tools/ci/jobs.py": [
- "6f3f64560167fa5ff4f8242082e62ec7bfb62608",
+ "97504dc8d9c517358eee833eb27988b611ace87b",
"support"
],
"tools/ci/lib.sh": [
@@ -650538,7 +650899,7 @@
"support"
],
"tools/ci/tests/test_jobs.py": [
- "e94f4b6830555e70fa1f86db42927cbce207de17",
+ "e888ad884a18f257008fe860f31f7892b3bd39a3",
"support"
],
"tools/conftest.py": [
@@ -651690,7 +652051,7 @@
"support"
],
"tools/serve/serve.py": [
- "e81ca26a7dad91dc2d65781dd55300b864050c7c",
+ "f9dde38bd567ca88e4908475d3796a8815dc6b0f",
"support"
],
"tools/serve/test_functional.py": [
@@ -656665,6 +657026,10 @@
"a284b2f83550b1b0e4cf7c79e7a200791ae8c70a",
"testharness"
],
+ "trusted-types/Element-setAttributeNS.tentative.html": [
+ "80128cfbf0ebce7d878dd349fc8838b2a6469a16",
+ "testharness"
+ ],
"trusted-types/HTMLElement-generic.tentative.html": [
"2d38104511879943a4d538c9dc5b0031d7596b23",
"testharness"
@@ -656737,6 +657102,10 @@
"52e317083316435ec4b1dcc7331f1216c2a32d9a",
"testharness"
],
+ "trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html": [
+ "5a72992100ced1ae73766f147e29fa0afa6c8334",
+ "testharness"
+ ],
"trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [
"f31fce629bccd342ff5e8dfacd43e13faac6fced",
"testharness"
@@ -656766,7 +657135,7 @@
"testharness"
],
"trusted-types/support/helper.sub.js": [
- "1ad5b4ef0c68a1ffde111db62c5e2aa4957732b6",
+ "75874e5b3c2ed90f0ebfbfca2da701d027d2d832",
"support"
],
"uievents/META.yml": [
@@ -660385,10 +660754,6 @@
"6326d00dfb78efefd8a179e87dc53b531584895d",
"testharness"
],
- "webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [
- "f0c8e42044b6aa4c6ed32b6c65d73550c91abf73",
- "testharness"
- ],
"webaudio/the-audio-api/the-iirfilternode-interface/ctor-iirfilter.html": [
"e884d487af8fc89b6b162177c7402eac692c02e3",
"testharness"
diff --git a/testing/web-platform/meta/cookie-store/cookieStore_get_set_across_frames.tentative.https.html.ini b/testing/web-platform/meta/cookie-store/cookieStore_get_set_across_frames.tentative.https.html.ini
new file mode 100644
index 000000000000..15514ee27552
--- /dev/null
+++ b/testing/web-platform/meta/cookie-store/cookieStore_get_set_across_frames.tentative.https.html.ini
@@ -0,0 +1,10 @@
+[cookieStore_get_set_across_frames.tentative.https.html]
+ [Async Cookies: cookieStore basic API across frames]
+ expected: FAIL
+
+ [cookieStore.get() sees cookieStore.set() in frame]
+ expected: FAIL
+
+ [cookieStore.get() in frame sees cookieStore.set()]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html.ini b/testing/web-platform/meta/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html.ini
new file mode 100644
index 000000000000..efd1b5440caa
--- /dev/null
+++ b/testing/web-platform/meta/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html.ini
@@ -0,0 +1,14 @@
+[cookieStore_get_set_across_origins.tentative.sub.https.html]
+ expected: TIMEOUT
+ [cookieStore.set in cross-origin iframe]
+ expected: TIMEOUT
+
+ [cookieStore.set in main window]
+ expected: NOTRUN
+
+ [cookieStore.get() in cross-origin frame sees cookieStore.set()]
+ expected: NOTRUN
+
+ [cookieStore.get() sees cookieStore.set() in cross-origin frame]
+ expected: TIMEOUT
+
diff --git a/testing/web-platform/meta/cookie-store/idlharness_serviceworker.tentative.https.html.ini b/testing/web-platform/meta/cookie-store/idlharness_serviceworker.tentative.https.html.ini
index 03014b2462bb..0c4500ccb9e9 100644
--- a/testing/web-platform/meta/cookie-store/idlharness_serviceworker.tentative.https.html.ini
+++ b/testing/web-platform/meta/cookie-store/idlharness_serviceworker.tentative.https.html.ini
@@ -308,9 +308,6 @@
[CookieChangeEvent interface: existence and properties of interface prototype object]
expected: FAIL
- [CookieChangeEvent interface: existence and properties of interface object]
- expected: FAIL
-
[CookieChangeEvent interface: attribute deleted]
expected: FAIL
diff --git a/testing/web-platform/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini b/testing/web-platform/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini
new file mode 100644
index 000000000000..cf18d139fbb4
--- /dev/null
+++ b/testing/web-platform/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini
@@ -0,0 +1,3 @@
+[vh_not_refreshing_on_chrome.html]
+ expected:
+ if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
diff --git a/testing/web-platform/meta/css/cssom/getComputedStyle-insets-absolute.html.ini b/testing/web-platform/meta/css/cssom/getComputedStyle-insets-absolute.html.ini
new file mode 100644
index 000000000000..3670532658f0
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom/getComputedStyle-insets-absolute.html.ini
@@ -0,0 +1,217 @@
+[getComputedStyle-insets-absolute.html]
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/css/cssom/getComputedStyle-insets-fixed.html.ini b/testing/web-platform/meta/css/cssom/getComputedStyle-insets-fixed.html.ini
new file mode 100644
index 000000000000..829a2583f927
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom/getComputedStyle-insets-fixed.html.ini
@@ -0,0 +1,217 @@
+[getComputedStyle-insets-fixed.html]
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html.ini b/testing/web-platform/meta/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html.ini
new file mode 100644
index 000000000000..43247c181fda
--- /dev/null
+++ b/testing/web-platform/meta/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html.ini
@@ -0,0 +1,12 @@
+[lazyload-disabled-tentative.sub.html]
+ [Sanity-check: Contents do not load immediately (no eager-loading) when the lazyload attribute is 'on' and frame is in viewport.]
+ expected: FAIL
+
+ [When 'lazyload' feature is disabled, a frame cannot avoid lazyloading by setting 'lazyload' attribute to 'off']
+ expected:
+ if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
+ if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
+ if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
+ if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
+ if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
+
diff --git a/testing/web-platform/meta/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html.ini b/testing/web-platform/meta/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html.ini
new file mode 100644
index 000000000000..fb4898af29f8
--- /dev/null
+++ b/testing/web-platform/meta/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html.ini
@@ -0,0 +1,4 @@
+[lazyload-enabled-tentative.sub.html]
+ [Sanity-check: Contents do not load immediately (no eager-loading) when the lazyload attribute is 'on' and frame is in viewport.]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html.ini b/testing/web-platform/meta/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html.ini
deleted file mode 100644
index dc74f79f0961..000000000000
--- a/testing/web-platform/meta/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[window-name-after-cross-origin-sub-frame-navigation.sub.html]
- expected:
- if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
- [Test that the window name is correct]
- expected:
- if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): NOTRUN
-
diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-fetch-error.sub.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-fetch-error.sub.html.ini
index f359ff31deee..6193009d92b7 100644
--- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-fetch-error.sub.html.ini
+++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-fetch-error.sub.html.ini
@@ -1,8 +1,3 @@
[dynamic-imports-fetch-error.sub.html]
- expected: ERROR
[import(): error cases occuring during fetching]
expected: FAIL
-
- [import() must reject when there is a wrong MIME type]
- expected: FAIL
-
diff --git a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-script-error.html.ini b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-script-error.html.ini
index 299b4adaadfa..583778f32a41 100644
--- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-script-error.html.ini
+++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-script-error.html.ini
@@ -1,8 +1,3 @@
[dynamic-imports-script-error.html]
- expected: ERROR
[import(): error cases caused by the imported module script]
expected: FAIL
-
- [import() must reject when there is a parse error]
- expected: FAIL
-
diff --git a/testing/web-platform/meta/mimesniff/mime-types/charset-parameter.window.js.ini b/testing/web-platform/meta/mimesniff/mime-types/charset-parameter.window.js.ini
index d5065b8758be..f9c02581b40f 100644
--- a/testing/web-platform/meta/mimesniff/mime-types/charset-parameter.window.js.ini
+++ b/testing/web-platform/meta/mimesniff/mime-types/charset-parameter.window.js.ini
@@ -20,3 +20,6 @@
[text/html;charset= ";charset=GBK]
expected: FAIL
+ [text/html;charset="";charset=GBK]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/mozilla-sync b/testing/web-platform/meta/mozilla-sync
index 7911ce96e7f0..da819d02c353 100644
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,2 +1,2 @@
-local: 7b73d44e05e6e1af97216ff07d243db56599adb0
-upstream: 9a16eee96e7fb06c7ca05899436e35c957e676d8
+local: 833ee67b39e7d2105b2c8317fd1b7f548d25a64c
+upstream: 5051858e95936197d354cc18ea88365cb9d3e690
diff --git a/testing/web-platform/meta/navigation-timing/nav2_test_document_open.html.ini b/testing/web-platform/meta/navigation-timing/nav2_test_document_open.html.ini
new file mode 100644
index 000000000000..4943759bbd29
--- /dev/null
+++ b/testing/web-platform/meta/navigation-timing/nav2_test_document_open.html.ini
@@ -0,0 +1,5 @@
+[nav2_test_document_open.html]
+ [Navigation Timing 2 WPT]
+ expected:
+ if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+
diff --git a/testing/web-platform/meta/payment-request/MerchantValidationEvent/constructor.https.html.ini b/testing/web-platform/meta/payment-request/MerchantValidationEvent/constructor.https.html.ini
index 57facfc29f65..5f0f8e64694a 100644
--- a/testing/web-platform/meta/payment-request/MerchantValidationEvent/constructor.https.html.ini
+++ b/testing/web-platform/meta/payment-request/MerchantValidationEvent/constructor.https.html.ini
@@ -20,3 +20,15 @@
[Must throw TypeError if initialized with an invalid URL.]
expected: FAIL
+ [When no methodName is passed, methodName attribute defaults to the empty string]
+ expected: FAIL
+
+ [MerchantValidationEvent can be constructed with valid PMIs]
+ expected: FAIL
+
+ [MerchantValidationEvent can't be constructed with invalid PMIs]
+ expected: FAIL
+
+ [Must have a methodName IDL attribute, which is initialized with to the methodName dictionary value.]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/payment-request/idlharness.https.window.js.ini b/testing/web-platform/meta/payment-request/idlharness.https.window.js.ini
index e596fd45e069..a0cafd190b24 100644
--- a/testing/web-platform/meta/payment-request/idlharness.https.window.js.ini
+++ b/testing/web-platform/meta/payment-request/idlharness.https.window.js.ini
@@ -317,3 +317,9 @@
[PaymentRequest interface: paymentRequest must inherit property "onmerchantvalidation" with the proper type]
expected: FAIL
+ [MerchantValidationEvent interface: attribute methodName]
+ expected: FAIL
+
+ [MerchantValidationEvent interface: new MerchantValidationEvent("merchantvalidation") must inherit property "methodName" with the proper type]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/payment-request/interfaces.https.html.ini b/testing/web-platform/meta/payment-request/interfaces.https.html.ini
index fe4c28efe6a5..189f3621e09f 100644
--- a/testing/web-platform/meta/payment-request/interfaces.https.html.ini
+++ b/testing/web-platform/meta/payment-request/interfaces.https.html.ini
@@ -408,3 +408,6 @@
[PaymentRequest interface: attribute onmerchantvalidation]
expected: FAIL
+ [MerchantValidationEvent interface: attribute methodName]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.https.html.ini b/testing/web-platform/meta/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.https.html.ini
deleted file mode 100644
index 9f447182c054..000000000000
--- a/testing/web-platform/meta/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.https.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[reconnectToPresentation_notfound_error.https.html]
- [Calling "reconnect" with an unknown presentation ID fails with a NotFoundError exception]
- expected: FAIL
-
diff --git a/testing/web-platform/meta/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html.ini b/testing/web-platform/meta/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html.ini
deleted file mode 100644
index e236bdd19279..000000000000
--- a/testing/web-platform/meta/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[update.https.html]
- [Update a registration on ServiceWorkerGlobalScope]
- expected:
- if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
-
diff --git a/testing/web-platform/meta/speech-api/SpeechSynthesis-pause-resume.tentative.html.ini b/testing/web-platform/meta/speech-api/SpeechSynthesis-pause-resume.tentative.html.ini
new file mode 100644
index 000000000000..a4bf55f7fe5f
--- /dev/null
+++ b/testing/web-platform/meta/speech-api/SpeechSynthesis-pause-resume.tentative.html.ini
@@ -0,0 +1,2 @@
+[SpeechSynthesis-pause-resume.tentative.html]
+ disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1491069
diff --git a/testing/web-platform/meta/subresource-integrity/idlharness.window.js.ini b/testing/web-platform/meta/subresource-integrity/idlharness.window.js.ini
deleted file mode 100644
index ffcb26af6f89..000000000000
--- a/testing/web-platform/meta/subresource-integrity/idlharness.window.js.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[idlharness.window.html]
- [webappsec-subresource-integrity interfaces]
- expected: FAIL
-
diff --git a/testing/web-platform/meta/trusted-types/Element-setAttributeNS.tentative.html.ini b/testing/web-platform/meta/trusted-types/Element-setAttributeNS.tentative.html.ini
new file mode 100644
index 000000000000..2edda061a920
--- /dev/null
+++ b/testing/web-platform/meta/trusted-types/Element-setAttributeNS.tentative.html.ini
@@ -0,0 +1,13 @@
+[Element-setAttributeNS.tentative.html]
+ [Element.setAttributeNS assigned via policy (successful URL transformation)]
+ expected: FAIL
+
+ [Element.setAttributeNS assigned via policy (successful ScriptURL transformation)]
+ expected: FAIL
+
+ [Element.setAttributeNS assigned via policy (successful HTML transformation)]
+ expected: FAIL
+
+ [Element.setAttributeNS assigned via policy (successful Script transformation)]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html.ini b/testing/web-platform/meta/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html.ini
new file mode 100644
index 000000000000..8a4b13a66175
--- /dev/null
+++ b/testing/web-platform/meta/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html.ini
@@ -0,0 +1,19 @@
+[block-string-assignment-to-Element-setAttributeNS.tentative.html]
+ [Element.setAttributeNS assigned via policy (successful URL transformation)]
+ expected: FAIL
+
+ [`Element.setAttributeNS = string` throws]
+ expected: FAIL
+
+ [Element.setAttributeNS assigned via policy (successful HTML transformation)]
+ expected: FAIL
+
+ [Element.setAttributeNS assigned via policy (successful ScriptURL transformation)]
+ expected: FAIL
+
+ [`Element.setAttributeNS = null` throws]
+ expected: FAIL
+
+ [Element.setAttributeNS assigned via policy (successful Script transformation)]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini b/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini
index 5f94510016c9..2baea2f9c3b5 100644
--- a/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini
+++ b/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini
@@ -599,3 +599,9 @@
[RTCErrorEvent interface: existence and properties of interface prototype object]
expected: FAIL
+ [RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "address" with the proper type]
+ expected: FAIL
+
+ [RTCIceCandidate interface: attribute address]
+ expected: FAIL
+
diff --git a/testing/web-platform/meta/x-frame-options/deny.sub.html.ini b/testing/web-platform/meta/x-frame-options/deny.sub.html.ini
deleted file mode 100644
index 435ecf4f7132..000000000000
--- a/testing/web-platform/meta/x-frame-options/deny.sub.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[deny.sub.html]
- [`XFO: DENY` blocks same-origin framing.]
- expected: FAIL
-
- [`XFO: DENY` blocks cross-origin framing.]
- expected: FAIL
-
diff --git a/testing/web-platform/meta/x-frame-options/multiple.sub.html.ini b/testing/web-platform/meta/x-frame-options/multiple.sub.html.ini
deleted file mode 100644
index b9d23432df90..000000000000
--- a/testing/web-platform/meta/x-frame-options/multiple.sub.html.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[multiple.sub.html]
- [`XFO: SAMEORIGIN; XFO: DENY` blocks same-origin framing.]
- expected: FAIL
-
- [`XFO: DENY; XFO: SAMEORIGIN` blocks same-origin framing.]
- expected: FAIL
-
- [`XFO: INVALID; XFO: SAMEORIGIN` blocks same-origin framing.]
- expected: FAIL
-
- [`XFO: SAMEORIGIN; XFO: INVALID` blocks same-origin framing.]
- expected: FAIL
-
- [`XFO: SAMEORIGIN; XFO: SAMEORIGIN` blocks cross-origin framing.]
- expected: FAIL
-
diff --git a/testing/web-platform/meta/x-frame-options/sameorigin.sub.html.ini b/testing/web-platform/meta/x-frame-options/sameorigin.sub.html.ini
deleted file mode 100644
index 1238f00dbf53..000000000000
--- a/testing/web-platform/meta/x-frame-options/sameorigin.sub.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[sameorigin.sub.html]
- [`XFO: SAMEORIGIN` blocks cross-origin framing.]
- expected: FAIL
-
diff --git a/testing/web-platform/meta/xhr/overridemimetype-blob.html.ini b/testing/web-platform/meta/xhr/overridemimetype-blob.html.ini
new file mode 100644
index 000000000000..bf14e97cbcf1
--- /dev/null
+++ b/testing/web-platform/meta/xhr/overridemimetype-blob.html.ini
@@ -0,0 +1,4 @@
+[overridemimetype-blob.html]
+ [32) MIME types need to be parsed and serialized: text/html;charset="";charset=GBK]
+ expected: FAIL
+
diff --git a/testing/web-platform/tests/accname/name_test_case_661-manual.html b/testing/web-platform/tests/accname/name_test_case_661-manual.html
index e1f25ba7c662..2bb16f9ffc02 100644
--- a/testing/web-platform/tests/accname/name_test_case_661-manual.html
+++ b/testing/web-platform/tests/accname/name_test_case_661-manual.html
@@ -21,7 +21,7 @@
"property",
"name",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"AXAPI" : [
@@ -29,7 +29,7 @@
"property",
"AXDescription",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"IAccessible2" : [
@@ -37,7 +37,7 @@
"property",
"accName",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"UIA" : [
@@ -45,7 +45,7 @@
"property",
"Name",
"is",
- "foo bar baz"
+ "foo baz"
]
]
},
diff --git a/testing/web-platform/tests/accname/name_test_case_662-manual.html b/testing/web-platform/tests/accname/name_test_case_662-manual.html
index 4d69b0f1b57d..558756943814 100644
--- a/testing/web-platform/tests/accname/name_test_case_662-manual.html
+++ b/testing/web-platform/tests/accname/name_test_case_662-manual.html
@@ -21,7 +21,7 @@
"property",
"name",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"AXAPI" : [
@@ -29,7 +29,7 @@
"property",
"AXDescription",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"IAccessible2" : [
@@ -37,7 +37,7 @@
"property",
"accName",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"UIA" : [
@@ -45,7 +45,7 @@
"property",
"Name",
"is",
- "foo bar baz"
+ "foo baz"
]
]
},
diff --git a/testing/web-platform/tests/accname/name_test_case_663a-manual.html b/testing/web-platform/tests/accname/name_test_case_663a-manual.html
index 95ec2f857b7e..3fc3d17ccdf2 100644
--- a/testing/web-platform/tests/accname/name_test_case_663a-manual.html
+++ b/testing/web-platform/tests/accname/name_test_case_663a-manual.html
@@ -21,7 +21,7 @@
"property",
"name",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"AXAPI" : [
@@ -29,7 +29,7 @@
"property",
"AXDescription",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"IAccessible2" : [
@@ -37,7 +37,7 @@
"property",
"accName",
"is",
- "foo bar baz"
+ "foo baz"
]
],
"UIA" : [
@@ -45,7 +45,7 @@
"property",
"Name",
"is",
- "foo bar baz"
+ "foo baz"
]
]
},
diff --git a/testing/web-platform/tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html b/testing/web-platform/tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html
new file mode 100644
index 000000000000..fe5c1f146058
--- /dev/null
+++ b/testing/web-platform/tests/cookie-store/cookieStore_get_set_across_frames.tentative.https.html
@@ -0,0 +1,40 @@
+
+
+Async Cookies: cookieStore basic API across frames
+
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html b/testing/web-platform/tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html
new file mode 100644
index 000000000000..5cbe542e32b3
--- /dev/null
+++ b/testing/web-platform/tests/cookie-store/cookieStore_get_set_across_origins.tentative.sub.https.html
@@ -0,0 +1,63 @@
+
+
+Async Cookies: cookieStore basic API across origins
+
+
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/cookie-store/resources/helper_iframe.sub.html b/testing/web-platform/tests/cookie-store/resources/helper_iframe.sub.html
new file mode 100644
index 000000000000..8e91cb7bed48
--- /dev/null
+++ b/testing/web-platform/tests/cookie-store/resources/helper_iframe.sub.html
@@ -0,0 +1,31 @@
+
+
+
+
diff --git a/testing/web-platform/tests/cookie-store/resources/helpers.js b/testing/web-platform/tests/cookie-store/resources/helpers.js
new file mode 100644
index 000000000000..98f9ff6cb098
--- /dev/null
+++ b/testing/web-platform/tests/cookie-store/resources/helpers.js
@@ -0,0 +1,24 @@
+/**
+ * Promise based helper function who's return promise will resolve
+ * once the iframe src has been loaded
+ * @param {string} url the url to set the iframe src
+ * @param {test} t a test object to add a cleanup function to
+ * @return {Promise} when resolved, will return the iframe
+ */
+self.createIframe = (url, t) => new Promise(resolve => {
+ const iframe = document.createElement('iframe');
+ iframe.addEventListener('load', () => {resolve(iframe);}, {once: true});
+ iframe.src = url;
+ document.documentElement.appendChild(iframe);
+ t.add_cleanup(() => iframe.remove());
+});
+
+/**
+ * Function that will return a promise that resolves when a message event
+ * is fired. Returns a promise that resolves to the message that was received
+ */
+self.waitForMessage = () => new Promise(resolve => {
+ window.addEventListener('message', event => {
+ resolve(event.data);
+ }, {once: true});
+});
diff --git a/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-001.html b/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-001.html
new file mode 100644
index 000000000000..94c88bc49cb1
--- /dev/null
+++ b/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-001.html
@@ -0,0 +1,19 @@
+
+
+CSS Containment Test: Layout containment independent formatting context
+
+
+
+
+
+Test passes if it has the same output than the reference.
+
+
+ This text should have 2em top and bottom margins (margins do not collapse).
+
+
diff --git a/testing/web-platform/tests/css/css-contain/contain-layout-008.html b/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-002.html
similarity index 51%
rename from testing/web-platform/tests/css/css-contain/contain-layout-008.html
rename to testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-002.html
index d442bebb065d..a7e8baed56db 100644
--- a/testing/web-platform/tests/css/css-contain/contain-layout-008.html
+++ b/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-002.html
@@ -3,27 +3,17 @@
CSS Containment Test: Layout containment independent formatting context
-
-
+
+
-Test passes if on the first two boxes the top and bottom margins of the text line are double size than on the last box.
-
-
- This text should have 2em top and bottom margins (margins do not collapse).
-
-
+Test passes if it has the same output than the reference.
This text should have 2em top and bottom margins (margins do not collapse).
-
-
- This text should have 1em top and bottom margins.
-
-
diff --git a/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-003.html b/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-003.html
new file mode 100644
index 000000000000..a10afd3cdee9
--- /dev/null
+++ b/testing/web-platform/tests/css/css-contain/contain-layout-independent-formatting-context-003.html
@@ -0,0 +1,19 @@
+
+
+CSS Containment Test: Layout containment independent formatting context
+
+
+
+
+
+Test passes if it has the same output than the reference.
+
+
+ This text should have 1em top and bottom margins.
+
+
diff --git a/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-001.html b/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-001.html
new file mode 100644
index 000000000000..e4c06a992b35
--- /dev/null
+++ b/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-001.html
@@ -0,0 +1,19 @@
+
+
+CSS Containment Test: Paint containment independent formatting context
+
+
+
+
+
+Test passes if it has the same output than the reference.
+
+
+ This text should have 2em top and bottom margins (margins do not collapse).
+
+
diff --git a/testing/web-platform/tests/css/css-contain/contain-paint-013.html b/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-002.html
similarity index 51%
rename from testing/web-platform/tests/css/css-contain/contain-paint-013.html
rename to testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-002.html
index 3b6b3a76dc63..353196970c99 100644
--- a/testing/web-platform/tests/css/css-contain/contain-paint-013.html
+++ b/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-002.html
@@ -3,27 +3,17 @@
CSS Containment Test: Paint containment independent formatting context
-
-
+
+
-Test passes if on the first two boxes the top and bottom margins of the text line are double size than on the last box.
-
-
- This text should have 2em top and bottom margins (margins do not collapse).
-
-
+Test passes if it has the same output than the reference.
This text should have 2em top and bottom margins (margins do not collapse).
-
-
- This text should have 1em top and bottom margins.
-
-
diff --git a/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-003.html b/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-003.html
new file mode 100644
index 000000000000..fe1f7f2775db
--- /dev/null
+++ b/testing/web-platform/tests/css/css-contain/contain-paint-independent-formatting-context-003.html
@@ -0,0 +1,19 @@
+
+
+CSS Containment Test: Paint containment independent formatting context
+
+
+
+
+
+Test passes if it has the same output than the reference.
+
+
+ This text should have 1em top and bottom margins.
+
+
diff --git a/testing/web-platform/tests/css/css-contain/reference/contain-paint-013-ref.html b/testing/web-platform/tests/css/css-contain/reference/contain-paint-013-ref.html
deleted file mode 100644
index af758703a3b7..000000000000
--- a/testing/web-platform/tests/css/css-contain/reference/contain-paint-013-ref.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-CSS Containment Test: Reference file
-
-
-Test passes if on the first two boxes the top and bottom margins of the text line are double size than on the last box.
-
- This text should have 2em top and bottom margins (margins do not collapse).
-
-
- This text should have 2em top and bottom margins (margins do not collapse).
-
-
- This text should have 1em top and bottom margins.
-
diff --git a/testing/web-platform/tests/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html b/testing/web-platform/tests/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html
new file mode 100644
index 000000000000..08900b201b12
--- /dev/null
+++ b/testing/web-platform/tests/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html
@@ -0,0 +1,14 @@
+
+
+CSS Containment Test: Reference file
+
+
+Test passes if it has the same output than the reference.
+
+ This text should have 2em top and bottom margins (margins do not collapse).
+
diff --git a/testing/web-platform/tests/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html b/testing/web-platform/tests/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html
new file mode 100644
index 000000000000..0cef592ba5cc
--- /dev/null
+++ b/testing/web-platform/tests/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html
@@ -0,0 +1,14 @@
+
+
+CSS Containment Test: Reference file
+
+
+Test passes if it has the same output than the reference.
+
+ This text should have 1em top and bottom margins.
+
diff --git a/testing/web-platform/tests/css/css-tables/percentages-grandchildren-quirks-mode-001.html b/testing/web-platform/tests/css/css-tables/percentages-grandchildren-quirks-mode-001.html
new file mode 100644
index 000000000000..b6b6d245ab2f
--- /dev/null
+++ b/testing/web-platform/tests/css/css-tables/percentages-grandchildren-quirks-mode-001.html
@@ -0,0 +1,9 @@
+
+
+
+Test passes if there is a filled green square.
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/css-tables/percentages-grandchildren-quirks-mode-002.html b/testing/web-platform/tests/css/css-tables/percentages-grandchildren-quirks-mode-002.html
new file mode 100644
index 000000000000..a24556aa0ded
--- /dev/null
+++ b/testing/web-platform/tests/css/css-tables/percentages-grandchildren-quirks-mode-002.html
@@ -0,0 +1,9 @@
+
+
+
+Test passes if there is a filled green square.
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/css-transitions/historical.html b/testing/web-platform/tests/css/css-transitions/historical.html
new file mode 100644
index 000000000000..8d0360a8ecf7
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transitions/historical.html
@@ -0,0 +1,18 @@
+
+
+Historical CSS Transition features must be removed
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/cssom/getComputedStyle-insets-absolute.html b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-absolute.html
new file mode 100644
index 000000000000..196f5f26f31f
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-absolute.html
@@ -0,0 +1,21 @@
+
+
+CSSOM: resolved values of the inset properties for absolute positioning
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/cssom/getComputedStyle-insets-fixed.html b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-fixed.html
new file mode 100644
index 000000000000..e57e774fe6eb
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-fixed.html
@@ -0,0 +1,21 @@
+
+
+CSSOM: resolved values of the inset properties for fixed positioning
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/cssom/getComputedStyle-insets-nobox.html b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-nobox.html
new file mode 100644
index 000000000000..ca55ace7f4ed
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-nobox.html
@@ -0,0 +1,18 @@
+
+
+CSSOM: resolved values of the inset properties when the element generates no box
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/cssom/getComputedStyle-insets-relative.html b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-relative.html
new file mode 100644
index 000000000000..c48f2eb555ee
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-relative.html
@@ -0,0 +1,19 @@
+
+
+CSSOM: resolved values of the inset properties for relative positioning
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/cssom/getComputedStyle-insets-static.html b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-static.html
new file mode 100644
index 000000000000..854a8e3dba40
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-static.html
@@ -0,0 +1,19 @@
+
+
+CSSOM: resolved values of the inset properties for static positioning
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/cssom/getComputedStyle-insets-sticky.html b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-sticky.html
new file mode 100644
index 000000000000..10520232d738
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-insets-sticky.html
@@ -0,0 +1,19 @@
+
+
+CSSOM: resolved values of the inset properties for sticky positioning
+
+
+
+
+
+
diff --git a/testing/web-platform/tests/css/cssom/shorthand-serialization.html b/testing/web-platform/tests/css/cssom/shorthand-serialization.html
index 44af6737e3ef..97e11da8b8a2 100644
--- a/testing/web-platform/tests/css/cssom/shorthand-serialization.html
+++ b/testing/web-platform/tests/css/cssom/shorthand-serialization.html
@@ -70,8 +70,17 @@
const testElem = document.getElementById("test");
testElem.style.setProperty("margin-top", "initial", "important");
assert_equals(testElem.style.margin, "");
- assert_equals(testElem.style.cssText, "margin-top: initial !important; margin-right: initial; margin-bottom: initial; margin-left: initial;");
}, "Shorthand serialization with 'initial' value, one longhand with important flag.");
+
+ test(function() {
+ const testElem = document.getElementById("test");
+ testElem.style.cssText = "";
+ testElem.style.setProperty("margin-top", "initial");
+ testElem.style.setProperty("margin-right", "initial");
+ testElem.style.setProperty("margin-bottom", "initial");
+ testElem.style.setProperty("margin-left", "initial", "important");
+ assert_equals(testElem.style.margin, "");
+ }, "Shorthand serialization with 'initial' value, longhands set individually, one with important flag.");