Merge m-c to autoland, a=merge

MozReview-Commit-ID: KmdITOdRCqU
This commit is contained in:
Wes Kocher 2017-02-16 09:28:31 -08:00
commit a08b8a8c03
60 changed files with 15593 additions and 15871 deletions

View File

@ -2143,16 +2143,12 @@
<versionRange maxVersion="13.0.0.302" minVersion="13.0.0.302" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1495" os="Linux">
<match exp="" name="name"/>
<match exp="libflashplayer\.so" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="24.0.0.186" minVersion="23.0.0.207" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1420" os="">
<match exp="" name="name"/>
<pluginItem blockID="p1420">
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="23.0.0.205" minVersion="23.0.0.185" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2206,9 +2202,7 @@
<versionRange maxVersion="*" minVersion="0"/>
</pluginItem>
<pluginItem blockID="p1419" os="Linux">
<match exp="" name="name"/>
<match exp="libflashplayer\.so" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="11.2.202.643" minVersion="11.2.202.637" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2465,10 +2459,8 @@
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="18.0.0.232" minVersion="18.0.0.204" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1274" os="">
<match exp="" name="name"/>
<pluginItem blockID="p1274">
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="22.0.0.211" minVersion="22.0.0.192" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2579,10 +2571,8 @@
</targetApplication>
</versionRange>
</pluginItem>
<pluginItem blockID="p1494" os="">
<match exp="" name="name"/>
<pluginItem blockID="p1494">
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="24.0.0.186" minVersion="23.0.0.207" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2650,10 +2640,8 @@
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="18.0.0.352" minVersion="18.0.0.343" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p160" os="">
<match exp="" name="name"/>
<pluginItem blockID="p160">
<match exp="NPSWF32\.dll" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="10.2.9999" minVersion="0" severity="0" vulnerabilitystatus="1">
<targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
@ -2821,10 +2809,8 @@
<pluginItem blockID="p28">
<match exp="NPFFAddOn.dll" name="filename"/>
</pluginItem>
<pluginItem blockID="p1421" os="Linux">
<match exp="" name="name"/>
<pluginItem blockID="p1421">
<match exp="libflashplayer\.so" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="23.0.0.207" minVersion="11.2.202.643" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -3020,10 +3006,8 @@
<infoURL>https://get.adobe.com/reader</infoURL>
<versionRange maxVersion="15.006.30174" minVersion="15.006.30174" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1422" os="">
<match exp="" name="name"/>
<pluginItem blockID="p1422">
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="23.0.0.207" minVersion="23.0.0.205" severity="0" vulnerabilitystatus="1"/>
</pluginItem>

View File

@ -1056,6 +1056,7 @@ sys/statvfs.h
sys/syscall.h
sys/sysctl.h
sys/sysinfo.h
sys/sysmacros.h
sys/sysmp.h
sys/syssgi.h
sys/system_properties.h

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
function boom() {
setTimeout(function(){
var o=document.getElementById('b');
document.getElementById('a').appendChild(o.parentNode.removeChild(o));
},0);
var o=document.getElementById('c');
var p=document.getElementById('b');
p.id=[o.id, o.id=p.id][0];
o=document.getElementById('b');
o.setAttribute('sandbox', 'disc');
window.location.reload(true);
}
</script>
</head>
<body onload="boom();">
<header id='a'></header>
<output id='b'></output>
<iframe id='c' sandbox='allow-same-origin' src='http://a'></iframe>
</body>
</html>

View File

@ -13,3 +13,4 @@ load 614499-1.html
load 678872-1.html
skip-if(Android) pref(dom.disable_open_during_load,false) load 914521.html
pref(browser.send_pings,true) load 1257730-1.html
load 1331295.html

View File

@ -8100,7 +8100,11 @@ nsDocShell::CreateAboutBlankContentViewer(nsIPrincipal* aPrincipal,
if (docFactory) {
nsCOMPtr<nsIPrincipal> principal;
if (mSandboxFlags & SANDBOXED_ORIGIN) {
principal = nsNullPrincipal::CreateWithInheritedAttributes(aPrincipal);
if (aPrincipal) {
principal = nsNullPrincipal::CreateWithInheritedAttributes(aPrincipal);
} else {
principal = nsNullPrincipal::CreateWithInheritedAttributes(this);
}
} else {
principal = aPrincipal;
}

View File

@ -329,6 +329,8 @@ nsSMILAnimationController::DoSample(bool aSkipUnchangedContainers)
return;
}
nsCOMPtr<nsIDocument> document(mDocument); // keeps 'this' alive too
// Set running sample flag -- do this before flushing styles so that when we
// flush styles we don't end up requesting extra samples
AutoRestore<bool> autoRestoreRunningSample(mRunningSample);
@ -432,7 +434,6 @@ nsSMILAnimationController::DoSample(bool aSkipUnchangedContainers)
return;
}
nsCOMPtr<nsIDocument> document(mDocument); // keeps 'this' alive too
if (isStyleFlushNeeded) {
document->FlushPendingNotifications(FlushType::Style);
}

View File

@ -90,10 +90,10 @@ nsSMILInstanceTime::HandleChangedInterval(
bool objectChanged = mCreator->DependsOnBegin() ? aBeginObjectChanged :
aEndObjectChanged;
RefPtr<nsSMILInstanceTime> deathGrip(this);
mozilla::AutoRestore<bool> setVisited(mVisited);
mVisited = true;
RefPtr<nsSMILInstanceTime> deathGrip(this);
mCreator->HandleChangedInstanceTime(*GetBaseTime(), aSrcContainer, *this,
objectChanged);
}

View File

@ -1,4 +1,4 @@
52348
52349
0/nm
0th/pt
1/n1
@ -26862,6 +26862,7 @@ foulmouthed
foulness/M
found/FSDG
foundation/SM
foundational
founded/U
founder/GMDS
foundling/SM

View File

@ -1220,6 +1220,8 @@ SyncObjectD3D11::Init()
!DeviceManagerDx::Get()->HasDeviceReset())
{
gfxDevCrash(LogReason::D3D11FinalizeFrame) << "Without device reset: " << hexa(hr);
} else {
return false;
}
}

View File

@ -46,6 +46,10 @@ bool
nsNCRFallbackEncoderWrapper::Encode(const nsAString& aUtf16,
nsACString& aBytes)
{
// mozilla::dom::EncodingUtils::EncoderForEncoding fails during shutdown
if (!mEncoder) {
return false;
}
// nsIUnicodeEncoder uses int32_t for sizes :-(
if (aUtf16.Length() > INT32_MAX) {
return false;

View File

@ -1636,8 +1636,10 @@ OutlineTypedObject::obj_trace(JSTracer* trc, JSObject* object)
newData += reinterpret_cast<uint8_t*>(owner) - reinterpret_cast<uint8_t*>(oldOwner);
typedObj.setData(newData);
Nursery& nursery = typedObj.zoneFromAnyThread()->group()->nursery();
nursery.maybeSetForwardingPointer(trc, oldData, newData, /* direct = */ false);
if (trc->isTenuringTracer()) {
Nursery& nursery = typedObj.zoneFromAnyThread()->group()->nursery();
nursery.maybeSetForwardingPointer(trc, oldData, newData, /* direct = */ false);
}
}
if (!descr.opaque() || !typedObj.isAttached())

View File

@ -41,6 +41,9 @@ js::Allocate(JSContext* cx, AllocKind kind, size_t nDynamicSlots, InitialHeap he
// Off-thread alloc cannot trigger GC or make runtime assertions.
if (cx->helperThread()) {
// The zone group used by the helper thread should have been created
// with a disabled nursery.
MOZ_ASSERT(!cx->nursery().isEnabled());
JSObject* obj = GCRuntime::tryNewTenuredObject<NoGC>(cx, kind, thingSize, nDynamicSlots);
if (MOZ_UNLIKELY(allowGC && !obj))
ReportOutOfMemory(cx);

View File

@ -2414,7 +2414,7 @@ JSObject*
js::TenuringTracer::moveToTenured(JSObject* src)
{
MOZ_ASSERT(IsInsideNursery(src));
MOZ_ASSERT(!src->zone()->usedByExclusiveThread);
MOZ_ASSERT(!src->zone()->usedByHelperThread());
AllocKind dstKind = src->allocKindForTenure(nursery());
Zone* zone = src->zone();

View File

@ -39,28 +39,22 @@ template <typename T>
static inline T*
AllocateObjectBuffer(JSContext* cx, uint32_t count)
{
if (!cx->helperThread()) {
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(cx->zone(), nbytes));
if (!buffer)
ReportOutOfMemory(cx);
return buffer;
}
return cx->zone()->pod_malloc<T>(count);
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(cx->zone(), nbytes));
if (!buffer)
ReportOutOfMemory(cx);
return buffer;
}
template <typename T>
static inline T*
AllocateObjectBuffer(JSContext* cx, JSObject* obj, uint32_t count)
{
if (!cx->helperThread()) {
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(obj, nbytes));
if (!buffer)
ReportOutOfMemory(cx);
return buffer;
}
return obj->zone()->pod_malloc<T>(count);
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(obj, nbytes));
if (!buffer)
ReportOutOfMemory(cx);
return buffer;
}
// If this returns null then the old buffer will be left alone.
@ -69,15 +63,12 @@ static inline T*
ReallocateObjectBuffer(JSContext* cx, JSObject* obj, T* oldBuffer,
uint32_t oldCount, uint32_t newCount)
{
if (!cx->helperThread()) {
T* buffer = static_cast<T*>(cx->nursery().reallocateBuffer(obj, oldBuffer,
oldCount * sizeof(T),
newCount * sizeof(T)));
if (!buffer)
ReportOutOfMemory(cx);
return buffer;
}
return obj->zone()->pod_realloc<T>(oldBuffer, oldCount, newCount);
T* buffer = static_cast<T*>(cx->nursery().reallocateBuffer(obj, oldBuffer,
oldCount * sizeof(T),
newCount * sizeof(T)));
if (!buffer)
ReportOutOfMemory(cx);
return buffer;
}
static inline void

View File

@ -298,6 +298,7 @@ js::Nursery::allocate(size_t size)
{
MOZ_ASSERT(isEnabled());
MOZ_ASSERT(!JS::CurrentThreadIsHeapBusy());
MOZ_ASSERT(CurrentThreadCanAccessRuntime(zoneGroup()->runtime));
MOZ_ASSERT_IF(currentChunk_ == currentStartChunk_, position() >= currentStartPosition_);
MOZ_ASSERT(position() % gc::CellSize == 0);
MOZ_ASSERT(size % gc::CellSize == 0);

View File

@ -237,6 +237,8 @@ class Nursery
return numChunks() * gc::ChunkSize;
}
size_t sizeOfMallocedBuffers(mozilla::MallocSizeOf mallocSizeOf) const {
if (!mallocedBuffers.initialized())
return 0;
size_t total = 0;
for (MallocedBuffersSet::Range r = mallocedBuffers.all(); !r.empty(); r.popFront())
total += mallocSizeOf(r.front());

View File

@ -179,7 +179,7 @@ gc::GCRuntime::startVerifyPreBarriers()
if (verifyPreData || isIncrementalGCInProgress())
return;
if (IsIncrementalGCUnsafe(rt) != AbortReason::None || TlsContext.get()->keepAtoms || rt->exclusiveThreadsPresent())
if (IsIncrementalGCUnsafe(rt) != AbortReason::None || TlsContext.get()->keepAtoms || rt->hasHelperThreadZones())
return;
number++;
@ -239,11 +239,10 @@ gc::GCRuntime::startVerifyPreBarriers()
marker.start();
for (ZonesIter zone(rt, WithAtoms); !zone.done(); zone.next()) {
MOZ_ASSERT(!zone->usedByHelperThread());
PurgeJITCaches(zone);
if (!zone->usedByExclusiveThread) {
zone->setNeedsIncrementalBarrier(true, Zone::UpdateJit);
zone->arenas.purge();
}
zone->setNeedsIncrementalBarrier(true, Zone::UpdateJit);
zone->arenas.purge();
}
return;
@ -353,7 +352,7 @@ gc::GCRuntime::endVerifyPreBarriers()
if (!compartmentCreated &&
IsIncrementalGCUnsafe(rt) == AbortReason::None &&
!TlsContext.get()->keepAtoms &&
!rt->exclusiveThreadsPresent())
!rt->hasHelperThreadZones())
{
CheckEdgeTracer cetrc(rt);

View File

@ -51,7 +51,6 @@ JS::Zone::Zone(JSRuntime* rt, ZoneGroup* group)
initialShapes_(group, this, InitialShapeSet()),
data(group, nullptr),
isSystem(group, false),
usedByExclusiveThread(false),
#ifdef DEBUG
gcLastZoneGroupIndex(group, 0),
#endif
@ -105,7 +104,8 @@ Zone::setNeedsIncrementalBarrier(bool needs, ShouldUpdateJit updateJit)
jitUsingBarriers_ = needs;
}
MOZ_ASSERT_IF(needs && isAtomsZone(), !runtimeFromActiveCooperatingThread()->exclusiveThreadsPresent());
MOZ_ASSERT_IF(needs && isAtomsZone(),
!runtimeFromActiveCooperatingThread()->hasHelperThreadZones());
MOZ_ASSERT_IF(needs, canCollect());
needsIncrementalBarrier_ = needs;
}
@ -295,7 +295,7 @@ Zone::gcNumber()
{
// Zones in use by exclusive threads are not collected, and threads using
// them cannot access the main runtime's gcNumber without racing.
return usedByExclusiveThread ? 0 : runtimeFromActiveCooperatingThread()->gc.gcNumber();
return usedByHelperThread() ? 0 : runtimeFromActiveCooperatingThread()->gc.gcNumber();
}
js::jit::JitZone*
@ -324,10 +324,10 @@ bool
Zone::canCollect()
{
// Zones cannot be collected while in use by other threads.
if (usedByExclusiveThread)
if (usedByHelperThread())
return false;
JSRuntime* rt = runtimeFromAnyThread();
if (isAtomsZone() && rt->exclusiveThreadsPresent())
if (isAtomsZone() && rt->hasHelperThreadZones())
return false;
return true;
}

View File

@ -468,7 +468,9 @@ struct Zone : public JS::shadow::Zone,
js::ZoneGroupData<bool> isSystem;
mozilla::Atomic<bool> usedByExclusiveThread;
bool usedByHelperThread() {
return !isAtomsZone() && group()->usedByHelperThread;
}
#ifdef DEBUG
js::ZoneGroupData<unsigned> gcLastZoneGroupIndex;
@ -598,11 +600,8 @@ struct Zone : public JS::shadow::Zone,
namespace js {
// Iterate over all zone groups except those which may be in use by parse
// threads. Pretty soon this will exclude zone groups in use by parse threads
// (as for ZonesIter), i.e. the zone groups in use by cooperating threads,
// except that right now parse threads use zones in the same zone group as
// cooperating threads (bug 1323066).
// Iterate over all zone groups except those which may be in use by helper
// thread parse tasks.
class ZoneGroupsIter
{
gc::AutoEnterIteration iterMarker;
@ -613,13 +612,18 @@ class ZoneGroupsIter
explicit ZoneGroupsIter(JSRuntime* rt) : iterMarker(&rt->gc) {
it = rt->gc.groups.ref().begin();
end = rt->gc.groups.ref().end();
if (!done() && (*it)->usedByHelperThread)
next();
}
bool done() const { return it == end; }
void next() {
MOZ_ASSERT(!done());
it++;
do {
it++;
} while (!done() && (*it)->usedByHelperThread);
}
ZoneGroup* get() const {
@ -703,7 +707,7 @@ class ZonesIter
if (zone.ref().done()) {
zone.reset();
group.next();
} else if (!zone.ref().get()->usedByExclusiveThread) {
} else {
break;
}
}

View File

@ -15,8 +15,9 @@ namespace js {
ZoneGroup::ZoneGroup(JSRuntime* runtime)
: runtime(runtime),
ownerContext_(TlsContext.get()),
enterCount(this, 1),
zones_(),
enterCount(1),
zones_(this),
usedByHelperThread(false),
nursery_(this, this),
storeBuffer_(this, runtime, nursery()),
blocksToFreeAfterMinorGC((size_t) JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),

View File

@ -22,19 +22,12 @@ class AutoKeepAtoms;
typedef Vector<JS::Zone*, 4, SystemAllocPolicy> ZoneVector;
// Zone groups encapsulate data about a group of zones that are logically
// related in some way. Currently, each runtime has a single zone group, and
// all zones except the atoms zone (which has no group) are in that group.
// This will change soon.
// related in some way.
//
// When JSRuntimes become multithreaded (also happening soon; see bug 1323066),
// zone groups will be the primary means by which threads ensure exclusive
// access to the data they are using. Most data in a zone group, its zones,
// Zone groups are the primary means by which threads ensure exclusive access
// to the data they are using. Most data in a zone group, its zones,
// compartments, GC things and so forth may only be used by the thread that has
// entered the zone group.
//
// This restriction is not quite in place yet: zones used by an parse thread
// are accessed by that thread even though it does not have exclusive access
// to the entire zone group. This will also be changing soon.
class ZoneGroup
{
@ -46,7 +39,7 @@ class ZoneGroup
UnprotectedData<CooperatingContext> ownerContext_;
// The number of times the context has entered this zone group.
ZoneGroupData<size_t> enterCount;
UnprotectedData<size_t> enterCount;
public:
CooperatingContext& ownerContext() { return ownerContext_.ref(); }
@ -58,10 +51,13 @@ class ZoneGroup
// All zones in the group.
private:
ActiveThreadOrGCTaskData<ZoneVector> zones_;
ZoneGroupOrGCTaskData<ZoneVector> zones_;
public:
ZoneVector& zones() { return zones_.ref(); }
// Whether a zone in this group is in use by a helper thread.
mozilla::Atomic<bool> usedByHelperThread;
explicit ZoneGroup(JSRuntime* runtime);
~ZoneGroup();

View File

@ -804,7 +804,7 @@ DoGetElemFallback(JSContext* cx, BaselineFrame* frame, ICGetElem_Fallback* stub_
bool isTemporarilyUnoptimizable = false;
if (!attached && !JitOptions.disableCacheIR) {
ICStubEngine engine = ICStubEngine::Baseline;
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetElem, engine,
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetElem,
&isTemporarilyUnoptimizable, lhs, rhs, CanAttachGetter::Yes);
if (gen.tryAttachStub()) {
ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(),

View File

@ -40,14 +40,12 @@ IRGenerator::IRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, Cac
{}
GetPropIRGenerator::GetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc,
CacheKind cacheKind, ICStubEngine engine,
bool* isTemporarilyUnoptimizable,
CacheKind cacheKind, bool* isTemporarilyUnoptimizable,
HandleValue val, HandleValue idVal,
CanAttachGetter canAttachGetter)
: IRGenerator(cx, script, pc, cacheKind),
val_(val),
idVal_(idVal),
engine_(engine),
isTemporarilyUnoptimizable_(isTemporarilyUnoptimizable),
canAttachGetter_(canAttachGetter),
preliminaryObjectAction_(PreliminaryObjectAction::None)
@ -282,7 +280,7 @@ enum NativeGetPropCacheability {
static NativeGetPropCacheability
CanAttachNativeGetProp(JSContext* cx, HandleObject obj, HandleId id,
MutableHandleNativeObject holder, MutableHandleShape shape,
jsbytecode* pc, ICStubEngine engine, CanAttachGetter canAttachGetter,
jsbytecode* pc, CanAttachGetter canAttachGetter,
bool* isTemporarilyUnoptimizable)
{
MOZ_ASSERT(JSID_IS_STRING(id) || JSID_IS_SYMBOL(id));
@ -318,11 +316,8 @@ CanAttachNativeGetProp(JSContext* cx, HandleObject obj, HandleId id,
if (canAttachGetter == CanAttachGetter::No)
return CanAttachNone;
if (IsCacheableGetPropCallScripted(obj, holder, shape, isTemporarilyUnoptimizable)) {
// See bug 1226816.
if (engine != ICStubEngine::IonSharedIC)
return CanAttachCallGetter;
}
if (IsCacheableGetPropCallScripted(obj, holder, shape, isTemporarilyUnoptimizable))
return CanAttachCallGetter;
if (IsCacheableGetPropCallNative(obj, holder, shape))
return CanAttachCallGetter;
@ -499,7 +494,7 @@ GetPropIRGenerator::tryAttachNative(HandleObject obj, ObjOperandId objId, Handle
RootedNativeObject holder(cx_);
NativeGetPropCacheability type = CanAttachNativeGetProp(cx_, obj, id, &holder, &shape, pc_,
engine_, canAttachGetter_,
canAttachGetter_,
isTemporarilyUnoptimizable_);
MOZ_ASSERT_IF(idempotent(),
type == CanAttachNone || (type == CanAttachReadSlot && holder));
@ -554,7 +549,7 @@ GetPropIRGenerator::tryAttachWindowProxy(HandleObject obj, ObjOperandId objId, H
RootedShape shape(cx_);
RootedNativeObject holder(cx_);
NativeGetPropCacheability type = CanAttachNativeGetProp(cx_, windowObj, id, &holder, &shape, pc_,
engine_, canAttachGetter_,
canAttachGetter_,
isTemporarilyUnoptimizable_);
switch (type) {
case CanAttachNone:
@ -647,7 +642,7 @@ GetPropIRGenerator::tryAttachDOMProxyExpando(HandleObject obj, ObjOperandId objI
RootedNativeObject holder(cx_);
RootedShape propShape(cx_);
NativeGetPropCacheability canCache =
CanAttachNativeGetProp(cx_, expandoObj, id, &holder, &propShape, pc_, engine_,
CanAttachNativeGetProp(cx_, expandoObj, id, &holder, &propShape, pc_,
canAttachGetter_, isTemporarilyUnoptimizable_);
if (canCache != CanAttachReadSlot && canCache != CanAttachCallGetter)
return false;
@ -750,7 +745,7 @@ GetPropIRGenerator::tryAttachDOMProxyUnshadowed(HandleObject obj, ObjOperandId o
RootedNativeObject holder(cx_);
RootedShape shape(cx_);
NativeGetPropCacheability canCache = CanAttachNativeGetProp(cx_, checkObj, id, &holder, &shape,
pc_, engine_, canAttachGetter_,
pc_, canAttachGetter_,
isTemporarilyUnoptimizable_);
MOZ_ASSERT_IF(idempotent(),
canCache == CanAttachNone || (canCache == CanAttachReadSlot && holder));
@ -1071,7 +1066,7 @@ GetPropIRGenerator::tryAttachPrimitive(ValOperandId valId, HandleId id)
RootedShape shape(cx_);
RootedNativeObject holder(cx_);
NativeGetPropCacheability type = CanAttachNativeGetProp(cx_, proto, id, &holder, &shape, pc_,
engine_, canAttachGetter_,
canAttachGetter_,
isTemporarilyUnoptimizable_);
if (type != CanAttachReadSlot)
return false;

View File

@ -912,7 +912,6 @@ class MOZ_RAII GetPropIRGenerator : public IRGenerator
{
HandleValue val_;
HandleValue idVal_;
ICStubEngine engine_;
bool* isTemporarilyUnoptimizable_;
CanAttachGetter canAttachGetter_;
@ -972,8 +971,8 @@ class MOZ_RAII GetPropIRGenerator : public IRGenerator
public:
GetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind,
ICStubEngine engine, bool* isTemporarilyUnoptimizable,
HandleValue val,HandleValue idVal, CanAttachGetter canAttachGetter);
bool* isTemporarilyUnoptimizable, HandleValue val,HandleValue idVal,
CanAttachGetter canAttachGetter);
bool tryAttachStub();
bool tryAttachIdempotentStub();

View File

@ -3077,9 +3077,6 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool
it.returnAddressToFp());
break;
}
case JitFrame_IonStub:
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " ion stub frame @ %p", frameno, it.fp());
break;
case JitFrame_BaselineStub:
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " baseline stub frame @ %p", frameno, it.fp());
break;

View File

@ -138,8 +138,7 @@ IonGetPropertyIC::update(JSContext* cx, HandleScript outerScript, IonGetProperty
ic->monitoredResult() ? CanAttachGetter::Yes : CanAttachGetter::No;
jsbytecode* pc = ic->idempotent() ? nullptr : ic->pc();
bool isTemporarilyUnoptimizable;
GetPropIRGenerator gen(cx, outerScript, pc, ic->kind(), ICStubEngine::IonIC,
&isTemporarilyUnoptimizable,
GetPropIRGenerator gen(cx, outerScript, pc, ic->kind(), &isTemporarilyUnoptimizable,
val, idVal, canAttachGetter);
if (ic->idempotent() ? gen.tryAttachIdempotentStub() : gen.tryAttachStub()) {
attached = ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(),

View File

@ -34,10 +34,9 @@ enum FrameType
// JS frame used by the baseline JIT.
JitFrame_BaselineJS,
// Frame pushed for JIT stubs that make non-tail calls, so that the
// Frame pushed by Baseline stubs that make non-tail calls, so that the
// return address -> ICEntry mapping works.
JitFrame_BaselineStub,
JitFrame_IonStub,
// The entry frame is the initial prologue block transitioning from the VM
// into the Ion world.
@ -148,9 +147,6 @@ class JitFrameIterator
bool isIonJS() const {
return type_ == JitFrame_IonJS;
}
bool isIonStub() const {
return type_ == JitFrame_IonStub;
}
bool isIonICCall() const {
return type_ == JitFrame_IonICCall;
}

View File

@ -1219,12 +1219,12 @@ UpdateIonJSFrameForMinorGC(JSTracer* trc, const JitFrameIterator& frame)
}
static void
TraceJitStubFrame(JSTracer* trc, const JitFrameIterator& frame)
TraceBaselineStubFrame(JSTracer* trc, const JitFrameIterator& frame)
{
// Trace the ICStub pointer stored in the stub frame. This is necessary
// so that we don't destroy the stub code after unlinking the stub.
MOZ_ASSERT(frame.type() == JitFrame_IonStub || frame.type() == JitFrame_BaselineStub);
MOZ_ASSERT(frame.type() == JitFrame_BaselineStub);
JitStubFrameLayout* layout = (JitStubFrameLayout*)frame.fp();
if (ICStub* stub = layout->maybeStubPtr()) {
@ -1487,8 +1487,7 @@ TraceJitActivation(JSTracer* trc, const JitActivationIterator& activations)
TraceIonJSFrame(trc, frames);
break;
case JitFrame_BaselineStub:
case JitFrame_IonStub:
TraceJitStubFrame(trc, frames);
TraceBaselineStubFrame(trc, frames);
break;
case JitFrame_Bailout:
TraceBailoutFrame(trc, frames);
@ -1559,7 +1558,7 @@ GetPcScript(JSContext* cx, JSScript** scriptRes, jsbytecode** pcRes)
if (it.isBaselineStub()) {
++it;
MOZ_ASSERT(it.isBaselineJS());
} else if (it.isIonStub() || it.isIonICCall()) {
} else if (it.isIonICCall()) {
++it;
MOZ_ASSERT(it.isIonJS());
}
@ -2729,10 +2728,6 @@ JitFrameIterator::dump() const
}
break;
}
case JitFrame_IonStub:
fprintf(stderr, " Ion stub frame\n");
fprintf(stderr, " Frame size: %u\n", unsigned(current()->prevFrameLocalSize()));
break;
case JitFrame_Rectifier:
fprintf(stderr, " Rectifier frame\n");
fprintf(stderr, " Frame size: %u\n", unsigned(current()->prevFrameLocalSize()));

View File

@ -557,10 +557,9 @@ ICStubCompiler::callVM(const VMFunction& fun, MacroAssembler& masm)
return false;
MOZ_ASSERT(fun.expectTailCall == NonTailCall);
if (engine_ == Engine::Baseline)
EmitBaselineCallVM(code, masm);
else
EmitIonCallVM(code, fun.explicitStackSlots(), masm);
MOZ_ASSERT(engine_ == Engine::Baseline);
EmitBaselineCallVM(code, masm);
return true;
}
@ -2035,7 +2034,7 @@ ComputeGetPropResult(JSContext* cx, BaselineFrame* frame, JSOp op, HandlePropert
{
// Handle arguments.length and arguments.callee on optimized arguments, as
// it is not an object.
if (frame && val.isMagic(JS_OPTIMIZED_ARGUMENTS) && IsOptimizedArguments(frame, val)) {
if (val.isMagic(JS_OPTIMIZED_ARGUMENTS) && IsOptimizedArguments(frame, val)) {
if (op == JSOP_LENGTH) {
res.setInt32(frame->numActualArgs());
} else {
@ -2060,17 +2059,16 @@ ComputeGetPropResult(JSContext* cx, BaselineFrame* frame, JSOp op, HandlePropert
}
static bool
DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
DoGetPropFallback(JSContext* cx, BaselineFrame* frame, ICGetProp_Fallback* stub_,
MutableHandleValue val, MutableHandleValue res)
{
SharedStubInfo info(cx, payload, stub_->icEntry());
ICStubCompiler::Engine engine = info.engine();
SharedStubInfo info(cx, frame, stub_->icEntry());
HandleScript script = info.innerScript();
// This fallback stub may trigger debug mode toggling.
DebugModeOSRVolatileStub<ICGetProp_Fallback*> stub(engine, info.maybeFrame(), stub_);
DebugModeOSRVolatileStub<ICGetProp_Fallback*> stub(frame, stub_);
jsbytecode* pc = info.pc();
jsbytecode* pc = stub_->icEntry()->pc(script);
JSOp op = JSOp(*pc);
FallbackICSpew(cx, stub, "GetProp(%s)", CodeName[op]);
@ -2097,9 +2095,8 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
// Discard all stubs in this IC and replace with generic getprop stub.
for (ICStubIterator iter = stub->beginChain(); !iter.atEnd(); iter++)
iter.unlink(cx);
ICGetProp_Generic::Compiler compiler(cx, engine,
stub->fallbackMonitorStub()->firstMonitorStub());
ICStub* newStub = compiler.getStub(compiler.getStubSpace(info.outerScript(cx)));
ICGetProp_Generic::Compiler compiler(cx, stub->fallbackMonitorStub()->firstMonitorStub());
ICStub* newStub = compiler.getStub(compiler.getStubSpace(script));
if (!newStub)
return false;
stub->addNewStub(newStub);
@ -2108,11 +2105,12 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
if (!attached && !JitOptions.disableCacheIR) {
RootedValue idVal(cx, StringValue(name));
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetProp, engine,
&isTemporarilyUnoptimizable, val, idVal, CanAttachGetter::Yes);
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetProp, &isTemporarilyUnoptimizable,
val, idVal, CanAttachGetter::Yes);
if (gen.tryAttachStub()) {
ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(),
engine, info.outerScript(cx), stub);
ICStubEngine::Baseline, script,
stub);
if (newStub) {
JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub");
attached = true;
@ -2124,7 +2122,7 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
}
}
if (!ComputeGetPropResult(cx, info.maybeFrame(), op, name, val, res))
if (!ComputeGetPropResult(cx, frame, op, name, val, res))
return false;
TypeScript::Monitor(cx, script, pc, res);
@ -2147,7 +2145,7 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
return true;
}
typedef bool (*DoGetPropFallbackFn)(JSContext*, void*, ICGetProp_Fallback*,
typedef bool (*DoGetPropFallbackFn)(JSContext*, BaselineFrame*, ICGetProp_Fallback*,
MutableHandleValue, MutableHandleValue);
static const VMFunction DoGetPropFallbackInfo =
FunctionInfo<DoGetPropFallbackFn>(DoGetPropFallback, "DoGetPropFallback", TailCall,
@ -2166,7 +2164,7 @@ ICGetProp_Fallback::Compiler::generateStubCode(MacroAssembler& masm)
// Push arguments.
masm.pushValue(R0);
masm.push(ICStubReg);
pushStubPayload(masm, R0.scratchReg());
masm.pushBaselineFramePtr(BaselineFrameReg, R0.scratchReg());
if (!tailCallVM(DoGetPropFallbackInfo, masm))
return false;
@ -2228,19 +2226,19 @@ ICGetProp_Generic::Clone(JSContext* cx, ICStubSpace* space, ICStub* firstMonitor
}
static bool
DoGetPropGeneric(JSContext* cx, void* payload, ICGetProp_Generic* stub,
DoGetPropGeneric(JSContext* cx, BaselineFrame* frame, ICGetProp_Generic* stub,
MutableHandleValue val, MutableHandleValue res)
{
ICFallbackStub* fallback = stub->getChainFallback();
SharedStubInfo info(cx, payload, fallback->icEntry());
HandleScript script = info.innerScript();
jsbytecode* pc = info.pc();
JSScript* script = frame->script();
jsbytecode* pc = fallback->icEntry()->pc(script);
JSOp op = JSOp(*pc);
RootedPropertyName name(cx, script->getName(pc));
return ComputeGetPropResult(cx, info.maybeFrame(), op, name, val, res);
return ComputeGetPropResult(cx, frame, op, name, val, res);
}
typedef bool (*DoGetPropGenericFn)(JSContext*, void*, ICGetProp_Generic*, MutableHandleValue, MutableHandleValue);
typedef bool (*DoGetPropGenericFn)(JSContext*, BaselineFrame*, ICGetProp_Generic*,
MutableHandleValue, MutableHandleValue);
static const VMFunction DoGetPropGenericInfo =
FunctionInfo<DoGetPropGenericFn>(DoGetPropGeneric, "DoGetPropGeneric");

View File

@ -2392,8 +2392,8 @@ class ICGetProp_Generic : public ICMonitoredStub
MOZ_MUST_USE bool generateStubCode(MacroAssembler& masm);
ICStub* firstMonitorStub_;
public:
explicit Compiler(JSContext* cx, Engine engine, ICStub* firstMonitorStub)
: ICStubCompiler(cx, ICStub::GetProp_Generic, engine),
explicit Compiler(JSContext* cx, ICStub* firstMonitorStub)
: ICStubCompiler(cx, ICStub::GetProp_Generic, ICStubEngine::Baseline),
firstMonitorStub_(firstMonitorStub)
{}

View File

@ -150,22 +150,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
masm.call(target);
}
inline void
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
{
uint32_t descriptor = MakeFrameDescriptor(masm.framePushed(), JitFrame_IonStub,
ExitFrameLayout::Size());
masm.Push(Imm32(descriptor));
masm.callJit(target);
// Remove rest of the frame left on the stack. We remove the return address
// which is implicitly popped when returning.
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
// Pop arguments from framePushed.
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
}
// Size of vales pushed by EmitEnterStubFrame.
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);

View File

@ -137,12 +137,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
masm.call(target);
}
inline void
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
{
MOZ_CRASH("Not implemented yet.");
}
// Size of values pushed by EmitEnterStubFrame.
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);

View File

@ -143,22 +143,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
masm.call(target);
}
inline void
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
{
uint32_t descriptor = MakeFrameDescriptor(masm.framePushed(), JitFrame_IonStub,
ExitFrameLayout::Size());
masm.Push(Imm32(descriptor));
masm.callJit(target);
// Remove rest of the frame left on the stack. We remove the return address
// which is implicitly popped when returning.
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
// Pop arguments from framePushed.
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
}
struct BaselineStubFrame {
uintptr_t savedFrame;
uintptr_t savedStub;

View File

@ -24,7 +24,6 @@ inline void EmitBaselineTailCallVM(JitCode*, MacroAssembler&, uint32_t) { MOZ_CR
inline void EmitIonTailCallVM(JitCode*, MacroAssembler&, uint32_t) { MOZ_CRASH(); }
inline void EmitBaselineCreateStubFrameDescriptor(MacroAssembler&, Register, uint32_t) { MOZ_CRASH(); }
inline void EmitBaselineCallVM(JitCode*, MacroAssembler&) { MOZ_CRASH(); }
inline void EmitIonCallVM(JitCode*, size_t, MacroAssembler&) { MOZ_CRASH(); }
inline void EmitBaselineEnterStubFrame(MacroAssembler&, Register) { MOZ_CRASH(); }
inline void EmitBaselineLeaveStubFrame(MacroAssembler&, bool v = false) { MOZ_CRASH(); }
inline void EmitStowICValues(MacroAssembler&, int) { MOZ_CRASH(); }

View File

@ -133,28 +133,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
masm.call(target);
}
inline void
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
{
// Stubs often use the return address. Which is actually accounted by the
// caller of the stub. Though in the stubcode we fake that is part of the
// stub. In order to make it possible to pop it. As a result we have to
// fix it here, by subtracting it. Else it would be counted twice.
uint32_t framePushed = masm.framePushed() - sizeof(void*);
uint32_t descriptor = MakeFrameDescriptor(framePushed, JitFrame_IonStub,
ExitFrameLayout::Size());
masm.Push(Imm32(descriptor));
masm.call(target);
// Remove rest of the frame left on the stack. We remove the return address
// which is implicitly poped when returning.
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
// Pop arguments from framePushed.
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
}
// Size of vales pushed by EmitEnterStubFrame.
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);

View File

@ -131,28 +131,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
masm.call(target);
}
inline void
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
{
// Stubs often use the return address. Which is actually accounted by the
// caller of the stub. Though in the stubcode we fake that is part of the
// stub. In order to make it possible to pop it. As a result we have to
// fix it here, by subtracting it. Else it would be counted twice.
uint32_t framePushed = masm.framePushed() - sizeof(void*);
uint32_t descriptor = MakeFrameDescriptor(framePushed, JitFrame_IonStub,
ExitFrameLayout::Size());
masm.Push(Imm32(descriptor));
masm.call(target);
// Remove rest of the frame left on the stack. We remove the return address
// which is implicitly poped when returning.
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
// Pop arguments from framePushed.
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
}
// Size of vales pushed by EmitEnterStubFrame.
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);

View File

@ -5,11 +5,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*
* TODO: Test weakmaps with gray values. Currently these are fixed up by the
* cycle collector.
*/
#include "gc/Heap.h"
#include "gc/Zone.h"
@ -31,6 +26,20 @@ BEGIN_TEST(testGCGrayMarking)
CHECK(InitGlobals());
JSAutoCompartment ac(cx, global1);
InitGrayRootTracer();
bool ok = TestMarking() && TestWeakMaps() && TestCCWs();
global1 = nullptr;
global2 = nullptr;
RemoveGrayRootTracer();
return ok;
}
bool
TestMarking()
{
JSObject* sameTarget = AllocTargetObject();
CHECK(sameTarget);
@ -40,7 +49,7 @@ BEGIN_TEST(testGCGrayMarking)
JSObject* crossTarget = AllocTargetObject();
CHECK(crossTarget);
JSObject* crossSource = AllocCrossCompartmentSourceObject(crossTarget);
JSObject* crossSource = GetCrossCompartmentWrapper(crossTarget);
CHECK(crossSource);
// Test GC with black roots marks objects black.
@ -57,7 +66,6 @@ BEGIN_TEST(testGCGrayMarking)
// Test GC with black and gray roots marks objects black.
InitGrayRootTracer();
grayRoots.grayRoot1 = sameSource;
grayRoots.grayRoot2 = crossSource;
@ -102,11 +110,221 @@ BEGIN_TEST(testGCGrayMarking)
CHECK(IsMarkedBlack(crossSource));
CHECK(IsMarkedBlack(crossTarget));
// Cleanup.
return true;
}
global1 = nullptr;
global2 = nullptr;
RemoveGrayRootTracer();
bool
TestWeakMaps()
{
JSObject* weakMap = JS::NewWeakMapObject(cx);
CHECK(weakMap);
JSObject* key = AllocWeakmapKeyObject();
CHECK(key);
JSObject* value = AllocWeakmapKeyObject();
CHECK(value);
{
JS::RootedObject rootedMap(cx, weakMap);
JS::RootedObject rootedKey(cx, key);
JS::RootedValue rootedValue(cx, ObjectValue(*value));
CHECK(SetWeakMapEntry(cx, rootedMap, rootedKey, rootedValue));
}
// Test the value of a weakmap entry is marked gray by GC if both the
// weakmap and key are marked gray.
grayRoots.grayRoot1 = weakMap;
grayRoots.grayRoot2 = key;
JS_GC(cx);
CHECK(IsMarkedGray(weakMap));
CHECK(IsMarkedGray(key));
CHECK(IsMarkedGray(value));
// Test the value of a weakmap entry is marked gray by GC if one of the
// weakmap and the key is marked gray and the other black.
JS::RootedObject blackRoot1(cx);
blackRoot1 = weakMap;
grayRoots.grayRoot1 = key;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedBlack(weakMap));
CHECK(IsMarkedGray(key));
CHECK(IsMarkedGray(value));
blackRoot1 = key;
grayRoots.grayRoot1 = weakMap;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedGray(weakMap));
CHECK(IsMarkedBlack(key));
CHECK(IsMarkedGray(value));
// Test the value of a weakmap entry is marked black by GC if both the
// weakmap and the key are marked black.
JS::RootedObject blackRoot2(cx);
grayRoots.grayRoot1 = nullptr;
grayRoots.grayRoot2 = nullptr;
blackRoot1 = weakMap;
blackRoot2 = key;
JS_GC(cx);
CHECK(IsMarkedBlack(weakMap));
CHECK(IsMarkedBlack(key));
CHECK(IsMarkedBlack(value));
blackRoot1 = key;
blackRoot2 = weakMap;
JS_GC(cx);
CHECK(IsMarkedBlack(weakMap));
CHECK(IsMarkedBlack(key));
CHECK(IsMarkedBlack(value));
// Test that a weakmap key is marked gray if it has a gray delegate and the
// map is either gray or black.
JSObject* delegate = AllocDelegateForKey(key);
blackRoot1 = weakMap;
blackRoot2 = nullptr;
grayRoots.grayRoot1 = delegate;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedGray(delegate));
CHECK(IsMarkedGray(key));
CHECK(IsMarkedBlack(weakMap));
CHECK(IsMarkedGray(value));
blackRoot1 = nullptr;
blackRoot2 = nullptr;
grayRoots.grayRoot1 = weakMap;
grayRoots.grayRoot2 = delegate;
JS_GC(cx);
CHECK(IsMarkedGray(delegate));
CHECK(IsMarkedGray(key));
CHECK(IsMarkedGray(weakMap));
CHECK(IsMarkedGray(value));
// Test that a weakmap key is marked gray if it has a black delegate but
// the map is gray.
blackRoot1 = delegate;
blackRoot2 = nullptr;
grayRoots.grayRoot1 = weakMap;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedBlack(delegate));
CHECK(IsMarkedGray(key));
CHECK(IsMarkedGray(weakMap));
CHECK(IsMarkedGray(value));
blackRoot1 = delegate;
blackRoot2 = nullptr;
grayRoots.grayRoot1 = weakMap;
grayRoots.grayRoot2 = key;
JS_GC(cx);
CHECK(IsMarkedBlack(delegate));
CHECK(IsMarkedGray(key));
CHECK(IsMarkedGray(weakMap));
CHECK(IsMarkedGray(value));
// Test that a weakmap key is marked black if it has a black delegate and
// the map is black.
blackRoot1 = delegate;
blackRoot2 = weakMap;
grayRoots.grayRoot1 = nullptr;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedBlack(delegate));
CHECK(IsMarkedBlack(key));
CHECK(IsMarkedBlack(weakMap));
CHECK(IsMarkedBlack(value));
blackRoot1 = delegate;
blackRoot2 = weakMap;
grayRoots.grayRoot1 = key;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedBlack(delegate));
CHECK(IsMarkedBlack(key));
CHECK(IsMarkedBlack(weakMap));
CHECK(IsMarkedBlack(value));
// Test what happens if there is a delegate but it is not marked for both
// black and gray cases.
delegate = nullptr;
blackRoot1 = key;
blackRoot2 = weakMap;
grayRoots.grayRoot1 = nullptr;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedBlack(key));
CHECK(IsMarkedBlack(weakMap));
CHECK(IsMarkedBlack(value));
CHECK(AllocDelegateForKey(key));
blackRoot1 = nullptr;
blackRoot2 = nullptr;
grayRoots.grayRoot1 = weakMap;
grayRoots.grayRoot2 = key;
JS_GC(cx);
CHECK(IsMarkedGray(key));
CHECK(IsMarkedGray(weakMap));
CHECK(IsMarkedGray(value));
return true;
}
bool
TestCCWs()
{
RootedObject target(cx, AllocTargetObject());
CHECK(target);
// Test getting a new wrapper doesn't return a gray wrapper.
JSObject* wrapper = GetCrossCompartmentWrapper(target);
CHECK(wrapper);
CHECK(!IsMarkedGray(wrapper));
// Test getting an existing wrapper doesn't return a gray wrapper.
grayRoots.grayRoot1 = wrapper;
grayRoots.grayRoot2 = nullptr;
JS_GC(cx);
CHECK(IsMarkedGray(wrapper));
CHECK(IsMarkedBlack(target));
CHECK(GetCrossCompartmentWrapper(target) == wrapper);
CHECK(!IsMarkedGray(wrapper));
// Test getting an existing wrapper doesn't return a gray wrapper
// during incremental GC.
JS_GC(cx);
CHECK(IsMarkedGray(wrapper));
CHECK(IsMarkedBlack(target));
JS_SetGCParameter(cx, JSGC_MODE, JSGC_MODE_INCREMENTAL);
JS::PrepareForFullGC(cx);
js::SliceBudget budget(js::WorkBudget(1));
cx->runtime()->gc.startDebugGC(GC_NORMAL, budget);
CHECK(JS::IsIncrementalGCInProgress(cx));
CHECK(!IsMarkedBlack(wrapper));
CHECK(wrapper->zone()->isGCMarkingBlack());
CHECK(GetCrossCompartmentWrapper(target) == wrapper);
CHECK(IsMarkedBlack(wrapper));
JS::FinishIncrementalGC(cx, JS::gcreason::API);
grayRoots.grayRoot1 = nullptr;
grayRoots.grayRoot2 = nullptr;
return true;
}
@ -152,15 +370,17 @@ static void
TraceGrayRoots(JSTracer* trc, void* data)
{
auto grayRoots = static_cast<GrayRoots*>(data);
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot1, "gray root 1");
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot2, "gray root 2");
if (grayRoots->grayRoot1)
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot1, "gray root 1");
if (grayRoots->grayRoot2)
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot2, "gray root 2");
}
JSObject*
AllocTargetObject()
{
JS::RootedObject obj(cx, JS_NewPlainObject(cx));
cx->zone()->group()->evictNursery();
EvictNursery();
MOZ_ASSERT(obj->compartment() == global1->compartment());
return obj;
@ -177,14 +397,14 @@ AllocSameCompartmentSourceObject(JSObject* target)
if (!JS_DefineProperty(cx, source, "ptr", obj, 0))
return nullptr;
cx->zone()->group()->evictNursery();
EvictNursery();
MOZ_ASSERT(source->compartment() == global1->compartment());
return source;
}
JSObject*
AllocCrossCompartmentSourceObject(JSObject* target)
GetCrossCompartmentWrapper(JSObject* target)
{
MOZ_ASSERT(target->compartment() == global1->compartment());
JS::RootedObject obj(cx, target);
@ -192,12 +412,52 @@ AllocCrossCompartmentSourceObject(JSObject* target)
if (!JS_WrapObject(cx, &obj))
return nullptr;
cx->zone()->group()->evictNursery();
EvictNursery();
MOZ_ASSERT(obj->compartment() == global2->compartment());
return obj;
}
static JSObject*
GetKeyDelegate(JSObject* obj)
{
return static_cast<JSObject*>(obj->as<NativeObject>().getPrivate());
}
JSObject*
AllocWeakmapKeyObject()
{
static const js::ClassExtension KeyClassExtension = {
GetKeyDelegate
};
static const js::Class KeyClass = {
"keyWithDelegate",
JSCLASS_HAS_PRIVATE,
JS_NULL_CLASS_OPS,
JS_NULL_CLASS_SPEC,
&KeyClassExtension,
JS_NULL_OBJECT_OPS
};
JS::RootedObject key(cx, JS_NewObject(cx, Jsvalify(&KeyClass)));
if (!key)
return nullptr;
EvictNursery();
return key;
}
JSObject*
AllocDelegateForKey(JSObject* key)
{
JS::RootedObject obj(cx, JS_NewPlainObject(cx));
EvictNursery();
key->as<NativeObject>().setPrivate(obj);
return obj;
}
bool
IsMarkedBlack(JSObject* obj)
{
@ -214,6 +474,12 @@ IsMarkedGray(JSObject* obj)
return isGray;
}
void
EvictNursery()
{
cx->zone()->group()->evictNursery();
}
bool
ZoneGC(JS::Zone* zone)
{

View File

@ -2219,6 +2219,7 @@ class JS_PUBLIC_API(CompartmentCreationOptions)
traceGlobal_(nullptr),
zoneSpec_(NewZoneInSystemZoneGroup),
zonePointer_(nullptr),
disableNursery_(false),
invisibleToDebugger_(false),
mergeable_(false),
preserveJitCode_(false),
@ -2254,6 +2255,14 @@ class JS_PUBLIC_API(CompartmentCreationOptions)
CompartmentCreationOptions& setNewZoneInSystemZoneGroup();
CompartmentCreationOptions& setNewZoneInExistingZoneGroup(JSObject* obj);
// If these options are creating a new zone group, prevent the use of a
// generational GC nursery by that group.
bool disableNursery() const { return disableNursery_; }
CompartmentCreationOptions& setDisableNursery(bool flag) {
disableNursery_ = flag;
return *this;
}
// Certain scopes (i.e. XBL compilation scopes) are implementation details
// of the embedding, and references to them should never leak out to script.
// This flag causes the this compartment to skip firing onNewGlobalObject
@ -2323,6 +2332,7 @@ class JS_PUBLIC_API(CompartmentCreationOptions)
JSTraceOp traceGlobal_;
ZoneSpecifier zoneSpec_;
void* zonePointer_; // Per zoneSpec_, either a Zone, ZoneGroup, or null.
bool disableNursery_;
bool invisibleToDebugger_;
bool mergeable_;
bool preserveJitCode_;

View File

@ -1174,8 +1174,8 @@ JSContext::JSContext(JSRuntime* runtime, const JS::ContextOptions& options)
for (size_t i = 0; i < mozilla::ArrayLength(nativeStackQuota); i++)
nativeStackQuota[i] = 0;
if (!TlsContext.get())
TlsContext.set(this);
MOZ_ASSERT(!TlsContext.get());
TlsContext.set(this);
}
JSContext::~JSContext()
@ -1205,8 +1205,8 @@ JSContext::~JSContext()
DestroyTraceLogger(traceLogger);
#endif
if (TlsContext.get() == this)
TlsContext.set(nullptr);
MOZ_ASSERT(TlsContext.get() == this);
TlsContext.set(nullptr);
}
void

View File

@ -1154,7 +1154,7 @@ class MOZ_RAII AutoLockForExclusiveAccess
void init(JSRuntime* rt) {
runtime = rt;
if (runtime->numExclusiveThreads) {
if (runtime->hasHelperThreadZones()) {
runtime->exclusiveAccessLock.lock();
} else {
MOZ_ASSERT(!runtime->activeThreadHasExclusiveAccess);
@ -1174,7 +1174,7 @@ class MOZ_RAII AutoLockForExclusiveAccess
init(rt);
}
~AutoLockForExclusiveAccess() {
if (runtime->numExclusiveThreads) {
if (runtime->hasHelperThreadZones()) {
runtime->exclusiveAccessLock.unlock();
} else {
MOZ_ASSERT(runtime->activeThreadHasExclusiveAccess);

View File

@ -443,7 +443,7 @@ JSContext::enterCompartment(
{
enterCompartmentDepth_++;
if (!c->zone()->isAtomsZone() && !c->zone()->usedByExclusiveThread)
if (!c->zone()->isAtomsZone())
enterZoneGroup(c->zone()->group());
c->enter();
@ -479,7 +479,7 @@ JSContext::leaveCompartment(
setCompartment(oldCompartment, maybeLock);
if (startingCompartment) {
startingCompartment->leave();
if (!startingCompartment->zone()->isAtomsZone() && !startingCompartment->zone()->usedByExclusiveThread)
if (!startingCompartment->zone()->isAtomsZone())
leaveZoneGroup(startingCompartment->zone()->group());
}
}
@ -488,14 +488,6 @@ inline void
JSContext::setCompartment(JSCompartment* comp,
const js::AutoLockForExclusiveAccess* maybeLock /* = nullptr */)
{
// Contexts operating on helper threads can only be in the atoms zone or in exclusive zones.
MOZ_ASSERT_IF(helperThread() && !runtime_->isAtomsCompartment(comp),
comp->zone()->usedByExclusiveThread);
// Normal JSContexts cannot enter exclusive zones.
MOZ_ASSERT_IF(this == runtime()->activeContext() && comp,
!comp->zone()->usedByExclusiveThread);
// Only one thread can be in the atoms compartment at a time.
MOZ_ASSERT_IF(runtime_->isAtomsCompartment(comp), maybeLock != nullptr);
MOZ_ASSERT_IF(runtime_->isAtomsCompartment(comp) || runtime_->isAtomsCompartment(compartment_),
@ -510,9 +502,8 @@ JSContext::setCompartment(JSCompartment* comp,
MOZ_ASSERT_IF(compartment_, compartment_->hasBeenEntered());
MOZ_ASSERT_IF(comp, comp->hasBeenEntered());
// This context must have exclusive access to the zone's group. There is an
// exception, for now, for zones used by exclusive threads.
MOZ_ASSERT_IF(comp && !comp->zone()->isAtomsZone() && !comp->zone()->usedByExclusiveThread,
// This context must have exclusive access to the zone's group.
MOZ_ASSERT_IF(comp && !comp->zone()->isAtomsZone(),
comp->zone()->group()->ownedByCurrentThread());
compartment_ = comp;

View File

@ -116,6 +116,7 @@ JSCompartment::wrap(JSContext* cx, JS::MutableHandleValue vp)
* that we get the same answer.
*/
#ifdef DEBUG
MOZ_ASSERT(!JS::ObjectIsMarkedGray(&vp.toObject()));
JS::RootedObject cacheResult(cx);
#endif
JS::RootedValue v(cx, vp);

View File

@ -3031,9 +3031,9 @@ GCRuntime::maybeAllocTriggerZoneGC(Zone* zone, const AutoLockGC& lock)
bool
GCRuntime::triggerZoneGC(Zone* zone, JS::gcreason::Reason reason)
{
/* Zones in use by a thread with an exclusive context can't be collected. */
/* Zones in use by a helper thread can't be collected. */
if (!CurrentThreadCanAccessRuntime(rt)) {
MOZ_ASSERT(zone->usedByExclusiveThread || zone->isAtomsZone());
MOZ_ASSERT(zone->usedByHelperThread() || zone->isAtomsZone());
return false;
}
@ -3050,7 +3050,7 @@ GCRuntime::triggerZoneGC(Zone* zone, JS::gcreason::Reason reason)
if (zone->isAtomsZone()) {
/* We can't do a zone GC of the atoms compartment. */
if (TlsContext.get()->keepAtoms || rt->exclusiveThreadsPresent()) {
if (TlsContext.get()->keepAtoms || rt->hasHelperThreadZones()) {
/* Skip GC and retrigger later, since atoms zone won't be collected
* if keepAtoms is true. */
fullGCForAtomsRequested_ = true;
@ -3492,14 +3492,6 @@ Zone::sweepCompartments(FreeOp* fop, bool keepAtleastOne, bool destroyingRuntime
void
GCRuntime::sweepZones(FreeOp* fop, ZoneGroup* group, bool destroyingRuntime)
{
MOZ_ASSERT_IF(destroyingRuntime, numActiveZoneIters == 0);
MOZ_ASSERT_IF(destroyingRuntime, arenasEmptyAtShutdown);
if (rt->gc.numActiveZoneIters)
return;
assertBackgroundSweepingFinished();
JSZoneCallback callback = rt->destroyZoneCallback;
Zone** read = group->zones().begin();
@ -3547,6 +3539,14 @@ GCRuntime::sweepZones(FreeOp* fop, ZoneGroup* group, bool destroyingRuntime)
void
GCRuntime::sweepZoneGroups(FreeOp* fop, bool destroyingRuntime)
{
MOZ_ASSERT_IF(destroyingRuntime, numActiveZoneIters == 0);
MOZ_ASSERT_IF(destroyingRuntime, arenasEmptyAtShutdown);
if (rt->gc.numActiveZoneIters)
return;
assertBackgroundSweepingFinished();
ZoneGroup** read = groups.ref().begin();
ZoneGroup** end = groups.ref().end();
ZoneGroup** write = read;
@ -3853,7 +3853,7 @@ GCRuntime::beginMarkPhase(JS::gcreason::Reason reason, AutoLockForExclusiveAcces
* the other collected zones are using are marked, and we can update the
* set of atoms in use by the other collected zones at the end of the GC.
*/
if (!TlsContext.get()->keepAtoms || rt->exclusiveThreadsPresent()) {
if (!TlsContext.get()->keepAtoms || rt->hasHelperThreadZones()) {
Zone* atomsZone = rt->atomsCompartment(lock)->zone();
if (atomsZone->isGCScheduled()) {
MOZ_ASSERT(!atomsZone->isCollecting());
@ -6290,7 +6290,7 @@ GCRuntime::gcCycle(bool nonincrementalByAPI, SliceBudget& budget, JS::gcreason::
// We don't allow off-thread parsing to start while we're doing an
// incremental GC.
MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->exclusiveThreadsPresent());
MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->hasHelperThreadZones());
auto result = budgetIncrementalGC(nonincrementalByAPI, reason, budget, session.lock);
@ -6683,7 +6683,7 @@ ZoneGroup::minorGC(JS::gcreason::Reason reason, gcstats::Phase phase)
{
AutoLockGC lock(runtime);
for (ZonesIter zone(runtime, WithAtoms); !zone.done(); zone.next())
for (ZonesInGroupIter zone(this); !zone.done(); zone.next())
runtime->gc.maybeAllocTriggerZoneGC(zone, lock);
}
}
@ -6790,7 +6790,10 @@ js::NewCompartment(JSContext* cx, JSPrincipals* principals,
break;
}
if (!group) {
if (group) {
// Take over ownership of the group while we create the compartment/zone.
group->enter();
} else {
MOZ_ASSERT(!zone);
group = cx->new_<ZoneGroup>(rt);
if (!group)
@ -6798,7 +6801,11 @@ js::NewCompartment(JSContext* cx, JSPrincipals* principals,
groupHolder.reset(group);
if (!group->init(rt->gc.tunables.gcMaxNurseryBytes())) {
size_t nurseryBytes =
options.creationOptions().disableNursery()
? 0
: rt->gc.tunables.gcMaxNurseryBytes();
if (!group->init(nurseryBytes)) {
ReportOutOfMemory(cx);
return nullptr;
}
@ -6865,6 +6872,7 @@ js::NewCompartment(JSContext* cx, JSPrincipals* principals,
zoneHolder.forget();
groupHolder.forget();
group->leave();
return compartment.forget();
}
@ -7823,16 +7831,23 @@ js::gc::detail::CellIsMarkedGrayIfKnown(const Cell* cell)
if (!cell->isTenured())
return false;
// We ignore the gray marking state of cells and return false in two cases:
// We ignore the gray marking state of cells and return false in the
// following cases:
//
// 1) When OOM has caused us to clear the gcGrayBitsValid_ flag.
//
// 2) When we are in an incremental GC and examine a cell that is in a zone
// that is not being collected. Gray targets of CCWs that are marked black
// by a barrier will eventually be marked black in the next GC slice.
//
// 3) When we are not on the runtime's active thread. Helper threads might
// call this while parsing, and they are not allowed to inspect the
// runtime's incremental state. The objects being operated on are not able
// to be collected and will not be marked any color.
auto tc = &cell->asTenured();
auto rt = tc->runtimeFromActiveCooperatingThread();
if (!rt->gc.areGrayBitsValid() ||
auto rt = tc->runtimeFromAnyThread();
if (!CurrentThreadCanAccessRuntime(rt) ||
!rt->gc.areGrayBitsValid() ||
(rt->gc.isIncrementalGCInProgress() && !tc->zone()->wasGCStarted()))
{
return false;

View File

@ -13,7 +13,7 @@
namespace js {
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
/* static */ mozilla::Atomic<size_t> AutoNoteSingleThreadedRegion::count(0);
@ -47,7 +47,7 @@ CheckActiveThread<Helper>::check() const
return;
JSContext* cx = TlsContext.get();
MOZ_ASSERT(cx == cx->runtime()->activeContext());
MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime()));
#endif // XP_WIN
}
@ -63,10 +63,22 @@ CheckZoneGroup<Helper>::check() const
return;
if (group) {
// This check is disabled for now because helper thread parse tasks
// access data in the same zone group that the single active thread is
// using. This will be fixed soon (bug 1323066).
//MOZ_ASSERT(group->context && group->context == TlsContext.get());
if (group->usedByHelperThread) {
MOZ_ASSERT(group->ownedByCurrentThread());
} else {
// This check is disabled on windows for the same reason as in
// CheckActiveThread.
#ifndef XP_WIN
// In a cooperatively scheduled runtime the active thread is
// permitted access to all zone groups --- even those it has not
// entered --- for GC and similar purposes. Since all other
// cooperative threads are suspended, these accesses are threadsafe
// if the zone group is not in use by a helper thread which is not
// cooperatively scheduled.
JSContext* cx = TlsContext.get();
MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime()));
#endif
}
} else {
// |group| will be null for data in the atoms zone. This is protected
// by the exclusive access lock.
@ -104,6 +116,6 @@ template class CheckGlobalLock<GlobalLock::ExclusiveAccessLock, AllowedHelperThr
template class CheckGlobalLock<GlobalLock::ExclusiveAccessLock, AllowedHelperThread::GCTask>;
template class CheckGlobalLock<GlobalLock::HelperThreadLock, AllowedHelperThread::None>;
#endif // DEBUG
#endif // JS_HAS_PROTECTED_DATA_CHECKS
} // namespace js

View File

@ -23,11 +23,12 @@ namespace js {
// associated with the data, consider using the ExclusiveData class instead.
// Otherwise, ProtectedData should be used to document whatever synchronization
// method is used.
//
// Note that several of the checks below are currently disabled
// (e.g. ThreadLocalData, ZoneGroupData). These will be fixed soon (bug 1323066),
// but for now this class is largely documenting how we would like data to be
// protected, rather than how it actually is protected.
// Protected data checks are enabled in debug builds, except on android where
// they cause some permatimeouts in automation.
#if defined(DEBUG) && !defined(ANDROID)
#define JS_HAS_PROTECTED_DATA_CHECKS
#endif
#define DECLARE_ONE_BOOL_OPERATOR(OP, T) \
template <typename U> \
@ -50,7 +51,7 @@ namespace js {
class MOZ_RAII AutoNoteSingleThreadedRegion
{
public:
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
static mozilla::Atomic<size_t> count;
AutoNoteSingleThreadedRegion() { count++; }
~AutoNoteSingleThreadedRegion() { count--; }
@ -70,7 +71,7 @@ class ProtectedData
template <typename... Args>
explicit ProtectedData(const Check& check, Args&&... args)
: value(mozilla::Forward<Args>(args)...)
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
, check(check)
#endif
{}
@ -95,7 +96,7 @@ class ProtectedData
T operator --(int) { return ref()--; }
T& ref() {
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
if (!AutoNoteSingleThreadedRegion::count)
check.check();
#endif
@ -103,7 +104,7 @@ class ProtectedData
}
const T& ref() const {
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
if (!AutoNoteSingleThreadedRegion::count)
check.check();
#endif
@ -115,7 +116,7 @@ class ProtectedData
private:
T value;
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
Check check;
#endif
};
@ -156,7 +157,7 @@ class ProtectedDataZoneGroupArg : public ProtectedData<Check, T>
class CheckUnprotected
{
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
public:
inline void check() const {}
#endif
@ -170,7 +171,7 @@ using UnprotectedData = ProtectedDataNoCheckArgs<CheckUnprotected, T>;
class CheckThreadLocal
{
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
Thread::Id id;
public:
@ -179,10 +180,7 @@ class CheckThreadLocal
{}
inline void check() const {
// This check is currently disabled because JSContexts used for off
// thread parsing are created on different threads than where they run.
// This will be fixed soon (bug 1323066).
//MOZ_ASSERT(id == ThisThread::GetId());
MOZ_ASSERT(id == ThisThread::GetId());
}
#endif
};
@ -226,7 +224,7 @@ using ActiveThreadOrIonCompileData =
template <AllowedHelperThread Helper>
class CheckZoneGroup
{
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
ZoneGroup* group;
public:
@ -239,7 +237,8 @@ class CheckZoneGroup
};
// Data which may only be accessed by threads with exclusive access to the
// associated zone group.
// associated zone group, or by the runtime's cooperatively scheduled
// active thread for zone groups which are not in use by a helper thread.
template <typename T>
using ZoneGroupData =
ProtectedDataZoneGroupArg<CheckZoneGroup<AllowedHelperThread::None>, T>;
@ -267,7 +266,7 @@ enum class GlobalLock
template <GlobalLock Lock, AllowedHelperThread Helper>
class CheckGlobalLock
{
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
public:
void check() const;
#endif
@ -310,7 +309,7 @@ class ProtectedDataWriteOnce
template <typename... Args>
explicit ProtectedDataWriteOnce(Args&&... args)
: value(mozilla::Forward<Args>(args)...)
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
, nwrites(0)
#endif
{}
@ -330,7 +329,7 @@ class ProtectedDataWriteOnce
const T& ref() const { return value; }
T& writeRef() {
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
if (!AutoNoteSingleThreadedRegion::count)
check.check();
// Despite the WriteOnce name, actually allow two writes to accommodate
@ -342,7 +341,7 @@ class ProtectedDataWriteOnce
private:
T value;
#ifdef DEBUG
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
Check check;
size_t nwrites;
#endif

View File

@ -1487,8 +1487,10 @@ ArrayBufferViewObject::trace(JSTracer* trc, JSObject* objArg)
// We can't use a direct forwarding pointer here, as there might
// not be enough bytes available, and other views might have data
// pointers whose forwarding pointers would overlap this one.
Nursery& nursery = obj->zoneFromAnyThread()->group()->nursery();
nursery.maybeSetForwardingPointer(trc, srcData, dstData, /* direct = */ false);
if (trc->isTenuringTracer()) {
Nursery& nursery = obj->zoneFromAnyThread()->group()->nursery();
nursery.maybeSetForwardingPointer(trc, srcData, dstData, /* direct = */ false);
}
} else {
MOZ_ASSERT_IF(buf.dataPointer() == nullptr, offset == 0);

View File

@ -290,27 +290,27 @@ static const JSClass parseTaskGlobalClass = {
&parseTaskGlobalClassOps
};
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, const char16_t* chars, size_t length,
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
: kind(kind), cx(cx), options(initCx), chars(chars), length(length),
: kind(kind), options(cx), chars(chars), length(length),
alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
exclusiveContextGlobal(exclusiveContextGlobal),
parseGlobal(parseGlobal),
callback(callback), callbackData(callbackData),
script(nullptr), sourceObject(nullptr),
errors(cx), overRecursed(false), outOfMemory(false)
overRecursed(false), outOfMemory(false)
{
}
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
JS::TranscodeBuffer& buffer, size_t cursor,
JS::OffThreadCompileCallback callback, void* callbackData)
: kind(kind), cx(cx), options(initCx), buffer(&buffer), cursor(cursor),
: kind(kind), options(cx), buffer(&buffer), cursor(cursor),
alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
exclusiveContextGlobal(exclusiveContextGlobal),
parseGlobal(parseGlobal),
callback(callback), callbackData(callbackData),
script(nullptr), sourceObject(nullptr),
errors(cx), overRecursed(false), outOfMemory(false)
overRecursed(false), outOfMemory(false)
{
}
@ -326,8 +326,7 @@ ParseTask::init(JSContext* cx, const ReadOnlyCompileOptions& options)
void
ParseTask::activate(JSRuntime* rt)
{
rt->setUsedByExclusiveThread(exclusiveContextGlobal->zone());
cx->enterCompartmentOf(exclusiveContextGlobal);
rt->setUsedByHelperThread(parseGlobal->zone());
}
bool
@ -344,9 +343,6 @@ ParseTask::finish(JSContext* cx)
ParseTask::~ParseTask()
{
// ParseTask takes over ownership of its input exclusive context.
js_delete(cx);
for (size_t i = 0; i < errors.length(); i++)
js_delete(errors[i]);
}
@ -354,26 +350,26 @@ ParseTask::~ParseTask()
void
ParseTask::trace(JSTracer* trc)
{
if (!cx->runtimeMatches(trc->runtime()))
if (parseGlobal->runtimeFromAnyThread() != trc->runtime())
return;
TraceManuallyBarrieredEdge(trc, &exclusiveContextGlobal, "ParseTask::exclusiveContextGlobal");
TraceManuallyBarrieredEdge(trc, &parseGlobal, "ParseTask::parseGlobal");
if (script)
TraceManuallyBarrieredEdge(trc, &script, "ParseTask::script");
if (sourceObject)
TraceManuallyBarrieredEdge(trc, &sourceObject, "ParseTask::sourceObject");
}
ScriptParseTask::ScriptParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, const char16_t* chars, size_t length,
ScriptParseTask::ScriptParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
: ParseTask(ParseTaskKind::Script, cx, exclusiveContextGlobal, initCx, chars, length, callback,
: ParseTask(ParseTaskKind::Script, cx, parseGlobal, chars, length, callback,
callbackData)
{
}
void
ScriptParseTask::parse()
ScriptParseTask::parse(JSContext* cx)
{
SourceBufferHolder srcBuf(chars, length, SourceBufferHolder::NoOwnership);
script = frontend::CompileGlobalScript(cx, alloc, ScopeKind::Global,
@ -382,16 +378,16 @@ ScriptParseTask::parse()
/* sourceObjectOut = */ &sourceObject);
}
ModuleParseTask::ModuleParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, const char16_t* chars, size_t length,
ModuleParseTask::ModuleParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
: ParseTask(ParseTaskKind::Module, cx, exclusiveContextGlobal, initCx, chars, length, callback,
: ParseTask(ParseTaskKind::Module, cx, parseGlobal, chars, length, callback,
callbackData)
{
}
void
ModuleParseTask::parse()
ModuleParseTask::parse(JSContext* cx)
{
SourceBufferHolder srcBuf(chars, length, SourceBufferHolder::NoOwnership);
ModuleObject* module = frontend::CompileModule(cx, options, srcBuf, alloc, &sourceObject);
@ -399,16 +395,16 @@ ModuleParseTask::parse()
script = module->script();
}
ScriptDecodeTask::ScriptDecodeTask(JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
ScriptDecodeTask::ScriptDecodeTask(JSContext* cx, JSObject* parseGlobal,
JS::TranscodeBuffer& buffer, size_t cursor,
JS::OffThreadCompileCallback callback, void* callbackData)
: ParseTask(ParseTaskKind::ScriptDecode, cx, exclusiveContextGlobal, initCx,
: ParseTask(ParseTaskKind::ScriptDecode, cx, parseGlobal,
buffer, cursor, callback, callbackData)
{
}
void
ScriptDecodeTask::parse()
ScriptDecodeTask::parse(JSContext* cx)
{
RootedScript resultScript(cx);
XDROffThreadDecoder decoder(cx, alloc, &options, /* sourceObjectOut = */ &sourceObject,
@ -541,7 +537,8 @@ CreateGlobalForOffThreadParse(JSContext* cx, ParseTaskKind kind, const gc::AutoS
creationOptions.setInvisibleToDebugger(true)
.setMergeable(true)
.setNewZoneInSystemZoneGroup();
.setNewZoneInNewZoneGroup()
.setDisableNursery(true);
// Don't falsely inherit the host's global trace hook.
creationOptions.setTrace(nullptr);
@ -605,17 +602,10 @@ StartOffThreadParseTask(JSContext* cx, const ReadOnlyCompileOptions& options,
if (!global)
return false;
ScopedJSDeletePtr<JSContext> helpercx(
cx->new_<JSContext>(cx->runtime(), cx->options()));
if (!helpercx)
return false;
ScopedJSDeletePtr<ParseTask> task(taskFunctor(helpercx.get(), global));
ScopedJSDeletePtr<ParseTask> task(taskFunctor(global));
if (!task)
return false;
helpercx.forget();
if (!task->init(cx, options) || !QueueOffThreadParseTask(cx, task))
return false;
@ -630,8 +620,8 @@ js::StartOffThreadParseScript(JSContext* cx, const ReadOnlyCompileOptions& optio
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
{
auto functor = [&](JSContext* helpercx, JSObject* global) -> ScriptParseTask* {
return cx->new_<ScriptParseTask>(helpercx, global, cx, chars, length,
auto functor = [&](JSObject* global) -> ScriptParseTask* {
return cx->new_<ScriptParseTask>(cx, global, chars, length,
callback, callbackData);
};
return StartOffThreadParseTask(cx, options, ParseTaskKind::Script, functor);
@ -642,8 +632,8 @@ js::StartOffThreadParseModule(JSContext* cx, const ReadOnlyCompileOptions& optio
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
{
auto functor = [&](JSContext* helpercx, JSObject* global) -> ModuleParseTask* {
return cx->new_<ModuleParseTask>(helpercx, global, cx, chars, length,
auto functor = [&](JSObject* global) -> ModuleParseTask* {
return cx->new_<ModuleParseTask>(cx, global, chars, length,
callback, callbackData);
};
return StartOffThreadParseTask(cx, options, ParseTaskKind::Module, functor);
@ -654,8 +644,8 @@ js::StartOffThreadDecodeScript(JSContext* cx, const ReadOnlyCompileOptions& opti
JS::TranscodeBuffer& buffer, size_t cursor,
JS::OffThreadCompileCallback callback, void* callbackData)
{
auto functor = [&](JSContext* helpercx, JSObject* global) -> ScriptDecodeTask* {
return cx->new_<ScriptDecodeTask>(helpercx, global, cx, buffer, cursor,
auto functor = [&](JSObject* global) -> ScriptDecodeTask* {
return cx->new_<ScriptDecodeTask>(cx, global, buffer, cursor,
callback, callbackData);
};
return StartOffThreadParseTask(cx, options, ParseTaskKind::ScriptDecode, functor);
@ -674,7 +664,7 @@ js::EnqueuePendingParseTasksAfterGC(JSRuntime* rt)
for (size_t i = 0; i < waiting.length(); i++) {
ParseTask* task = waiting[i];
if (task->runtimeMatches(rt) && !task->exclusiveContextGlobal->zone()->wasGCStarted()) {
if (task->runtimeMatches(rt) && !task->parseGlobal->zone()->wasGCStarted()) {
AutoEnterOOMUnsafeRegion oomUnsafe;
if (!newTasks.append(task))
oomUnsafe.crash("EnqueuePendingParseTasksAfterGC");
@ -1241,8 +1231,7 @@ LeaveParseTaskZone(JSRuntime* rt, ParseTask* task)
{
// Mark the zone as no longer in use by an JSContext, and available
// to be collected by the GC.
task->cx->leaveCompartment(task->cx->compartment());
rt->clearUsedByExclusiveThread(task->cx->zone());
rt->clearUsedByHelperThread(task->parseGlobal->zone());
}
ParseTask*
@ -1378,12 +1367,13 @@ GlobalHelperThreadState::mergeParseTaskCompartment(JSContext* cx, ParseTask* par
JS::AutoAssertNoGC nogc(cx);
LeaveParseTaskZone(cx->runtime(), parseTask);
AutoCompartment ac(cx, parseTask->parseGlobal);
{
// Generator functions don't have Function.prototype as prototype but a
// different function object, so the IdentifyStandardPrototype trick
// below won't work. Just special-case it.
GlobalObject* parseGlobal = &parseTask->exclusiveContextGlobal->as<GlobalObject>();
GlobalObject* parseGlobal = &parseTask->parseGlobal->as<GlobalObject>();
JSObject* parseTaskStarGenFunctionProto = parseGlobal->getStarGeneratorFunctionPrototype();
// Module objects don't have standard prototypes either.
@ -1395,7 +1385,8 @@ GlobalHelperThreadState::mergeParseTaskCompartment(JSContext* cx, ParseTask* par
// to the corresponding prototype in the new compartment. This will briefly
// create cross compartment pointers, which will be fixed by the
// MergeCompartments call below.
for (auto group = parseTask->cx->zone()->cellIter<ObjectGroup>(); !group.done(); group.next()) {
Zone* parseZone = parseTask->parseGlobal->zone();
for (auto group = parseZone->cellIter<ObjectGroup>(); !group.done(); group.next()) {
TaggedProto proto(group->proto());
if (!proto.isObject())
continue;
@ -1426,7 +1417,7 @@ GlobalHelperThreadState::mergeParseTaskCompartment(JSContext* cx, ParseTask* par
}
// Move the parsed script and all its contents into the desired compartment.
gc::MergeCompartments(parseTask->cx->compartment(), dest);
gc::MergeCompartments(parseTask->parseGlobal->compartment(), dest);
}
void
@ -1636,20 +1627,16 @@ js::PauseCurrentHelperThread()
HelperThreadState().wait(lock, GlobalHelperThreadState::PAUSE);
}
void
JSContext::setHelperThread(HelperThread* thread)
{
helperThread_ = thread;
}
bool
JSContext::addPendingCompileError(frontend::CompileError** error)
{
UniquePtr<frontend::CompileError> errorPtr(new_<frontend::CompileError>());
if (!errorPtr)
return false;
if (!helperThread()->parseTask()->errors.append(errorPtr.get()))
if (!helperThread()->parseTask()->errors.append(errorPtr.get())) {
ReportOutOfMemory(this);
return false;
}
*error = errorPtr.release();
return true;
}
@ -1677,18 +1664,16 @@ HelperThread::handleParseWorkload(AutoLockHelperThreadState& locked, uintptr_t s
currentTask.emplace(HelperThreadState().parseWorklist(locked).popCopy());
ParseTask* task = parseTask();
task->cx->setHelperThread(this);
for (size_t i = 0; i < ArrayLength(task->cx->nativeStackLimit); i++)
task->cx->nativeStackLimit[i] = stackLimit;
JSContext* oldcx = TlsContext.get();
TlsContext.set(task->cx);
{
AutoUnlockHelperThreadState unlock(locked);
task->parse();
AutoSetContextRuntime ascr(task->parseGlobal->runtimeFromAnyThread());
JSContext* cx = TlsContext.get();
AutoCompartment ac(cx, task->parseGlobal);
task->parse(cx);
}
TlsContext.set(oldcx);
// The callback is invoked while we are still off thread.
task->callback(task, task->callbackData);
@ -1891,6 +1876,12 @@ HelperThread::handleGCHelperWorkload(AutoLockHelperThreadState& locked)
HelperThreadState().notifyAll(GlobalHelperThreadState::CONSUMER, locked);
}
void
JSContext::setHelperThread(HelperThread* thread)
{
helperThread_ = thread;
}
void
HelperThread::threadLoop()
{
@ -1900,6 +1891,7 @@ HelperThread::threadLoop()
AutoLockHelperThreadState lock;
JSContext cx(nullptr, JS::ContextOptions());
cx.setHelperThread(this);
// Compute the thread's stack limit, for over-recursed checks.
uintptr_t stackLimit = GetNativeStackBase();

View File

@ -568,7 +568,6 @@ class MOZ_RAII AutoUnlockHelperThreadState : public UnlockGuard<Mutex>
struct ParseTask
{
ParseTaskKind kind;
JSContext* cx;
OwningCompileOptions options;
// Anonymous union, the only correct interpretation is provided by the
// ParseTaskKind value, or from the virtual parse function.
@ -587,8 +586,8 @@ struct ParseTask
};
LifoAlloc alloc;
// Rooted pointer to the global object used by 'cx'.
JSObject* exclusiveContextGlobal;
// Rooted pointer to the global object to use while parsing.
JSObject* parseGlobal;
// Callback invoked off thread when the parse finishes.
JS::OffThreadCompileCallback callback;
@ -604,24 +603,24 @@ struct ParseTask
// Any errors or warnings produced during compilation. These are reported
// when finishing the script.
Vector<frontend::CompileError*> errors;
Vector<frontend::CompileError*, 0, SystemAllocPolicy> errors;
bool overRecursed;
bool outOfMemory;
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, const char16_t* chars, size_t length,
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData);
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
JS::TranscodeBuffer& buffer, size_t cursor,
JS::OffThreadCompileCallback callback, void* callbackData);
bool init(JSContext* cx, const ReadOnlyCompileOptions& options);
void activate(JSRuntime* rt);
virtual void parse() = 0;
virtual void parse(JSContext* cx) = 0;
bool finish(JSContext* cx);
bool runtimeMatches(JSRuntime* rt) {
return cx->runtimeMatches(rt);
return parseGlobal->runtimeFromAnyThread() == rt;
}
virtual ~ParseTask();
@ -631,26 +630,26 @@ struct ParseTask
struct ScriptParseTask : public ParseTask
{
ScriptParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, const char16_t* chars, size_t length,
ScriptParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData);
void parse() override;
void parse(JSContext* cx) override;
};
struct ModuleParseTask : public ParseTask
{
ModuleParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, const char16_t* chars, size_t length,
ModuleParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData);
void parse() override;
void parse(JSContext* cx) override;
};
struct ScriptDecodeTask : public ParseTask
{
ScriptDecodeTask(JSContext* cx, JSObject* exclusiveContextGlobal,
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
ScriptDecodeTask(JSContext* cx, JSObject* parseGlobal,
JS::TranscodeBuffer& buffer, size_t cursor,
JS::OffThreadCompileCallback callback, void* callbackData);
void parse() override;
void parse(JSContext* cx) override;
};
// Return whether, if a new parse task was started, it would need to wait for

View File

@ -483,10 +483,7 @@ NativeObject::growSlotsDontReportOOM(JSContext* cx, NativeObject* obj, uint32_t
static void
FreeSlots(JSContext* cx, HeapSlot* slots)
{
// Note: off thread parse tasks do not have access to GGC nursery allocated things.
if (!cx->helperThread())
return cx->nursery().freeBuffer(slots);
js_free(slots);
return cx->nursery().freeBuffer(slots);
}
void

View File

@ -133,7 +133,7 @@ JSRuntime::JSRuntime(JSRuntime* parentRuntime)
#ifdef DEBUG
activeThreadHasExclusiveAccess(false),
#endif
numExclusiveThreads(0),
numHelperThreadZones(0),
numCompartments(0),
localeCallbacks(nullptr),
defaultLocale(nullptr),
@ -306,7 +306,7 @@ JSRuntime::destroyRuntime()
MOZ_ASSERT(ionLazyLinkListSize_ == 0);
MOZ_ASSERT(ionLazyLinkList().isEmpty());
MOZ_ASSERT(!numExclusiveThreads);
MOZ_ASSERT(!hasHelperThreadZones());
AutoLockForExclusiveAccess lock(this);
/*
@ -752,20 +752,20 @@ JSRuntime::activeGCInAtomsZone()
}
void
JSRuntime::setUsedByExclusiveThread(Zone* zone)
JSRuntime::setUsedByHelperThread(Zone* zone)
{
MOZ_ASSERT(!zone->usedByExclusiveThread);
MOZ_ASSERT(!zone->group()->usedByHelperThread);
MOZ_ASSERT(!zone->wasGCStarted());
zone->usedByExclusiveThread = true;
numExclusiveThreads++;
zone->group()->usedByHelperThread = true;
numHelperThreadZones++;
}
void
JSRuntime::clearUsedByExclusiveThread(Zone* zone)
JSRuntime::clearUsedByHelperThread(Zone* zone)
{
MOZ_ASSERT(zone->usedByExclusiveThread);
zone->usedByExclusiveThread = false;
numExclusiveThreads--;
MOZ_ASSERT(zone->group()->usedByHelperThread);
zone->group()->usedByHelperThread = false;
numHelperThreadZones--;
if (gc.fullGCForAtomsRequested() && !TlsContext.get())
gc.triggerFullGCForAtoms();
}
@ -782,10 +782,8 @@ js::CurrentThreadCanAccessZone(Zone* zone)
if (CurrentThreadCanAccessRuntime(zone->runtime_))
return true;
// Only zones in use by an exclusive thread can be used off thread.
// We don't keep track of which thread owns such zones though, so this check
// is imperfect.
return zone->usedByExclusiveThread;
// Only zones marked for use by a helper thread can be used off thread.
return zone->usedByHelperThread() && zone->group()->ownedByCurrentThread();
}
#ifdef DEBUG

View File

@ -571,22 +571,22 @@ struct JSRuntime : public js::MallocProvider<JSRuntime>
bool activeThreadHasExclusiveAccess;
#endif
/* Number of non-cooperating threads with exclusive access to some zone. */
js::UnprotectedData<size_t> numExclusiveThreads;
/* Number of zones which may be operated on by non-cooperating helper threads. */
js::UnprotectedData<size_t> numHelperThreadZones;
friend class js::AutoLockForExclusiveAccess;
public:
void setUsedByExclusiveThread(JS::Zone* zone);
void clearUsedByExclusiveThread(JS::Zone* zone);
void setUsedByHelperThread(JS::Zone* zone);
void clearUsedByHelperThread(JS::Zone* zone);
bool exclusiveThreadsPresent() const {
return numExclusiveThreads > 0;
bool hasHelperThreadZones() const {
return numHelperThreadZones > 0;
}
#ifdef DEBUG
bool currentThreadHasExclusiveAccess() const {
return (!exclusiveThreadsPresent() && activeThreadHasExclusiveAccess) ||
return (!hasHelperThreadZones() && activeThreadHasExclusiveAccess) ||
exclusiveAccessLock.ownedByCurrentThread();
}
#endif

View File

@ -335,414 +335,6 @@ nsParser::GetContentSink()
return mSink;
}
/**
* Determine what DTD mode (and thus what layout nsCompatibility mode)
* to use for this document based on the first chunk of data received
* from the network (each parsercontext can have its own mode). (No,
* this is not an optimal solution -- we really don't need to know until
* after we've received the DOCTYPE, and this could easily be part of
* the regular parsing process if the parser were designed in a way that
* made such modifications easy.)
*/
// Parse the PS production in the SGML spec (excluding the part dealing
// with entity references) starting at theIndex into theBuffer, and
// return the first index after the end of the production.
static int32_t
ParsePS(const nsString& aBuffer, int32_t aIndex)
{
for (;;) {
char16_t ch = aBuffer.CharAt(aIndex);
if ((ch == char16_t(' ')) || (ch == char16_t('\t')) ||
(ch == char16_t('\n')) || (ch == char16_t('\r'))) {
++aIndex;
} else if (ch == char16_t('-')) {
int32_t tmpIndex;
if (aBuffer.CharAt(aIndex+1) == char16_t('-') &&
kNotFound != (tmpIndex=aBuffer.Find("--",false,aIndex+2,-1))) {
aIndex = tmpIndex + 2;
} else {
return aIndex;
}
} else {
return aIndex;
}
}
}
#define PARSE_DTD_HAVE_DOCTYPE (1<<0)
#define PARSE_DTD_HAVE_PUBLIC_ID (1<<1)
#define PARSE_DTD_HAVE_SYSTEM_ID (1<<2)
#define PARSE_DTD_HAVE_INTERNAL_SUBSET (1<<3)
// return true on success (includes not present), false on failure
static bool
ParseDocTypeDecl(const nsString &aBuffer,
int32_t *aResultFlags,
nsString &aPublicID,
nsString &aSystemID)
{
bool haveDoctype = false;
*aResultFlags = 0;
// Skip through any comments and processing instructions
// The PI-skipping is a bit of a hack.
int32_t theIndex = 0;
do {
theIndex = aBuffer.FindChar('<', theIndex);
if (theIndex == kNotFound) break;
char16_t nextChar = aBuffer.CharAt(theIndex+1);
if (nextChar == char16_t('!')) {
int32_t tmpIndex = theIndex + 2;
if (kNotFound !=
(theIndex=aBuffer.Find("DOCTYPE", true, tmpIndex, 0))) {
haveDoctype = true;
theIndex += 7; // skip "DOCTYPE"
break;
}
theIndex = ParsePS(aBuffer, tmpIndex);
theIndex = aBuffer.FindChar('>', theIndex);
} else if (nextChar == char16_t('?')) {
theIndex = aBuffer.FindChar('>', theIndex);
} else {
break;
}
} while (theIndex != kNotFound);
if (!haveDoctype)
return true;
*aResultFlags |= PARSE_DTD_HAVE_DOCTYPE;
theIndex = ParsePS(aBuffer, theIndex);
theIndex = aBuffer.Find("HTML", true, theIndex, 0);
if (kNotFound == theIndex)
return false;
theIndex = ParsePS(aBuffer, theIndex+4);
int32_t tmpIndex = aBuffer.Find("PUBLIC", true, theIndex, 0);
if (kNotFound != tmpIndex) {
theIndex = ParsePS(aBuffer, tmpIndex+6);
// We get here only if we've read <!DOCTYPE HTML PUBLIC
// (not case sensitive) possibly with comments within.
// Now find the beginning and end of the public identifier
// and the system identifier (if present).
char16_t lit = aBuffer.CharAt(theIndex);
if ((lit != char16_t('\"')) && (lit != char16_t('\'')))
return false;
// Start is the first character, excluding the quote, and End is
// the final quote, so there are (end-start) characters.
int32_t PublicIDStart = theIndex + 1;
int32_t PublicIDEnd = aBuffer.FindChar(lit, PublicIDStart);
if (kNotFound == PublicIDEnd)
return false;
theIndex = ParsePS(aBuffer, PublicIDEnd + 1);
char16_t next = aBuffer.CharAt(theIndex);
if (next == char16_t('>')) {
// There was a public identifier, but no system
// identifier,
// so do nothing.
// This is needed to avoid the else at the end, and it's
// also the most common case.
} else if ((next == char16_t('\"')) ||
(next == char16_t('\''))) {
// We found a system identifier.
*aResultFlags |= PARSE_DTD_HAVE_SYSTEM_ID;
int32_t SystemIDStart = theIndex + 1;
int32_t SystemIDEnd = aBuffer.FindChar(next, SystemIDStart);
if (kNotFound == SystemIDEnd)
return false;
aSystemID =
Substring(aBuffer, SystemIDStart, SystemIDEnd - SystemIDStart);
} else if (next == char16_t('[')) {
// We found an internal subset.
*aResultFlags |= PARSE_DTD_HAVE_INTERNAL_SUBSET;
} else {
// Something's wrong.
return false;
}
// Since a public ID is a minimum literal, we must trim
// and collapse whitespace
aPublicID = Substring(aBuffer, PublicIDStart, PublicIDEnd - PublicIDStart);
aPublicID.CompressWhitespace(true, true);
*aResultFlags |= PARSE_DTD_HAVE_PUBLIC_ID;
} else {
tmpIndex=aBuffer.Find("SYSTEM", true, theIndex, 0);
if (kNotFound != tmpIndex) {
// DOCTYPES with system ID but no Public ID
*aResultFlags |= PARSE_DTD_HAVE_SYSTEM_ID;
theIndex = ParsePS(aBuffer, tmpIndex+6);
char16_t next = aBuffer.CharAt(theIndex);
if (next != char16_t('\"') && next != char16_t('\''))
return false;
int32_t SystemIDStart = theIndex + 1;
int32_t SystemIDEnd = aBuffer.FindChar(next, SystemIDStart);
if (kNotFound == SystemIDEnd)
return false;
aSystemID =
Substring(aBuffer, SystemIDStart, SystemIDEnd - SystemIDStart);
theIndex = ParsePS(aBuffer, SystemIDEnd + 1);
}
char16_t nextChar = aBuffer.CharAt(theIndex);
if (nextChar == char16_t('['))
*aResultFlags |= PARSE_DTD_HAVE_INTERNAL_SUBSET;
else if (nextChar != char16_t('>'))
return false;
}
return true;
}
struct PubIDInfo
{
enum eMode {
eQuirks, /* always quirks mode, unless there's an internal subset */
eAlmostStandards,/* eCompatibility_AlmostStandards */
eFullStandards /* eCompatibility_FullStandards */
/*
* public IDs that should trigger strict mode are not listed
* since we want all future public IDs to trigger strict mode as
* well
*/
};
const char* name;
eMode mode_if_no_sysid;
eMode mode_if_sysid;
};
#define ELEMENTS_OF(array_) (sizeof(array_)/sizeof(array_[0]))
// These must be in nsCRT::strcmp order so binary-search can be used.
// This is verified, |#ifdef DEBUG|, below.
// Even though public identifiers should be case sensitive, we will do
// all comparisons after converting to lower case in order to do
// case-insensitive comparison since there are a number of existing web
// sites that use the incorrect case. Therefore all of the public
// identifiers below are in lower case (with the correct case following,
// in comments). The case is verified, |#ifdef DEBUG|, below.
static const PubIDInfo kPublicIDs[] = {
{"+//silmaril//dtd html pro v0r11 19970101//en" /* "+//Silmaril//dtd html Pro v0r11 19970101//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//advasoft ltd//dtd html 3.0 aswedit + extensions//en" /* "-//AdvaSoft Ltd//DTD HTML 3.0 asWedit + extensions//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//as//dtd html 3.0 aswedit + extensions//en" /* "-//AS//DTD HTML 3.0 asWedit + extensions//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 2.0 level 1//en" /* "-//IETF//DTD HTML 2.0 Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 2.0 level 2//en" /* "-//IETF//DTD HTML 2.0 Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 2.0 strict level 1//en" /* "-//IETF//DTD HTML 2.0 Strict Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 2.0 strict level 2//en" /* "-//IETF//DTD HTML 2.0 Strict Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 2.0 strict//en" /* "-//IETF//DTD HTML 2.0 Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 2.0//en" /* "-//IETF//DTD HTML 2.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 2.1e//en" /* "-//IETF//DTD HTML 2.1E//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 3.0//en" /* "-//IETF//DTD HTML 3.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 3.0//en//" /* "-//IETF//DTD HTML 3.0//EN//" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 3.2 final//en" /* "-//IETF//DTD HTML 3.2 Final//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 3.2//en" /* "-//IETF//DTD HTML 3.2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html 3//en" /* "-//IETF//DTD HTML 3//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 0//en" /* "-//IETF//DTD HTML Level 0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 0//en//2.0" /* "-//IETF//DTD HTML Level 0//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 1//en" /* "-//IETF//DTD HTML Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 1//en//2.0" /* "-//IETF//DTD HTML Level 1//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 2//en" /* "-//IETF//DTD HTML Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 2//en//2.0" /* "-//IETF//DTD HTML Level 2//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 3//en" /* "-//IETF//DTD HTML Level 3//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html level 3//en//3.0" /* "-//IETF//DTD HTML Level 3//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 0//en" /* "-//IETF//DTD HTML Strict Level 0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 0//en//2.0" /* "-//IETF//DTD HTML Strict Level 0//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 1//en" /* "-//IETF//DTD HTML Strict Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 1//en//2.0" /* "-//IETF//DTD HTML Strict Level 1//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 2//en" /* "-//IETF//DTD HTML Strict Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 2//en//2.0" /* "-//IETF//DTD HTML Strict Level 2//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 3//en" /* "-//IETF//DTD HTML Strict Level 3//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict level 3//en//3.0" /* "-//IETF//DTD HTML Strict Level 3//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict//en" /* "-//IETF//DTD HTML Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict//en//2.0" /* "-//IETF//DTD HTML Strict//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html strict//en//3.0" /* "-//IETF//DTD HTML Strict//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html//en" /* "-//IETF//DTD HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html//en//2.0" /* "-//IETF//DTD HTML//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//ietf//dtd html//en//3.0" /* "-//IETF//DTD HTML//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//metrius//dtd metrius presentational//en" /* "-//Metrius//DTD Metrius Presentational//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//microsoft//dtd internet explorer 2.0 html strict//en" /* "-//Microsoft//DTD Internet Explorer 2.0 HTML Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//microsoft//dtd internet explorer 2.0 html//en" /* "-//Microsoft//DTD Internet Explorer 2.0 HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//microsoft//dtd internet explorer 2.0 tables//en" /* "-//Microsoft//DTD Internet Explorer 2.0 Tables//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//microsoft//dtd internet explorer 3.0 html strict//en" /* "-//Microsoft//DTD Internet Explorer 3.0 HTML Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//microsoft//dtd internet explorer 3.0 html//en" /* "-//Microsoft//DTD Internet Explorer 3.0 HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//microsoft//dtd internet explorer 3.0 tables//en" /* "-//Microsoft//DTD Internet Explorer 3.0 Tables//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//netscape comm. corp.//dtd html//en" /* "-//Netscape Comm. Corp.//DTD HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//netscape comm. corp.//dtd strict html//en" /* "-//Netscape Comm. Corp.//DTD Strict HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//o'reilly and associates//dtd html 2.0//en" /* "-//O'Reilly and Associates//DTD HTML 2.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//o'reilly and associates//dtd html extended 1.0//en" /* "-//O'Reilly and Associates//DTD HTML Extended 1.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//o'reilly and associates//dtd html extended relaxed 1.0//en" /* "-//O'Reilly and Associates//DTD HTML Extended Relaxed 1.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//en" /* "-//SoftQuad Software//DTD HoTMetaL PRO 6.0::19990601::extensions to HTML 4.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//en" /* "-//SoftQuad//DTD HoTMetaL PRO 4.0::19971010::extensions to HTML 4.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//spyglass//dtd html 2.0 extended//en" /* "-//Spyglass//DTD HTML 2.0 Extended//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//sq//dtd html 2.0 hotmetal + extensions//en" /* "-//SQ//DTD HTML 2.0 HoTMetaL + extensions//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//sun microsystems corp.//dtd hotjava html//en" /* "-//Sun Microsystems Corp.//DTD HotJava HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//sun microsystems corp.//dtd hotjava strict html//en" /* "-//Sun Microsystems Corp.//DTD HotJava Strict HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 3 1995-03-24//en" /* "-//W3C//DTD HTML 3 1995-03-24//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 3.2 draft//en" /* "-//W3C//DTD HTML 3.2 Draft//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 3.2 final//en" /* "-//W3C//DTD HTML 3.2 Final//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 3.2//en" /* "-//W3C//DTD HTML 3.2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 3.2s draft//en" /* "-//W3C//DTD HTML 3.2S Draft//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 4.0 frameset//en" /* "-//W3C//DTD HTML 4.0 Frameset//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 4.0 transitional//en" /* "-//W3C//DTD HTML 4.0 Transitional//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html 4.01 frameset//en" /* "-//W3C//DTD HTML 4.01 Frameset//EN" */, PubIDInfo::eQuirks, PubIDInfo::eAlmostStandards},
{"-//w3c//dtd html 4.01 transitional//en" /* "-//W3C//DTD HTML 4.01 Transitional//EN" */, PubIDInfo::eQuirks, PubIDInfo::eAlmostStandards},
{"-//w3c//dtd html experimental 19960712//en" /* "-//W3C//DTD HTML Experimental 19960712//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd html experimental 970421//en" /* "-//W3C//DTD HTML Experimental 970421//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd w3 html//en" /* "-//W3C//DTD W3 HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3c//dtd xhtml 1.0 frameset//en" /* "-//W3C//DTD XHTML 1.0 Frameset//EN" */, PubIDInfo::eAlmostStandards, PubIDInfo::eAlmostStandards},
{"-//w3c//dtd xhtml 1.0 transitional//en" /* "-//W3C//DTD XHTML 1.0 Transitional//EN" */, PubIDInfo::eAlmostStandards, PubIDInfo::eAlmostStandards},
{"-//w3o//dtd w3 html 3.0//en" /* "-//W3O//DTD W3 HTML 3.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3o//dtd w3 html 3.0//en//" /* "-//W3O//DTD W3 HTML 3.0//EN//" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//w3o//dtd w3 html strict 3.0//en//" /* "-//W3O//DTD W3 HTML Strict 3.0//EN//" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//webtechs//dtd mozilla html 2.0//en" /* "-//WebTechs//DTD Mozilla HTML 2.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-//webtechs//dtd mozilla html//en" /* "-//WebTechs//DTD Mozilla HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"-/w3c/dtd html 4.0 transitional/en" /* "-/W3C/DTD HTML 4.0 Transitional/EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
{"html" /* "HTML" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
};
#ifdef DEBUG
static void
VerifyPublicIDs()
{
static bool gVerified = false;
if (!gVerified) {
gVerified = true;
uint32_t i;
for (i = 0; i < ELEMENTS_OF(kPublicIDs) - 1; ++i) {
if (nsCRT::strcmp(kPublicIDs[i].name, kPublicIDs[i+1].name) >= 0) {
NS_NOTREACHED("doctypes out of order");
printf("Doctypes %s and %s out of order.\n",
kPublicIDs[i].name, kPublicIDs[i+1].name);
}
}
for (i = 0; i < ELEMENTS_OF(kPublicIDs); ++i) {
nsAutoCString lcPubID(kPublicIDs[i].name);
ToLowerCase(lcPubID);
if (nsCRT::strcmp(kPublicIDs[i].name, lcPubID.get()) != 0) {
NS_NOTREACHED("doctype not lower case");
printf("Doctype %s not lower case.\n", kPublicIDs[i].name);
}
}
}
}
#endif
namespace {
struct PublicIdComparator
{
const nsAutoCString& mPublicId;
explicit PublicIdComparator(const nsAutoCString& aPublicId)
: mPublicId(aPublicId) {}
int operator()(const PubIDInfo& aInfo) const {
return nsCRT::strcmp(mPublicId.get(), aInfo.name);
}
};
} // namespace
static void
DetermineHTMLParseMode(const nsString& aBuffer,
nsDTDMode& aParseMode,
eParserDocType& aDocType)
{
#ifdef DEBUG
VerifyPublicIDs();
#endif
int32_t resultFlags;
nsAutoString publicIDUCS2, sysIDUCS2;
if (ParseDocTypeDecl(aBuffer, &resultFlags, publicIDUCS2, sysIDUCS2)) {
if (!(resultFlags & PARSE_DTD_HAVE_DOCTYPE)) {
// no DOCTYPE
aParseMode = eDTDMode_quirks;
aDocType = eHTML_Quirks;
} else if ((resultFlags & PARSE_DTD_HAVE_INTERNAL_SUBSET) ||
!(resultFlags & PARSE_DTD_HAVE_PUBLIC_ID)) {
// A doctype with an internal subset is always full_standards.
// A doctype without a public ID is always full_standards.
aDocType = eHTML_Strict;
aParseMode = eDTDMode_full_standards;
// Special hack for IBM's custom DOCTYPE.
if (!(resultFlags & PARSE_DTD_HAVE_INTERNAL_SUBSET) &&
sysIDUCS2.EqualsLiteral(
"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd")) {
aParseMode = eDTDMode_quirks;
aDocType = eHTML_Quirks;
}
} else {
// We have to check our list of public IDs to see what to do.
// Yes, we want UCS2 to ASCII lossy conversion.
nsAutoCString publicID;
publicID.AssignWithConversion(publicIDUCS2);
// See comment above definition of kPublicIDs about case
// sensitivity.
ToLowerCase(publicID);
// Binary search to see if we can find the correct public ID.
size_t index;
bool found = BinarySearchIf(kPublicIDs, 0, ArrayLength(kPublicIDs),
PublicIdComparator(publicID), &index);
if (!found) {
// The DOCTYPE is not in our list, so it must be full_standards.
aParseMode = eDTDMode_full_standards;
aDocType = eHTML_Strict;
return;
}
switch ((resultFlags & PARSE_DTD_HAVE_SYSTEM_ID)
? kPublicIDs[index].mode_if_sysid
: kPublicIDs[index].mode_if_no_sysid)
{
case PubIDInfo::eQuirks:
aParseMode = eDTDMode_quirks;
aDocType = eHTML_Quirks;
break;
case PubIDInfo::eAlmostStandards:
aParseMode = eDTDMode_almost_standards;
aDocType = eHTML_Strict;
break;
case PubIDInfo::eFullStandards:
aParseMode = eDTDMode_full_standards;
aDocType = eHTML_Strict;
break;
default:
NS_NOTREACHED("no other cases!");
}
}
} else {
// badly formed DOCTYPE -> quirks
aParseMode = eDTDMode_quirks;
aDocType = eHTML_Quirks;
}
}
static void
DetermineParseMode(const nsString& aBuffer, nsDTDMode& aParseMode,
eParserDocType& aDocType, const nsACString& aMimeType)
{
if (aMimeType.EqualsLiteral(TEXT_HTML)) {
DetermineHTMLParseMode(aBuffer, aParseMode, aDocType);
} else if (nsContentUtils::IsPlainTextType(aMimeType)) {
aDocType = ePlainText;
aParseMode = eDTDMode_quirks;
} else { // Some form of XML
aDocType = eXML;
aParseMode = eDTDMode_full_standards;
}
}
static nsIDTD*
FindSuitableDTD(CParserContext& aParserContext)
{
@ -849,15 +441,14 @@ nsParser::WillBuildModel(nsString& aFilename)
if (eDTDMode_unknown == mParserContext->mDTDMode ||
eDTDMode_autodetect == mParserContext->mDTDMode) {
char16_t buf[1025];
nsFixedString theBuffer(buf, 1024, 0);
// Grab 1024 characters, starting at the first non-whitespace
// character, to look for the doctype in.
mParserContext->mScanner->Peek(theBuffer, 1024, mParserContext->mScanner->FirstNonWhitespacePosition());
DetermineParseMode(theBuffer, mParserContext->mDTDMode,
mParserContext->mDocType, mParserContext->mMimeType);
}
if (mIsAboutBlank) {
mParserContext->mDTDMode = eDTDMode_quirks;
mParserContext->mDocType = eHTML_Quirks;
} else {
mParserContext->mDTDMode = eDTDMode_full_standards;
mParserContext->mDocType = eXML;
}
} // else XML fragment with nested parser context
NS_ASSERTION(!mDTD || !mParserContext->mPrevContext,
"Clobbering DTD for non-root parser context!");

View File

@ -329,70 +329,6 @@ nsresult nsScanner::GetChar(char16_t& aChar) {
return NS_OK;
}
/**
* peek ahead to consume next char from scanner's internal
* input buffer
*
* @update gess 3/25/98
* @param
* @return
*/
nsresult nsScanner::Peek(char16_t& aChar, uint32_t aOffset) {
aChar = 0;
if (!mSlidingBuffer || mCurrentPosition == mEndPosition) {
return NS_ERROR_HTMLPARSER_EOF;
}
if (aOffset > 0) {
if (mCountRemaining <= aOffset)
return NS_ERROR_HTMLPARSER_EOF;
nsScannerIterator pos = mCurrentPosition;
pos.advance(aOffset);
aChar=*pos;
}
else {
aChar=*mCurrentPosition;
}
return NS_OK;
}
nsresult nsScanner::Peek(nsAString& aStr, int32_t aNumChars, int32_t aOffset)
{
if (!mSlidingBuffer || mCurrentPosition == mEndPosition) {
return NS_ERROR_HTMLPARSER_EOF;
}
nsScannerIterator start, end;
start = mCurrentPosition;
if ((int32_t)mCountRemaining <= aOffset) {
return NS_ERROR_HTMLPARSER_EOF;
}
if (aOffset > 0) {
start.advance(aOffset);
}
if (mCountRemaining < uint32_t(aNumChars + aOffset)) {
end = mEndPosition;
}
else {
end = start;
end.advance(aNumChars);
}
if (!CopyUnicodeTo(start, end, aStr)) {
return NS_ERROR_OUT_OF_MEMORY;
}
return NS_OK;
}
void nsScanner::BindSubstring(nsScannerSubstring& aSubstring, const nsScannerIterator& aStart, const nsScannerIterator& aEnd)
{
aSubstring.Rebind(*mSlidingBuffer, aStart, aEnd);

View File

@ -60,18 +60,6 @@ class nsScanner {
*/
nsresult GetChar(char16_t& ch);
/**
* peek ahead to consume next char from scanner's internal
* input buffer
*
* @update gess 3/25/98
* @param ch is the char to accept new value
* @return error code reflecting read status
*/
nsresult Peek(char16_t& ch, uint32_t aOffset=0);
nsresult Peek(nsAString& aStr, int32_t aNumChars, int32_t aOffset = 0);
/**
* Records current offset position in input stream. This allows us
* to back up to this point if the need should arise, such as when

View File

@ -6,6 +6,7 @@
#include <stdlib.h>
#include "nsScannerString.h"
#include "mozilla/CheckedInt.h"
/**
@ -472,7 +473,13 @@ CopyUnicodeTo( const nsScannerIterator& aSrcStart,
nsAString& aDest )
{
nsAString::iterator writer;
if (!aDest.SetLength(Distance(aSrcStart, aSrcEnd), mozilla::fallible)) {
mozilla::CheckedInt<nsAString::size_type> distance(Distance(aSrcStart, aSrcEnd));
if (!distance.isValid()) {
return false; // overflow detected
}
if (!aDest.SetLength(distance.value(), mozilla::fallible)) {
aDest.Truncate();
return false; // out of memory
}
@ -505,8 +512,14 @@ AppendUnicodeTo( const nsScannerIterator& aSrcStart,
nsAString& aDest )
{
nsAString::iterator writer;
uint32_t oldLength = aDest.Length();
if (!aDest.SetLength(oldLength + Distance(aSrcStart, aSrcEnd), mozilla::fallible))
const nsAString::size_type oldLength = aDest.Length();
CheckedInt<nsAString::size_type> newLen(Distance(aSrcStart, aSrcEnd));
newLen += oldLength;
if (!newLen.isValid()) {
return false; // overflow detected
}
if (!aDest.SetLength(newLen.value(), mozilla::fallible))
return false; // out of memory
aDest.BeginWriting(writer).advance(oldLength);
nsScannerIterator fromBegin(aSrcStart);

View File

@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1;
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1495638976632000);
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1495728091984000);

View File

@ -79,6 +79,7 @@ abeestrada.com: did not receive HSTS header
abilitylist.org: did not receive HSTS header
abioniere.de: could not connect to host
abnarnro.com: could not connect to host
abolitionistsociety.com: could not connect to host
about.ge: could not connect to host
aboutmyip.info: did not receive HSTS header
aboutmyproperty.ca: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
@ -143,6 +144,7 @@ ahmedabadflowermall.com: did not receive HSTS header
ahoynetwork.com: could not connect to host
ahri.ovh: could not connect to host
aidanwoods.com: did not receive HSTS header
airbnb.com: did not receive HSTS header
aircomms.com: did not receive HSTS header
airproto.com: did not receive HSTS header
aishnair.com: could not connect to host
@ -288,6 +290,7 @@ ars-design.net: could not connect to host
ars.toscana.it: max-age too low: 0
artiming.com: could not connect to host
artistnetwork.nl: did not receive HSTS header
artofeyes.nl: did not receive HSTS header
arturkohut.com: could not connect to host
arvamus.eu: could not connect to host
as.se: could not connect to host
@ -361,9 +364,8 @@ axeny.com: did not receive HSTS header
az.search.yahoo.com: did not receive HSTS header
azprep.us: could not connect to host
azuxul.fr: could not connect to host
b303.me: did not receive HSTS header
b3orion.com: max-age too low: 0
baby-click.de: could not connect to host
baby-click.de: did not receive HSTS header
babybic.hu: did not receive HSTS header
babyhouse.xyz: could not connect to host
babysaying.me: could not connect to host
@ -502,7 +504,6 @@ blog-ritaline.com: could not connect to host
blog.cyveillance.com: did not receive HSTS header
blog.lookout.com: did not receive HSTS header
bloglikepro.com: could not connect to host
blogreen.org: could not connect to host
blubbablasen.de: could not connect to host
blucas.org: did not receive HSTS header
blueglobalmedia.com: max-age too low: 0
@ -529,6 +530,7 @@ bonigo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_
bonitabrazilian.co.nz: did not receive HSTS header
bookcelerator.com: did not receive HSTS header
booked.holiday: could not connect to host
bookingapp.nl: did not receive HSTS header
bookourdjs.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
boomerang.com: could not connect to host
boosterlearnpro.com: did not receive HSTS header
@ -574,6 +576,7 @@ budgetthostels.nl: did not receive HSTS header
budskap.eu: could not connect to host
bugs.chromium.org: did not receive HSTS header (error ignored - included regardless)
bugtrack.io: did not receive HSTS header
bugwie.com: did not receive HSTS header
buhler.pro: did not receive HSTS header
buildci.asia: could not connect to host
buildsaver.co.za: did not receive HSTS header
@ -597,9 +600,12 @@ buttercoin.com: could not connect to host
butterfieldstraining.com: did not receive HSTS header
buybaby.eu: did not receive HSTS header
buyfox.de: did not receive HSTS header
bw.codes: could not connect to host
bws16.de: did not receive HSTS header
by4cqb.cn: could not connect to host
bypassed.press: could not connect to host
bypassed.today: did not receive HSTS header
bypassed.works: did not receive HSTS header
bypassed.world: did not receive HSTS header
bypro.xyz: could not connect to host
bysymphony.com: max-age too low: 0
@ -620,6 +626,7 @@ cake.care: could not connect to host
calendarr.com: did not receive HSTS header
calgaryconstructionjobs.com: did not receive HSTS header
calix.com: max-age too low: 0
call.me: did not receive HSTS header
calltrackingreports.com: could not connect to host
calvin.me: max-age too low: 2592000
calvinallen.net: did not receive HSTS header
@ -630,7 +637,6 @@ cancelmyprofile.com: did not receive HSTS header
candicontrols.com: did not receive HSTS header
candratech.com: could not connect to host
candylion.rocks: could not connect to host
canfly.org: did not receive HSTS header
cannyfoxx.me: could not connect to host
canyonshoa.com: did not receive HSTS header
capecycles.co.za: did not receive HSTS header
@ -734,6 +740,7 @@ christianbro.gq: could not connect to host
christophercolumbusfoundation.gov: could not connect to host
christophheich.me: could not connect to host
chrisupjohn.com: could not connect to host
chromaryu.net: could not connect to host
chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
chrome.google.com: did not receive HSTS header (error ignored - included regardless)
chromiumbugs.appspot.com: did not receive HSTS header (error ignored - included regardless)
@ -758,7 +765,6 @@ clara-baumert.de: could not connect to host
classicsandexotics.com: did not receive HSTS header
classicspublishing.com: could not connect to host
clcleaningco.com: could not connect to host
cldly.com: could not connect to host
cleanexperts.co.uk: could not connect to host
cleaningsquad.ca: could not connect to host
cleanmta.com: could not connect to host
@ -780,7 +786,6 @@ cloudcy.net: could not connect to host
clouddesktop.co.nz: could not connect to host
cloudey.net: did not receive HSTS header
cloudflare.com: did not receive HSTS header
cloudily.com: could not connect to host
cloudimag.es: could not connect to host
cloudlink.club: could not connect to host
cloudns.com.au: could not connect to host
@ -814,11 +819,11 @@ codeco.pw: could not connect to host
codeforce.io: could not connect to host
codelayer.ca: could not connect to host
codepoet.de: could not connect to host
codepult.com: could not connect to host
codepx.com: did not receive HSTS header
codereview.appspot.com: did not receive HSTS header (error ignored - included regardless)
codereview.chromium.org: did not receive HSTS header (error ignored - included regardless)
codiva.io: max-age too low: 2592000
codymoniz.com: could not connect to host
coffeeetc.co.uk: did not receive HSTS header
coffeestrategies.com: max-age too low: 2592000
coiffeurschnittstelle.ch: did not receive HSTS header
@ -840,6 +845,7 @@ compalytics.com: could not connect to host
comparejewelleryprices.co.uk: could not connect to host
completeid.com: max-age too low: 86400
completionist.audio: could not connect to host
compraneta.com: could not connect to host
compucorner.com.mx: could not connect to host
concord-group.co.jp: did not receive HSTS header
condesaelectronics.com: max-age too low: 0
@ -854,7 +860,6 @@ contarkos.xyz: could not connect to host
content-api-dev.azurewebsites.net: could not connect to host
continuumgaming.com: could not connect to host
controlcenter.gigahost.dk: did not receive HSTS header
convert.zone: could not connect to host
coolchevy.org.ua: did not receive HSTS header
cor-ser.es: could not connect to host
coralproject.net: did not receive HSTS header
@ -920,7 +925,9 @@ csgoelemental.com: could not connect to host
csgokings.eu: could not connect to host
csohack.tk: could not connect to host
cspbuilder.info: could not connect to host
csru.net: could not connect to host
csvape.com: did not receive HSTS header
ct-status.org: could not connect to host
ct.search.yahoo.com: did not receive HSTS header
cthulhuden.com: could not connect to host
cubeserver.eu: could not connect to host
@ -941,6 +948,7 @@ cycleluxembourg.lu: did not receive HSTS header
cydia-search.io: could not connect to host
cyph.com: did not receive HSTS header
cyphertite.com: could not connect to host
czerno.com: could not connect to host
czlx.co: could not connect to host
dad256.tk: could not connect to host
dadtheimpaler.com: could not connect to host
@ -1009,6 +1017,7 @@ debian-vhost.de: did not receive HSTS header
debiton.dk: could not connect to host
debtkit.co.uk: did not receive HSTS header
decafu.co: could not connect to host
decesus.com: could not connect to host
decibelios.li: could not connect to host
deco.me: could not connect to host
dedicatutiempo.es: could not connect to host
@ -1045,13 +1054,14 @@ designgears.com: did not receive HSTS header
designthinking.or.jp: did not receive HSTS header
despora.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
destinationbijoux.fr: could not connect to host
destom.be: could not connect to host
detector.exposed: could not connect to host
devcu.net: did not receive HSTS header
deviltracks.net: could not connect to host
devincrow.me: could not connect to host
devtub.com: did not receive HSTS header
devuan.org: did not receive HSTS header
dhpcs.com: did not receive HSTS header
dhpiggott.net: did not receive HSTS header
diablotine.rocks: could not connect to host
diarbag.us: did not receive HSTS header
diasp.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
@ -1093,6 +1103,7 @@ docset.io: could not connect to host
docufiel.com: could not connect to host
doeswindowssuckforeveryoneorjustme.com: could not connect to host
dogbox.se: did not receive HSTS header
dogmap.jp: could not connect to host
dohosting.ru: could not connect to host
dokan.online: could not connect to host
dollarstore24.com: could not connect to host
@ -1134,8 +1145,6 @@ drtroyhendrickson.com: could not connect to host
drumbandesperanto.nl: could not connect to host
ds-christiansen.de: did not receive HSTS header
dshiv.io: could not connect to host
dubrovskiy.net: could not connect to host
dubrovskiy.pro: could not connect to host
duesee.org: could not connect to host
dullsir.com: did not receive HSTS header
duria.de: max-age too low: 3600
@ -1150,7 +1159,6 @@ dymersion.com: did not receive HSTS header
dzimejl.sk: did not receive HSTS header
dzlibs.io: could not connect to host
dzndk.org: could not connect to host
dzyabchenko.com: could not connect to host
e-aut.net: did not receive HSTS header
e-deca2.org: did not receive HSTS header
e-sa.com: did not receive HSTS header
@ -1194,7 +1202,6 @@ ehito.ovh: could not connect to host
ehrenamt-skpfcw.de: could not connect to host
eicfood.com: could not connect to host
eidolonhost.com: did not receive HSTS header
eimanavicius.lt: could not connect to host
ekbanden.nl: could not connect to host
elaintehtaat.fi: did not receive HSTS header
elan-organics.com: did not receive HSTS header
@ -1216,10 +1223,11 @@ elnutricionista.es: did not receive HSTS header
eloanpersonal.com: max-age too low: 0
elpo.xyz: could not connect to host
elsamakhin.com: could not connect to host
elsitar.com: did not receive HSTS header
elsitar.com: could not connect to host
email.lookout.com: could not connect to host
emanatepixels.com: could not connect to host
emeldi-commerce.com: max-age too low: 0
emilyhorsman.com: could not connect to host
eminovic.me: could not connect to host
emjainteractive.com: did not receive HSTS header
emjimadhu.com: could not connect to host
@ -1291,7 +1299,7 @@ estoic.net: could not connect to host
et-buchholz.de: could not connect to host
etdonline.co.uk: could not connect to host
eternitylove.us: could not connect to host
ethanfaust.com: could not connect to host
eth9.net: max-age too low: 0
ethicalexploiting.com: could not connect to host
etsysecure.com: could not connect to host
etula.ga: could not connect to host
@ -1307,7 +1315,6 @@ everybooks.com: max-age too low: 60
everything.place: could not connect to host
evin.ml: could not connect to host
evites.me: could not connect to host
evolutionlending.co.uk: could not connect to host
evomon.com: could not connect to host
evossd.tk: could not connect to host
ewuchuan.com: could not connect to host
@ -1349,7 +1356,6 @@ falkp.no: did not receive HSTS header
fallenangelspirits.uk: could not connect to host
familie-sprink.de: could not connect to host
familie-zimmermann.at: could not connect to host
fantopia.club: could not connect to host
fanyl.cn: could not connect to host
farhadexchange.com: did not receive HSTS header
farhood.org: could not connect to host
@ -1402,7 +1408,6 @@ fireorbit.de: did not receive HSTS header
firstdogonthemoon.com.au: did not receive HSTS header
firstforex.co.uk: did not receive HSTS header
fish2.me: did not receive HSTS header
fistu.la: could not connect to host
fit4medien.de: did not receive HSTS header
fitbylo.com: did not receive HSTS header
fitiapp.com: could not connect to host
@ -1427,7 +1432,6 @@ florianlillpopp.de: max-age too low: 10
floridaescapes.co.uk: did not receive HSTS header
flouartistique.ch: could not connect to host
flow.pe: could not connect to host
flow.su: could not connect to host
flowersandclouds.com: could not connect to host
flowlo.me: could not connect to host
flushstudios.com: did not receive HSTS header
@ -1475,7 +1479,6 @@ freesounding.com: could not connect to host
freesounding.ru: could not connect to host
freethought.org.au: could not connect to host
freeutopia.org: did not receive HSTS header
freezion.com: could not connect to host
frenzel.dk: could not connect to host
freqlabs.com: could not connect to host
freshfind.xyz: could not connect to host
@ -1534,6 +1537,7 @@ gamehacks.me: could not connect to host
gameink.net: max-age too low: 0
gamenected.com: could not connect to host
gamenected.de: could not connect to host
gamepader.com: could not connect to host
gameparade.de: could not connect to host
gamepiece.com: could not connect to host
gamerslair.org: did not receive HSTS header
@ -1651,7 +1655,6 @@ googleplex.com: did not receive HSTS header (error ignored - included regardless
goolok.com: could not connect to host
gorilla-gym.site: could not connect to host
goto.google.com: did not receive HSTS header (error ignored - included regardless)
goto.world: did not receive HSTS header
gotowned.org: did not receive HSTS header
gotspot.com: could not connect to host
gottcode.org: did not receive HSTS header
@ -1667,6 +1670,8 @@ granary-demo.appspot.com: did not receive HSTS header
grandmascookieblog.com: did not receive HSTS header
grantedby.me: could not connect to host
graph.no: did not receive HSTS header
graphire.io: could not connect to host
graphsearchengine.com: could not connect to host
gravito.nl: did not receive HSTS header
gravity-net.de: could not connect to host
graycell.net: could not connect to host
@ -1677,7 +1682,7 @@ greenhillantiques.co.uk: did not receive HSTS header
greenvines.com.tw: did not receive HSTS header
greg.red: could not connect to host
gregorytlee.me: did not receive HSTS header
gremots.com: did not receive HSTS header
gremots.com: could not connect to host
greplin.com: could not connect to host
gresb.com: did not receive HSTS header
gribani.com: could not connect to host
@ -1701,7 +1706,6 @@ guilde-vindicta.fr: did not receive HSTS header
gulenet.com: could not connect to host
gunnarhafdal.com: did not receive HSTS header
gurom.lv: could not connect to host
gurueffect.com: did not receive HSTS header
gurusupe.com: could not connect to host
gussi.is: did not receive HSTS header
gvt2.com: could not connect to host (error ignored - included regardless)
@ -1715,7 +1719,6 @@ gyboche.science: could not connect to host
gycis.me: could not connect to host
gypthecat.com: max-age too low: 604800
gyz.io: could not connect to host
gzitech.com: could not connect to host
h2check.org: could not connect to host
haarkliniek.com: did not receive HSTS header
habanaavenue.com: did not receive HSTS header
@ -1726,7 +1729,6 @@ hack.li: did not receive HSTS header
hacker.one: could not connect to host
hackerforever.com: did not receive HSTS header
hackerone-ext-adroll.com: could not connect to host
hackerpoints.com: could not connect to host
hackest.org: did not receive HSTS header
hackit.im: could not connect to host
hadzic.co: could not connect to host
@ -1745,7 +1747,6 @@ hang333.pw: did not receive HSTS header
hansen.hn: could not connect to host
hao2taiwan.com: max-age too low: 0
haoyugao.com: could not connect to host
haozi.me: could not connect to host
hapissl.com: could not connect to host
happyfabric.me: did not receive HSTS header
happygastro.com: could not connect to host
@ -1811,9 +1812,9 @@ hillcity.org.nz: did not receive HSTS header
hilnu.tk: could not connect to host
hipercultura.com: did not receive HSTS header
hiphopconvention.nl: could not connect to host
hirake55.com: could not connect to host
hitoy.org: did not receive HSTS header
hittipps.com: did not receive HSTS header
hjw-kunstwerk.de: could not connect to host
hlyue.com: did not receive HSTS header
hmm.nyc: could not connect to host
hn.search.yahoo.com: did not receive HSTS header
@ -1844,7 +1845,6 @@ hotchoc.io: did not receive HSTS header
houkago-step.com: did not receive HSTS header
housemaadiah.org: did not receive HSTS header
housingstudents.org.uk: could not connect to host
howbigismybuilding.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
howrandom.org: could not connect to host
howtocuremysciatica.com: could not connect to host
hr-intranet.com: did not receive HSTS header
@ -1874,7 +1874,6 @@ hydronium.ga: could not connect to host
hydronium.me: could not connect to host
hydronium.tk: could not connect to host
hyper69.com: did not receive HSTS header
hypnoresults.com.au: did not receive HSTS header
i-jp.net: could not connect to host
i-partners.sk: did not receive HSTS header
iamokay.nl: did not receive HSTS header
@ -1928,7 +1927,6 @@ imakepoems.net: could not connect to host
ime.moe: could not connect to host
imguoguo.com: did not receive HSTS header
imim.pw: did not receive HSTS header
imjiangtao.com: did not receive HSTS header
immersionwealth.com: could not connect to host
immoprotect.ca: did not receive HSTS header
immortals-co.com: did not receive HSTS header
@ -1936,7 +1934,9 @@ immoverkauf24.at: did not receive HSTS header
immoverkauf24.de: did not receive HSTS header
immunicity.info: could not connect to host
immunicity.press: could not connect to host
immunicity.today: did not receive HSTS header
immunicity.top: could not connect to host
immunicity.works: did not receive HSTS header
immunicity.world: did not receive HSTS header
imolug.org: did not receive HSTS header
imouto.my: max-age too low: 5184000
@ -2044,6 +2044,7 @@ izzzorgconcerten.nl: could not connect to host
ja-publications.com: did not receive HSTS header
jabbari.io: did not receive HSTS header
jackalworks.com: could not connect to host
jackyyf.com: could not connect to host
jacobparry.ca: did not receive HSTS header
jagido.de: did not receive HSTS header
jahliveradio.com: could not connect to host
@ -2082,7 +2083,7 @@ jasonsansone.com: [Exception... "Component returned failure code: 0x80004005 (NS
jastoria.pl: could not connect to host
jayblock.com: did not receive HSTS header
jayschulman.com: could not connect to host
jayscoaching.com: could not connect to host
jayscoaching.com: did not receive HSTS header
jayshao.com: did not receive HSTS header
jazzinutrecht.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
jazzncheese.com: could not connect to host
@ -2156,6 +2157,7 @@ junaos.xyz: did not receive HSTS header
junge-selbsthilfe.info: could not connect to host
junqtion.com: could not connect to host
jupp0r.de: did not receive HSTS header
justanothercompany.name: could not connect to host
justlikethat.hosting: did not receive HSTS header
justnaw.co.uk: could not connect to host
justudin.com: did not receive HSTS header
@ -2167,7 +2169,6 @@ jznet.org: max-age too low: 86400
k-dev.de: could not connect to host
ka-clan.com: could not connect to host
kabuabc.com: did not receive HSTS header
kabus.org: could not connect to host
kadioglumakina.com.tr: did not receive HSTS header
kaela.design: could not connect to host
kahopoon.net: could not connect to host
@ -2200,6 +2201,7 @@ keeley.gq: could not connect to host
keeley.ml: could not connect to host
keeleysam.me: could not connect to host
keepclean.me: could not connect to host
kellyandantony.com: could not connect to host
kenderbeton-magyarorszag.hu: did not receive HSTS header
kenderbetonmagyarorszag.hu: did not receive HSTS header
kenderhaz-magyarorszag.hu: did not receive HSTS header
@ -2276,7 +2278,6 @@ krayx.com: could not connect to host
kreavis.com: did not receive HSTS header
kredite.sale: could not connect to host
kriegt.es: could not connect to host
kristikala.nl: could not connect to host
kristjanrang.eu: did not receive HSTS header
krmela.com: could not connect to host
kroetenfuchs.de: could not connect to host
@ -2313,7 +2314,6 @@ labordata.io: did not receive HSTS header
labrador-retrievers.com.au: did not receive HSTS header
labs.moscow: did not receive HSTS header
lachlankidson.net: did not receive HSTS header
lacicloud.net: could not connect to host
lacledeslan.ninja: could not connect to host
lacocinadelila.com: did not receive HSTS header
ladbroke.net: did not receive HSTS header
@ -2345,7 +2345,7 @@ leadership9.com: could not connect to host
leardev.de: did not receive HSTS header
learnfrenchfluently.com: did not receive HSTS header
learningorder.com: could not connect to host
learntube.cz: could not connect to host
lebal.se: could not connect to host
lechiennoir.net: did not receive HSTS header
ledgerscope.net: could not connect to host
leermotorrijden.nl: max-age too low: 300
@ -2371,6 +2371,7 @@ les-corsaires.net: could not connect to host
lesdouceursdeliyana.com: could not connect to host
lesperlesdunet.fr: could not connect to host
letras.mus.br: did not receive HSTS header
lets.ninja: could not connect to host
letsmultiplayerplay.com: did not receive HSTS header
letustravel.tk: could not connect to host
levelum.com: did not receive HSTS header
@ -2396,14 +2397,12 @@ librechan.net: could not connect to host
libscode.com: could not connect to host
lidl-selection.at: could not connect to host
lidow.eu: could not connect to host
lifebetweenlives.com.au: did not receive HSTS header
lifeguard.aecom.com: did not receive HSTS header
lifeinitsownway.com: did not receive HSTS header
lifeskillsdirect.com: did not receive HSTS header
lifestylehunter.co.uk: did not receive HSTS header
lifetimemoneymachine.com: did not receive HSTS header
lifi.digital: did not receive HSTS header
lifi.is: could not connect to host
lightarmory.com: could not connect to host
lightpaste.com: could not connect to host
lightworx.io: did not receive HSTS header
@ -2516,6 +2515,7 @@ madebymagnitude.com: did not receive HSTS header
maderwin.com: could not connect to host
mae-berlinistanbul.com: could not connect to host
mafamane.com: could not connect to host
maff.scot: did not receive HSTS header
mafiareturns.com: max-age too low: 2592000
magenx.com: did not receive HSTS header
magicbroccoli.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
@ -2542,7 +2542,6 @@ manifestbin.com: did not receive HSTS header
manningbrothers.com: did not receive HSTS header
mannsolutions.co.uk: did not receive HSTS header
mansion-note.com: did not receive HSTS header
manufacturing.gov: could not connect to host
maomaofuli.vip: could not connect to host
marchagen.nl: did not receive HSTS header
marcontrol.com: did not receive HSTS header
@ -2551,11 +2550,11 @@ marcuskoh.com: could not connect to host
mariannematthew.com: could not connect to host
marie-curie.fr: could not connect to host
marie-elisabeth.dk: did not receive HSTS header
marie.club: could not connect to host
mario.party: did not receive HSTS header
markaconnor.com: could not connect to host
markayapilandirma.com: could not connect to host
market.android.com: did not receive HSTS header (error ignored - included regardless)
markprof.ru: could not connect to host
markrego.com: could not connect to host
marktboten.de: did not receive HSTS header
markus-dev.com: did not receive HSTS header
@ -2624,7 +2623,6 @@ mein-gesundheitsmanager.com: did not receive HSTS header
meincenter-meinemeinung.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
meincloudspeicher.de: could not connect to host
meinebo.it: could not connect to host
meizufans.eu: did not receive HSTS header
melted.pw: could not connect to host
members.mayfirst.org: did not receive HSTS header
mensmaximus.de: did not receive HSTS header
@ -2641,6 +2639,7 @@ mesmoque.com: did not receive HSTS header
metagrader.com: could not connect to host
metebalci.com: did not receive HSTS header
meteorapp.space: could not connect to host
meteosherbrooke.com: could not connect to host
meteosky.net: could not connect to host
metin2blog.de: did not receive HSTS header
metis.pw: could not connect to host
@ -2759,7 +2758,6 @@ moy-gorod.od.ua: did not receive HSTS header
moy.cat: did not receive HSTS header
mp3juices.is: could not connect to host
mqas.net: could not connect to host
mremallin.ca: could not connect to host
mrettich.org: did not receive HSTS header
mrnonz.com: max-age too low: 0
mrpopat.in: did not receive HSTS header
@ -2817,7 +2815,6 @@ myphonebox.de: could not connect to host
myraytech.net: did not receive HSTS header
mysecretrewards.com: did not receive HSTS header
mystery-science-theater-3000.de: did not receive HSTS header
mythslegendscollection.com: did not receive HSTS header
myvirtualserver.com: max-age too low: 2592000
myzone.com: did not receive HSTS header
n0psled.nl: could not connect to host
@ -2840,7 +2837,6 @@ nanogeneinc.com: could not connect to host
nanto.eu: could not connect to host
narada.com.ua: could not connect to host
nargileh.nl: could not connect to host
nassi.me: could not connect to host
natalia-fadeeva.ru: could not connect to host
natalia.io: could not connect to host
natalt.org: did not receive HSTS header
@ -2866,7 +2862,7 @@ neilgreen.net: did not receive HSTS header
neko-life.com: did not receive HSTS header
neko-system.com: did not receive HSTS header
nemno.de: could not connect to host
nemovement.org: did not receive HSTS header
nemovement.org: could not connect to host
neonisi.com: could not connect to host
nepustil.net: did not receive HSTS header
netba.net: could not connect to host
@ -3041,6 +3037,7 @@ onlinepollsph.com: could not connect to host
onlinespielothek.com: did not receive HSTS header
onlinewetten.de: could not connect to host
onlyshopstation.com: did not receive HSTS header
onlyzero.net: could not connect to host
ononpay.com: did not receive HSTS header
onpatient.com: did not receive HSTS header
ontras.com: could not connect to host
@ -3082,6 +3079,7 @@ orionfcu.com: did not receive HSTS header
orleika.ml: could not connect to host
orthodoxy.lt: did not receive HSTS header
osaiyuwu.com: could not connect to host
oshell.me: could not connect to host
oslfoundation.org: could not connect to host
oslinux.net: did not receive HSTS header
osp.cx: could not connect to host
@ -3154,7 +3152,6 @@ passwordbox.com: did not receive HSTS header
passwordrevelator.net: did not receive HSTS header
passwords.google.com: did not receive HSTS header (error ignored - included regardless)
pastaf.com: could not connect to host
paste.fedoraproject.org: did not receive HSTS header
paste.linode.com: could not connect to host
pastebin.linode.com: could not connect to host
pastenib.com: could not connect to host
@ -3222,7 +3219,7 @@ pickr.co: could not connect to host
picotronic.biz: could not connect to host
picscare.co.uk: did not receive HSTS header
pieperhome.de: could not connect to host
pijuice.com: could not connect to host
piggott.me.uk: did not receive HSTS header
pilgermaske.org: did not receive HSTS header
piligrimname.com: could not connect to host
pillowandpepper.com: did not receive HSTS header
@ -3252,6 +3249,7 @@ plaettliaktion.ch: did not receive HSTS header
planpharmacy.com: could not connect to host
platform.lookout.com: could not connect to host
play.google.com: did not receive HSTS header (error ignored - included regardless)
playflick.com: did not receive HSTS header
playkh.com: did not receive HSTS header
playmaker.io: could not connect to host
playmyplay.com: did not receive HSTS header
@ -3287,9 +3285,9 @@ pontualcomp.com: max-age too low: 2592000
poolsandstuff.com: did not receive HSTS header
poon.tech: could not connect to host
portalplatform.net: did not receive HSTS header
portalzine.de: did not receive HSTS header
poshpak.com: max-age too low: 86400
postcodewise.co.uk: did not receive HSTS header
posterspy.com: did not receive HSTS header
postscheduler.org: could not connect to host
posylka.de: did not receive HSTS header
poussinooz.fr: could not connect to host
@ -3319,7 +3317,6 @@ pro-zone.com: could not connect to host
prodpad.com: did not receive HSTS header
professionalboundaries.com: did not receive HSTS header
profi-durchgangsmelder.de: did not receive HSTS header
profpay.com: could not connect to host
profundr.com: could not connect to host
progblog.net: could not connect to host
progg.no: could not connect to host
@ -3331,6 +3328,7 @@ prontocleaners.co.uk: could not connect to host
prontolight.com: did not receive HSTS header
prontomovers.co.uk: could not connect to host
propactrading.com: could not connect to host
proposalonline.com: did not receive HSTS header
prosocialmachines.com: could not connect to host
prosoft.sk: did not receive HSTS header
prosperident.com: did not receive HSTS header
@ -3354,7 +3352,7 @@ puneflowermall.com: did not receive HSTS header
purewebmasters.com: could not connect to host
purplemoon.mobi: did not receive HSTS header
purplestar.mobi: did not receive HSTS header
pushapp.org: did not receive HSTS header
pushapp.org: could not connect to host
pwd.ovh: could not connect to host
pwdgen.net: could not connect to host
pwnies.dk: could not connect to host
@ -3411,6 +3409,7 @@ raspass.me: could not connect to host
rastreador.com.es: did not receive HSTS header
ratajczak.fr: could not connect to host
rate-esport.de: could not connect to host
rationalism.com: could not connect to host
raulfraile.net: could not connect to host
raven.lipetsk.ru: could not connect to host
rawet.se: did not receive HSTS header
@ -3429,6 +3428,7 @@ realmic.net: could not connect to host
realmofespionage.com: could not connect to host
reardenporn.com: could not connect to host
recommended.reviews: could not connect to host
redable.hosting: could not connect to host
redar.xyz: did not receive HSTS header
reddiseals.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
reddit.com: did not receive HSTS header
@ -3469,6 +3469,7 @@ reserve-online.net: did not receive HSTS header
respice.xyz: could not connect to host
respostas.com.br: did not receive HSTS header
restchart.com: did not receive HSTS header
reth.ch: could not connect to host
retrotracks.net: max-age too low: 0
revealdata.com: did not receive HSTS header
revello.org: did not receive HSTS header
@ -3476,7 +3477,6 @@ reverie.pw: could not connect to host
reviews.anime.my: max-age too low: 5184000
revtut.net: did not receive HSTS header
rewardstock.com: max-age too low: 0
rezun.cloud: did not receive HSTS header
rhapsodhy.hu: could not connect to host
rhdigital.pro: could not connect to host
rhering.de: could not connect to host
@ -3618,7 +3618,11 @@ schadegarant.net: could not connect to host
schmitz.link: could not connect to host
schnell-gold.com: could not connect to host
schoop.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
schrauger.run: could not connect to host
schrauger.com: did not receive HSTS header
schrauger.info: did not receive HSTS header
schrauger.net: did not receive HSTS header
schrauger.org: did not receive HSTS header
schrauger.run: did not receive HSTS header
schreiber-netzwerk.eu: did not receive HSTS header
schrodinger.io: could not connect to host
schulterglatzen-altenwalde.de: could not connect to host
@ -3739,7 +3743,6 @@ siddhant.me: could not connect to host
siebens.net: could not connect to host
sifls.com: could not connect to host
sig6.org: could not connect to host
sigabrt.org: could not connect to host
sigterm.no: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
silentcircle.com: did not receive HSTS header
silentcircle.org: could not connect to host
@ -3779,6 +3782,7 @@ skullhouse.nyc: did not receive HSTS header
skyflix.me: did not receive HSTS header
skyoy.com: did not receive HSTS header
slash-dev.de: did not receive HSTS header
slashand.co: did not receive HSTS header
slashem.me: did not receive HSTS header
slattery.co: could not connect to host
sleep10.com: could not connect to host
@ -3789,6 +3793,7 @@ slope.haus: could not connect to host
slovakiana.sk: did not receive HSTS header
sluitkampzeist.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
slycurity.de: did not receive HSTS header
sm.ms: did not receive HSTS header
smart-mirror.de: did not receive HSTS header
smart-ov.nl: could not connect to host
smartcoin.com.br: could not connect to host
@ -3806,6 +3811,7 @@ smove.sg: did not receive HSTS header
smusg.com: did not receive HSTS header
snailing.org: could not connect to host
snakehosting.dk: did not receive HSTS header
snapappointments.com: did not receive HSTS header
snapappts.com: could not connect to host
snapworks.net: did not receive HSTS header
sneberger.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
@ -3827,7 +3833,7 @@ socialhams.net: did not receive HSTS header
socialhead.io: could not connect to host
socialspirit.com.br: did not receive HSTS header
sockeye.cc: could not connect to host
socomponents.co.uk: could not connect to host
socomponents.co.uk: did not receive HSTS header
sodacore.com: could not connect to host
soe-server.com: could not connect to host
sogeek.me: did not receive HSTS header
@ -3923,6 +3929,10 @@ stderr.cc: could not connect to host
stefanweiser.de: did not receive HSTS header
stephanierxo.com: did not receive HSTS header
stephenandburns.com: did not receive HSTS header
stephenschrauger.com: did not receive HSTS header
stephenschrauger.info: did not receive HSTS header
stephenschrauger.net: did not receive HSTS header
stephenschrauger.org: did not receive HSTS header
stevensononthe.net: did not receive HSTS header
stewartremodelingadvantage.com: did not receive HSTS header
stig.io: did not receive HSTS header
@ -3944,7 +3954,6 @@ stpatricksguild.com: did not receive HSTS header
stqry.com: did not receive HSTS header
str0.at: did not receive HSTS header
strasweb.fr: did not receive HSTS header
streamchan.org: could not connect to host
streamingeverywhere.com: did not receive HSTS header
streamingmagazin.de: could not connect to host
streampanel.net: did not receive HSTS header
@ -3979,7 +3988,6 @@ suksit.com: could not connect to host
sumoatm.com: did not receive HSTS header
sumoscout.de: did not receive HSTS header
suncountrymarine.com: did not receive HSTS header
sunflyer.cn: did not receive HSTS header
sunnyfruit.ru: did not receive HSTS header
sunshinepress.org: could not connect to host
supcro.com: could not connect to host
@ -4082,6 +4090,7 @@ tegelsensanitaironline.nl: did not receive HSTS header
tekshrek.com: did not receive HSTS header
telefonnummer.online: could not connect to host
telefoonnummerinfo.nl: could not connect to host
telling.xyz: could not connect to host
temehu.com: did not receive HSTS header
tempcraft.net: could not connect to host
tendertool.nl: could not connect to host
@ -4162,12 +4171,11 @@ thirty5.net: did not receive HSTS header
thisisacompletetest.ga: could not connect to host
thisisforager.com: did not receive HSTS header
thiswebhost.com: did not receive HSTS header
thomasgriffin.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
thomaskliszowski.fr: did not receive HSTS header
thomaswoo.com: could not connect to host
thorncreek.net: did not receive HSTS header
thriveapproach.co.uk: did not receive HSTS header
thrx.net: could not connect to host
throughthelookingglasslens.co.uk: could not connect to host
thumbtack.com: did not receive HSTS header
thusoy.com: did not receive HSTS header
tibbitshall.ca: did not receive HSTS header
@ -4183,6 +4191,7 @@ tikutiku.pl: max-age too low: 0
tildebot.com: could not connect to host
tilkah.com.au: could not connect to host
tillcraft.com: could not connect to host
tillseasyscore.com: could not connect to host
timbeilby.com: could not connect to host
timbuktutimber.com: did not receive HSTS header
timcamara.com: did not receive HSTS header
@ -4202,6 +4211,7 @@ titouan.co: did not receive HSTS header
tittelbach.at: did not receive HSTS header
titties.ml: could not connect to host
tkarstens.de: did not receive HSTS header
tkn.tokyo: could not connect to host
tlo.hosting: could not connect to host
tlo.link: did not receive HSTS header
tlo.network: could not connect to host
@ -4262,15 +4272,16 @@ transportal.sk: did not receive HSTS header
travelinsurance.co.nz: did not receive HSTS header
treeby.net: could not connect to host
trendberry.ru: could not connect to host
trik.es: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
trinityaffirmations.com: max-age too low: 0
trinitycore.org: max-age too low: 2592000
tripdelta.com: did not receive HSTS header
trixies-wish.nz: could not connect to host
trollme.me: could not connect to host
trufflemonkey.co.uk: did not receive HSTS header
trunkjunk.co: did not receive HSTS header
trusteecar.com: did not receive HSTS header
trustmeimfancy.com: could not connect to host
truthmessages.pw: could not connect to host
trybind.com: could not connect to host
tryoneday.co: did not receive HSTS header
ts2.se: could not connect to host
@ -4309,7 +4320,6 @@ txclimbers.com: could not connect to host
txf.pw: could not connect to host
ty2u.com: did not receive HSTS header
tylian.net: max-age too low: 0
typingrevolution.com: did not receive HSTS header
tyrelius.com: did not receive HSTS header
tyroproducts.eu: did not receive HSTS header
tzappa.net: could not connect to host
@ -4324,7 +4334,6 @@ uega.net: did not receive HSTS header
ueu.me: could not connect to host
ufgaming.com: did not receive HSTS header
ufotable.uk: did not receive HSTS header
uhm.io: did not receive HSTS header
ui8.net: max-age too low: 86400
ukas.com: did not receive HSTS header
ukdropshipment.co.uk: did not receive HSTS header
@ -4336,10 +4345,10 @@ ulmo.dk: could not connect to host
ultros.io: did not receive HSTS header
umidev.com: did not receive HSTS header
umie.cc: did not receive HSTS header
umwandeln-online.de: could not connect to host
unbanthe.net: could not connect to host
unblocked-networks.org: could not connect to host
unblocked.host: could not connect to host
unblocked.today: did not receive HSTS header
unblocked.win: could not connect to host
unblocked.works: did not receive HSTS header
unblocked.world: did not receive HSTS header
@ -4380,6 +4389,7 @@ uscitizenship.info: did not receive HSTS header
uscurrency.gov: did not receive HSTS header
used-in.jp: did not receive HSTS header
usercare.com: did not receive HSTS header
userify.com: max-age too low: 0
ustr.gov: max-age too low: 86400
utleieplassen.no: could not connect to host
utopiagalaxy.space: could not connect to host
@ -4415,6 +4425,7 @@ vbulletin-russia.com: could not connect to host
vbulletinrussia.com: could not connect to host
vcdove.com: did not receive HSTS header
vcr.re: could not connect to host
ve3oat.ca: could not connect to host
veblen.com: could not connect to host
vechkasov.ru: did not receive HSTS header
vehent.org: did not receive HSTS header
@ -4441,6 +4452,7 @@ vincentkooijman.at: did not receive HSTS header
vincentkooijman.nl: did not receive HSTS header
vincentpancol.com: could not connect to host
vintageheartcoffee.com: did not receive HSTS header
vinyculture.com: could not connect to host
vio.no: did not receive HSTS header
viperdns.com: could not connect to host
vipi.es: could not connect to host
@ -4456,7 +4468,6 @@ vlora.city: could not connect to host
vm0.eu: did not receive HSTS header
vmrdev.com: could not connect to host
voceinveste.com: did not receive HSTS header
vodpay.com: could not connect to host
vodpay.net: could not connect to host
vodpay.org: could not connect to host
voicesuk.co.uk: did not receive HSTS header
@ -4465,6 +4476,7 @@ voidpay.net: could not connect to host
voidpay.org: could not connect to host
volcrado.com: did not receive HSTS header
vortexhobbies.com: did not receive HSTS header
voshod.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
vosjesweb.nl: could not connect to host
vox.vg: did not receive HSTS header
vpl.me: did not receive HSTS header
@ -4480,7 +4492,6 @@ w4a.fr: did not receive HSTS header
w4xzr.top: could not connect to host
w4xzr.xyz: could not connect to host
wachtwoordencheck.nl: could not connect to host
waixingrenfuli.vip: could not connect to host
waixingrenfuli7.vip: could not connect to host
wakapp.de: could not connect to host
walkeryoung.ca: could not connect to host
@ -4508,6 +4519,7 @@ wavefrontsystemstech.com: could not connect to host
wayne.cloud: did not receive HSTS header
wealthfactory.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
wear2work.nl: did not receive HSTS header
wearepapermill.co: did not receive HSTS header
weaverhairextensions.nl: could not connect to host
web-industry.fr: could not connect to host
web-torrent.com: max-age too low: 0
@ -4532,14 +4544,13 @@ webmaniabr.com: did not receive HSTS header
webmarketingfestival.it: did not receive HSTS header
webnosql.com: could not connect to host
webperformance.ru: max-age too low: 3600
websenat.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
webstory.xyz: could not connect to host
webswitch.io: could not connect to host
webtechgadgetry.com: did not receive HSTS header
webtiles.co.uk: could not connect to host
webtobesocial.de: could not connect to host
webwork.pw: could not connect to host
weddingenvelopes.co.uk: did not receive HSTS header
weissman.agency: did not receive HSTS header
weizenke.im: could not connect to host
wellastore.ru: did not receive HSTS header
wellsolveit.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
@ -4598,7 +4609,6 @@ winaes.com: did not receive HSTS header
winclient.cn: could not connect to host
winecodeavocado.com: could not connect to host
winged.io: could not connect to host
wingos.net: could not connect to host
wingumd.net: could not connect to host
winpack.cf: could not connect to host
winpack.eu.org: could not connect to host
@ -4638,7 +4648,6 @@ wowapi.org: could not connect to host
wphostingspot.com: did not receive HSTS header
wpmetadatastandardsproject.org: could not connect to host
writeapp.me: did not receive HSTS header
wsa.poznan.pl: could not connect to host
wsscompany.com.ve: could not connect to host
wufu.org: did not receive HSTS header
wuhengmin.com: did not receive HSTS header
@ -4702,6 +4711,7 @@ xn--80aaihqncaejjobbu6v.xn--p1ai: max-age too low: 6000
xn--9pr52k0p5a.com: did not receive HSTS header
xn--datenrettung-mnchen-jbc.com: did not receive HSTS header
xn--dmonenjger-q5ag.net: could not connect to host
xn--jp-6l5cs1yf3ivjsglphyv.net: could not connect to host
xn--lgb3a8bcpn.cf: could not connect to host
xn--lgb3a8bcpn.ga: could not connect to host
xn--lgb3a8bcpn.gq: could not connect to host
@ -4716,7 +4726,6 @@ xobox.me: could not connect to host
xoffy.com: did not receive HSTS header
xombra.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
xpi.fr: could not connect to host
xps2pdf.co.uk: could not connect to host
xsmobile.de: could not connect to host
xtream-hosting.com: could not connect to host
xtream-hosting.de: could not connect to host
@ -4760,6 +4769,7 @@ yoloprod.fr: could not connect to host
yoloseo.com: could not connect to host
youcontrol.ru: could not connect to host
youngandunited.nl: did not receive HSTS header
yourcomputer.expert: did not receive HSTS header
yoursecondphone.co: could not connect to host
yourstrongbox.com: could not connect to host
ypiresia.fr: could not connect to host
@ -4782,7 +4792,7 @@ zachgibbens.org: could not connect to host
zadieheimlich.com: did not receive HSTS header
zamorano.edu: could not connect to host
zap.yt: could not connect to host
zarooba.com: did not receive HSTS header
zarooba.com: could not connect to host
zbigniewgalucki.eu: did not receive HSTS header
zbp.at: did not receive HSTS header
zebrababy.cn: did not receive HSTS header
@ -4820,7 +4830,6 @@ zqhong.com: could not connect to host
ztan.tk: could not connect to host
ztcaoll222.cn: did not receive HSTS header
zten.org: could not connect to host
zulu7.com: could not connect to host
zuolan.me: did not receive HSTS header
zvncloud.com: did not receive HSTS header
zwollemagazine.nl: did not receive HSTS header

File diff suppressed because it is too large Load Diff

View File

@ -247,10 +247,10 @@ struct FixWeakMappingGrayBitsTracer : public js::WeakMapTracer
void trace(JSObject* aMap, JS::GCCellPtr aKey, JS::GCCellPtr aValue) override
{
// If nothing that could be held alive by this entry is marked gray, return.
bool delegateMightNeedMarking = aKey && JS::GCThingIsMarkedGray(aKey);
bool keyMightNeedMarking = aKey && JS::GCThingIsMarkedGray(aKey);
bool valueMightNeedMarking = aValue && JS::GCThingIsMarkedGray(aValue) &&
aValue.kind() != JS::TraceKind::String;
if (!delegateMightNeedMarking && !valueMightNeedMarking) {
if (!keyMightNeedMarking && !valueMightNeedMarking) {
return;
}
@ -258,9 +258,11 @@ struct FixWeakMappingGrayBitsTracer : public js::WeakMapTracer
aKey = nullptr;
}
if (delegateMightNeedMarking && aKey.is<JSObject>()) {
if (keyMightNeedMarking && aKey.is<JSObject>()) {
JSObject* kdelegate = js::GetWeakmapKeyDelegate(&aKey.as<JSObject>());
if (kdelegate && !JS::ObjectIsMarkedGray(kdelegate)) {
if (kdelegate && !JS::ObjectIsMarkedGray(kdelegate) &&
(!aMap || !JS::ObjectIsMarkedGray(aMap)))
{
if (JS::UnmarkGrayGCThingRecursively(aKey)) {
mAnyMarked = true;
}

View File

@ -26,6 +26,7 @@
#define USE_LINUX_QUOTACTL
#include <sys/mount.h>
#include <sys/quota.h>
#include <sys/sysmacros.h>
#ifndef BLOCK_SIZE
#define BLOCK_SIZE 1024 /* kernel block size */
#endif