Merge m-c to autoland a=merge

MozReview-Commit-ID: 7m1sarjIoLM
This commit is contained in:
Wes Kocher 2017-02-17 13:50:13 -08:00
commit dda9a2cfb8
968 changed files with 38055 additions and 56696 deletions

View File

@ -13,6 +13,7 @@
#include "mozilla/a11y/PDocAccessible.h"
#include "OuterDocAccessible.h"
#include "ProxyAccessible.h"
#include "DocAccessibleParent.h"
#include "RootAccessible.h"
#include "TableAccessible.h"
#include "TableCellAccessible.h"

View File

@ -30,6 +30,12 @@ OuterDocAccessible::
{
mType = eOuterDocType;
#ifdef XP_WIN
if (DocAccessibleParent* remoteDoc = RemoteChildDoc()) {
remoteDoc->SendParentCOMProxy();
}
#endif
// Request document accessible for the content document to make sure it's
// created. It will appended to outerdoc accessible children asynchronously.
nsIDocument* outerDoc = mContent->GetUncomposedDoc();
@ -207,7 +213,7 @@ OuterDocAccessible::GetChildAt(uint32_t aIndex) const
#endif // defined(XP_WIN)
ProxyAccessible*
DocAccessibleParent*
OuterDocAccessible::RemoteChildDoc() const
{
dom::TabParent* tab = dom::TabParent::GetFrom(GetContent());

View File

@ -10,7 +10,7 @@
namespace mozilla {
namespace a11y {
class ProxyAccessible;
class DocAccessibleParent;
/**
* Used for <browser>, <frame>, <iframe>, <page> or editor> elements.
@ -28,7 +28,7 @@ public:
NS_DECL_ISUPPORTS_INHERITED
ProxyAccessible* RemoteChildDoc() const;
DocAccessibleParent* RemoteChildDoc() const;
// Accessible
virtual void Shutdown() override;

View File

@ -29,7 +29,7 @@ DocAccessibleParent::RecvShowEvent(const ShowEventData& aData,
if (mShutdown)
return IPC_OK();
MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
MOZ_ASSERT(CheckDocTree());
if (aData.NewTree().IsEmpty()) {
NS_ERROR("no children being added");
@ -75,7 +75,7 @@ DocAccessibleParent::RecvShowEvent(const ShowEventData& aData,
}
#endif
MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
MOZ_ASSERT(CheckDocTree());
ProxyAccessible* target = parent->ChildAt(newChildIdx);
ProxyShowHideEvent(target, parent, true, aFromUser);
@ -194,7 +194,7 @@ DocAccessibleParent::RecvHideEvent(const uint64_t& aRootID,
parent->RemoveChild(root);
root->Shutdown();
MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
MOZ_ASSERT(CheckDocTree());
if (event) {
nsCoreUtils::DispatchAccEvent(Move(event));
@ -391,13 +391,13 @@ DocAccessibleParent::RecvBindChildDoc(PDocAccessibleParent* aChildDoc, const uin
if (!aID)
return IPC_FAIL(this, "ID is 0!");
MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
MOZ_ASSERT(CheckDocTree());
auto childDoc = static_cast<DocAccessibleParent*>(aChildDoc);
childDoc->Unbind();
ipc::IPCResult result = AddChildDoc(childDoc, aID, false);
MOZ_ASSERT(result);
MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
MOZ_ASSERT(CheckDocTree());
if (!result) {
return result;
}
@ -529,14 +529,63 @@ DocAccessibleParent::GetXPCAccessible(ProxyAccessible* aProxy)
}
#if defined(XP_WIN)
void
DocAccessibleParent::MaybeInitWindowEmulation()
{
if (!nsWinUtils::IsWindowEmulationStarted()) {
return;
}
// XXX get the bounds from the tabParent instead of poking at accessibles
// which might not exist yet.
Accessible* outerDoc = OuterDocOfRemoteBrowser();
if (!outerDoc) {
return;
}
RootAccessible* rootDocument = outerDoc->RootAccessible();
MOZ_ASSERT(rootDocument);
bool isActive = true;
nsIntRect rect(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0);
if (Compatibility::IsDolphin()) {
rect = Bounds();
nsIntRect rootRect = rootDocument->Bounds();
rect.x = rootRect.x - rect.x;
rect.y -= rootRect.y;
auto tab = static_cast<dom::TabParent*>(Manager());
tab->GetDocShellIsActive(&isActive);
}
IAccessibleHolder hWndAccHolder;
HWND parentWnd = reinterpret_cast<HWND>(rootDocument->GetNativeWindow());
HWND hWnd = nsWinUtils::CreateNativeWindow(kClassNameTabContent,
parentWnd, rect.x, rect.y,
rect.width, rect.height,
isActive);
if (hWnd) {
// Attach accessible document to the emulated native window
::SetPropW(hWnd, kPropNameDocAccParent, (HANDLE)this);
SetEmulatedWindowHandle(hWnd);
IAccessible* rawHWNDAcc = nullptr;
if (SUCCEEDED(::AccessibleObjectFromWindow(hWnd, OBJID_WINDOW,
IID_IAccessible,
(void**)&rawHWNDAcc))) {
hWndAccHolder.Set(IAccessibleHolder::COMPtrType(rawHWNDAcc));
}
}
Unused << SendEmulatedWindow(reinterpret_cast<uintptr_t>(mEmulatedWindowHandle),
hWndAccHolder);
}
/**
* @param aCOMProxy COM Proxy to the document in the content process.
*/
void
DocAccessibleParent::SetCOMProxy(const RefPtr<IAccessible>& aCOMProxy)
DocAccessibleParent::SendParentCOMProxy()
{
SetCOMInterface(aCOMProxy);
// Make sure that we're not racing with a tab shutdown
auto tab = static_cast<dom::TabParent*>(Manager());
MOZ_ASSERT(tab);
@ -545,52 +594,17 @@ DocAccessibleParent::SetCOMProxy(const RefPtr<IAccessible>& aCOMProxy)
}
Accessible* outerDoc = OuterDocOfRemoteBrowser();
if (!outerDoc) {
return;
}
IAccessible* rawNative = nullptr;
if (outerDoc) {
outerDoc->GetNativeInterface((void**) &rawNative);
MOZ_ASSERT(rawNative);
}
outerDoc->GetNativeInterface((void**) &rawNative);
MOZ_ASSERT(rawNative);
IAccessibleHolder::COMPtrType ptr(rawNative);
IAccessibleHolder holder(Move(ptr));
IAccessibleHolder hWndAccHolder;
if (nsWinUtils::IsWindowEmulationStarted()) {
RootAccessible* rootDocument = outerDoc->RootAccessible();
MOZ_ASSERT(rootDocument);
bool isActive = true;
nsIntRect rect(CW_USEDEFAULT, CW_USEDEFAULT, 0, 0);
if (Compatibility::IsDolphin()) {
rect = Bounds();
nsIntRect rootRect = rootDocument->Bounds();
rect.x = rootRect.x - rect.x;
rect.y -= rootRect.y;
tab->GetDocShellIsActive(&isActive);
}
HWND parentWnd = reinterpret_cast<HWND>(rootDocument->GetNativeWindow());
HWND hWnd = nsWinUtils::CreateNativeWindow(kClassNameTabContent,
parentWnd, rect.x, rect.y,
rect.width, rect.height,
isActive);
if (hWnd) {
// Attach accessible document to the emulated native window
::SetPropW(hWnd, kPropNameDocAccParent, (HANDLE)this);
SetEmulatedWindowHandle(hWnd);
IAccessible* rawHWNDAcc = nullptr;
if (SUCCEEDED(::AccessibleObjectFromWindow(hWnd, OBJID_WINDOW,
IID_IAccessible,
(void**)&rawHWNDAcc))) {
hWndAccHolder.Set(IAccessibleHolder::COMPtrType(rawHWNDAcc));
}
}
}
Unused << SendEmulatedWindow(reinterpret_cast<uintptr_t>(mEmulatedWindowHandle),
hWndAccHolder);
Unused << SendParentCOMProxy(holder);
Unused << PDocAccessibleParent::SendParentCOMProxy(holder);
}
void

View File

@ -108,7 +108,7 @@ public:
void Destroy();
virtual void ActorDestroy(ActorDestroyReason aWhy) override
{
MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
MOZ_ASSERT(CheckDocTree());
if (!mShutdown)
Destroy();
}
@ -172,7 +172,8 @@ public:
{ return LiveDocs().Get(mChildDocs[aIdx]); }
#if defined(XP_WIN)
void SetCOMProxy(const RefPtr<IAccessible>& aCOMProxy);
void MaybeInitWindowEmulation();
void SendParentCOMProxy();
virtual mozilla::ipc::IPCResult RecvGetWindowedPluginIAccessible(
const WindowsHandle& aHwnd, IAccessibleHolder* aPluginCOMProxy) override;

View File

@ -39,15 +39,14 @@ public:
#include "mozilla/a11y/ProxyAccessibleShared.h"
bool GetCOMInterface(void** aOutAccessible) const;
void SetCOMInterface(const RefPtr<IAccessible>& aIAccessible)
{ mCOMProxy = aIAccessible; }
protected:
explicit ProxyAccessible(DocAccessibleParent* aThisAsDoc)
: ProxyAccessibleBase(aThisAsDoc)
{ MOZ_COUNT_CTOR(ProxyAccessible); }
void SetCOMInterface(const RefPtr<IAccessible>& aIAccessible)
{ mCOMProxy = aIAccessible; }
private:
RefPtr<IAccessible> mCOMProxy;
};

View File

@ -13,6 +13,7 @@
#include "nsIAccessibleRelation.h"
#include "nsIAccessibleEditableText.h"
#include "nsIPersistentProperties2.h"
#include "DocAccessibleParent.h"
#include "Relation.h"
#include "Role.h"
#include "RootAccessible.h"

View File

@ -7,7 +7,6 @@
#include "ServiceProvider.h"
#include "ApplicationAccessibleWrap.h"
#include "Compatibility.h"
#include "DocAccessible.h"
#include "nsAccUtils.h"
#include "nsCoreUtils.h"
@ -72,8 +71,10 @@ ServiceProvider::QueryService(REFGUID aGuidService, REFIID aIID,
}
// Can get to IAccessibleApplication from any node via QS
// Note: in case of JAWS we want to check if aIID is
// IID_IAccessibleApplication.
if (aGuidService == IID_IAccessibleApplication ||
(Compatibility::IsJAWS() && aIID == IID_IAccessibleApplication)) {
aIID == IID_IAccessibleApplication) {
ApplicationAccessibleWrap* applicationAcc =
static_cast<ApplicationAccessibleWrap*>(ApplicationAcc());
if (!applicationAcc)

View File

@ -2269,6 +2269,16 @@
</targetApplication>
</versionRange>
</pluginItem>
<pluginItem blockID="3f136e56-4c93-4619-8c0d-d86258c1065d">
<match exp="(nppdf32\.dll)|(AdobePDFViewerNPAPI\.plugin)" name="filename"/>
<infoURL>https://get.adobe.com/reader/</infoURL>
<versionRange maxVersion="15.006.30244" minVersion="15.006" severity="1" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="43b45ad8-a373-42c1-89c6-64e2746885e5">
<match exp="(nppdf32\.dll)|(AdobePDFViewerNPAPI\.plugin)" name="filename"/>
<infoURL>https://get.adobe.com/reader/</infoURL>
<versionRange maxVersion="15.020.20042" minVersion="15.020" severity="1" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p366">
<match exp="Scorch\.plugin" name="filename"/>
<versionRange maxVersion="6.2.0" minVersion="6.2.0" severity="1"/>
@ -2349,6 +2359,11 @@
</targetApplication>
</versionRange>
</pluginItem>
<pluginItem blockID="59c31ade-88d6-4b22-8601-5316f82e3977">
<match exp="(nppdf32\.dll)|(AdobePDFViewerNPAPI\.plugin)" name="filename"/>
<infoURL>https://get.adobe.com/reader/</infoURL>
<versionRange maxVersion="11.0.18" minVersion="11.0" severity="1" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1004">
<match exp="Unity Web Player\.plugin" name="filename"/>
<match exp="^($|Unity Web Player version 5.0(\.([0-2]|3f1))?[^0-9.])" name="description"/>
@ -2809,7 +2824,7 @@
<pluginItem blockID="p28">
<match exp="NPFFAddOn.dll" name="filename"/>
</pluginItem>
<pluginItem blockID="p1421">
<pluginItem blockID="p1421" os="Linux">
<match exp="libflashplayer\.so" name="filename"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="23.0.0.207" minVersion="11.2.202.643" severity="0" vulnerabilitystatus="1"/>

View File

@ -1704,9 +1704,8 @@
// Abort if we're not going to change anything
let currentRemoteType = aBrowser.getAttribute("remoteType");
if (isRemote == aShouldBeRemote && !aOptions.newFrameloader && !aOptions.freshProcess &&
(!isRemote || currentRemoteType == aOptions.remoteType) &&
!aBrowser.frameLoader.isFreshProcess) {
if (isRemote == aShouldBeRemote && !aOptions.newFrameloader &&
(!isRemote || currentRemoteType == aOptions.remoteType)) {
return false;
}
@ -1765,18 +1764,8 @@
aBrowser.presetOpenerWindow(aOptions.opener);
}
// Set the freshProcess attribute so that the frameloader knows to
// create a new process
if (aOptions.freshProcess) {
aBrowser.setAttribute("freshProcess", "true");
}
parent.appendChild(aBrowser);
// Remove the freshProcess attribute if we set it, as we don't
// want it to apply for the next time the frameloader is created
aBrowser.removeAttribute("freshProcess");
aBrowser.userTypedValue = oldUserTypedValue;
if (hadStartedLoad) {
aBrowser.urlbarChangeTracker.startedLoad();
@ -1850,15 +1839,23 @@
if (!gMultiProcessBrowser)
return this.updateBrowserRemoteness(aBrowser, false);
// If we're in a LargeAllocation process, we prefer switching back
// into a normal content process, as that way we can clean up the
// L-A process.
let preferredRemoteType = aBrowser.remoteType;
if (aBrowser.remoteType == E10SUtils.LARGE_ALLOCATION_REMOTE_TYPE) {
preferredRemoteType = E10SUtils.DEFAULT_REMOTE_TYPE;
}
aOptions.remoteType =
E10SUtils.getRemoteTypeForURI(aURL,
gMultiProcessBrowser,
preferredRemoteType,
aOptions.freshProcess);
// If this URL can't load in the current browser then flip it to the
// correct type.
let currentRemoteType = aBrowser.remoteType;
aOptions.remoteType =
E10SUtils.getRemoteTypeForURI(aURL, gMultiProcessBrowser,
currentRemoteType);
if (currentRemoteType != aOptions.remoteType ||
aOptions.freshProcess || aOptions.newFrameloader ||
aBrowser.frameLoader.isFreshProcess) {
if (aBrowser.remoteType != aOptions.remoteType ||
aOptions.newFrameloader) {
let remote = aOptions.remoteType != E10SUtils.NOT_REMOTE;
return this.updateBrowserRemoteness(aBrowser, remote, aOptions);
}

View File

@ -39,6 +39,9 @@ const NOT_REMOTE = null;
const WEB_REMOTE_TYPE = "web";
const FILE_REMOTE_TYPE = "file";
const EXTENSION_REMOTE_TYPE = "extension";
// This must start with the WEB_REMOTE_TYPE above.
const LARGE_ALLOCATION_REMOTE_TYPE = "webLargeAllocation";
const DEFAULT_REMOTE_TYPE = WEB_REMOTE_TYPE;
function validatedWebRemoteType(aPreferredRemoteType) {
@ -52,6 +55,7 @@ this.E10SUtils = {
WEB_REMOTE_TYPE,
FILE_REMOTE_TYPE,
EXTENSION_REMOTE_TYPE,
LARGE_ALLOCATION_REMOTE_TYPE,
canLoadURIInProcess(aURL, aProcess) {
let remoteType = aProcess == Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT
@ -60,11 +64,16 @@ this.E10SUtils = {
},
getRemoteTypeForURI(aURL, aMultiProcess,
aPreferredRemoteType = DEFAULT_REMOTE_TYPE) {
aPreferredRemoteType = DEFAULT_REMOTE_TYPE,
aLargeAllocation = false) {
if (!aMultiProcess) {
return NOT_REMOTE;
}
if (aLargeAllocation) {
return LARGE_ALLOCATION_REMOTE_TYPE;
}
// loadURI in browser.xml treats null as about:blank
if (!aURL) {
aURL = "about:blank";
@ -179,7 +188,7 @@ this.E10SUtils = {
// If we are in a Large-Allocation process, and it wouldn't be content visible
// to change processes, we want to load into a new process so that we can throw
// this one out.
if (aDocShell.inLargeAllocProcess &&
if (Services.appinfo.remoteType == LARGE_ALLOCATION_REMOTE_TYPE &&
!aDocShell.awaitingLargeAlloc &&
aDocShell.isOnlyToplevelInTabGroup) {
return false;

View File

@ -14911,11 +14911,3 @@ nsDocShell::GetAwaitingLargeAlloc(bool* aResult)
*aResult = static_cast<TabChild*>(tabChild.get())->IsAwaitingLargeAlloc();
return NS_OK;
}
NS_IMETHODIMP
nsDocShell::GetInLargeAllocProcess(bool* aResult)
{
MOZ_ASSERT(aResult);
*aResult = TabChild::InLargeAllocProcess();
return NS_OK;
}

View File

@ -1126,12 +1126,6 @@ interface nsIDocShell : nsIDocShellTreeItem
*/
[infallible] readonly attribute boolean isOnlyToplevelInTabGroup;
/**
* Returns `true` if this docshell is loaded within a Large-Allocation
* process.
*/
[infallible] readonly attribute boolean inLargeAllocProcess;
/**
* Returns `true` if this docshell was created due to a Large-Allocation
* header, and has not seen the initiating load yet.

View File

@ -9788,8 +9788,9 @@ nsContentUtils::AttemptLargeAllocationLoad(nsIHttpChannel* aChannel)
TabChild* tabChild = TabChild::GetFrom(outer->AsOuter());
NS_ENSURE_TRUE(tabChild, false);
if (tabChild->TakeAwaitingLargeAlloc()) {
if (tabChild->IsAwaitingLargeAlloc()) {
NS_WARNING("In a Large-Allocation TabChild, ignoring Large-Allocation header!");
tabChild->StopAwaitingLargeAlloc();
outer->SetLargeAllocStatus(LargeAllocStatus::SUCCESS);
return false;
}

View File

@ -12557,8 +12557,8 @@ nsDocument::ReportUseCounters(UseCounterReportKind aKind)
c < eUseCounter_Count; ++c) {
UseCounter uc = static_cast<UseCounter>(c);
Telemetry::ID id =
static_cast<Telemetry::ID>(Telemetry::HistogramFirstUseCounter + uc * 2);
Telemetry::HistogramID id =
static_cast<Telemetry::HistogramID>(Telemetry::HistogramFirstUseCounter + uc * 2);
bool value = GetUseCounter(uc);
if (value) {
@ -12576,8 +12576,8 @@ nsDocument::ReportUseCounters(UseCounterReportKind aKind)
}
if (IsTopLevelContentDocument()) {
id = static_cast<Telemetry::ID>(Telemetry::HistogramFirstUseCounter +
uc * 2 + 1);
id = static_cast<Telemetry::HistogramID>(Telemetry::HistogramFirstUseCounter +
uc * 2 + 1);
value = GetUseCounter(uc) || GetChildDocumentUseCounter(uc);
if (value) {

View File

@ -174,17 +174,10 @@ nsFrameLoader::nsFrameLoader(Element* aOwner, nsPIDOMWindowOuter* aOpener, bool
, mClampScrollPosition(true)
, mObservingOwnerContent(false)
, mVisible(true)
, mFreshProcess(false)
{
mRemoteFrame = ShouldUseRemoteProcess();
MOZ_ASSERT(!mRemoteFrame || !aOpener,
"Cannot pass aOpener for a remote frame!");
// Check if we are supposed to load into a fresh process
mFreshProcess = mOwnerContent->AttrValueIs(kNameSpaceID_None,
nsGkAtoms::freshProcess,
nsGkAtoms::_true,
eCaseMatters);
}
nsFrameLoader::~nsFrameLoader()
@ -1348,15 +1341,6 @@ nsFrameLoader::SwapWithOtherRemoteLoader(nsFrameLoader* aOther,
return NS_ERROR_NOT_IMPLEMENTED;
}
// Remote types must match to swap loaders.
const nsAString& currentRemoteType =
mRemoteBrowser->Manager()->AsContentParent()->GetRemoteType();
const nsAString& newRemoteType =
aOther->mRemoteBrowser->Manager()->AsContentParent()->GetRemoteType();
if (!currentRemoteType.Equals(newRemoteType)) {
return NS_ERROR_NOT_IMPLEMENTED;
}
if (mRemoteBrowser->IsIsolatedMozBrowserElement() !=
aOther->mRemoteBrowser->IsIsolatedMozBrowserElement()) {
return NS_ERROR_NOT_IMPLEMENTED;
@ -1506,6 +1490,20 @@ nsFrameLoader::SwapWithOtherRemoteLoader(nsFrameLoader* aOther,
return rv;
}
// Swap the remoteType property as the frameloaders are being swapped
nsAutoString ourRemoteType;
if (!ourContent->GetAttr(kNameSpaceID_None, nsGkAtoms::RemoteType,
ourRemoteType)) {
ourRemoteType.AssignLiteral(DEFAULT_REMOTE_TYPE);
}
nsAutoString otherRemoteType;
if (!otherContent->GetAttr(kNameSpaceID_None, nsGkAtoms::RemoteType,
otherRemoteType)) {
otherRemoteType.AssignLiteral(DEFAULT_REMOTE_TYPE);
}
ourContent->SetAttr(kNameSpaceID_None, nsGkAtoms::RemoteType, otherRemoteType, false);
otherContent->SetAttr(kNameSpaceID_None, nsGkAtoms::RemoteType, ourRemoteType, false);
Unused << mRemoteBrowser->SendSwappedWithOtherRemoteLoader(
ourContext.AsIPCTabContext());
Unused << aOther->mRemoteBrowser->SendSwappedWithOtherRemoteLoader(
@ -2938,8 +2936,7 @@ nsFrameLoader::TryRemoteBrowser()
NS_ENSURE_SUCCESS(rv, false);
nsCOMPtr<Element> ownerElement = mOwnerContent;
mRemoteBrowser = ContentParent::CreateBrowser(context, ownerElement, openerContentParent,
mFreshProcess);
mRemoteBrowser = ContentParent::CreateBrowser(context, ownerElement, openerContentParent);
if (!mRemoteBrowser) {
return false;
}
@ -3676,13 +3673,6 @@ nsFrameLoader::GetIsDead(bool* aIsDead)
return NS_OK;
}
NS_IMETHODIMP
nsFrameLoader::GetIsFreshProcess(bool* aIsFreshProcess)
{
*aIsFreshProcess = mFreshProcess;
return NS_OK;
}
nsIMessageSender*
nsFrameLoader::GetProcessMessageManager() const
{

View File

@ -268,12 +268,6 @@ interface nsIFrameLoader : nsISupports
* Is `true` if the frameloader is dead (destroy has been called on it)
*/
[infallible] readonly attribute boolean isDead;
/**
* Is `true` if the <xul:browser> which created this frameloader had the
* freshProcess attribute set when it was created.
*/
[infallible] readonly attribute boolean isFreshProcess;
};
%{C++

View File

@ -28,6 +28,7 @@
#include "mozilla/dom/IndexedDatabaseManager.h"
#include "mozilla/ipc/InputStreamUtils.h"
#include "mozilla/ipc/IPCStreamUtils.h"
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/ipc/PBackgroundChild.h"
#include "mozilla/ipc/PBackgroundParent.h"
#include "mozilla/ipc/PFileDescriptorSetParent.h"
@ -51,10 +52,6 @@
#include "WorkerPrivate.h"
#include "WorkerRunnable.h"
#ifdef DEBUG
#include "BackgroundChild.h" // BackgroundChild::GetForCurrentThread().
#endif
#ifdef OS_POSIX
#include "chrome/common/file_descriptor_set_posix.h"
#endif
@ -2605,6 +2602,18 @@ CreateStreamHelper::GetStream(nsIInputStream** aInputStream)
if (EventTargetIsOnCurrentThread(baseRemoteBlobImpl->GetActorEventTarget())) {
RunInternal(baseRemoteBlobImpl, false);
} else if (PBackgroundChild* manager = mozilla::ipc::BackgroundChild::GetForCurrentThread()) {
BlobChild* blobChild = BlobChild::GetOrCreate(manager, baseRemoteBlobImpl);
MOZ_ASSERT(blobChild);
RefPtr<BlobImpl> blobImpl = blobChild->GetBlobImpl();
MOZ_ASSERT(blobImpl);
ErrorResult rv;
blobImpl->GetInternalStream(aInputStream, rv);
mRemoteBlobImpl = nullptr;
mDone = true;
return rv.StealNSResult();
} else {
nsresult rv = baseRemoteBlobImpl->DispatchToTarget(this);
if (NS_WARN_IF(NS_FAILED(rv))) {

View File

@ -672,40 +672,33 @@ ContentParent::RandomSelect(const nsTArray<ContentParent*>& aContentParents,
/*static*/ already_AddRefed<ContentParent>
ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType,
ProcessPriority aPriority,
ContentParent* aOpener,
bool aLargeAllocationProcess,
bool* aNew)
ContentParent* aOpener)
{
if (aNew) {
*aNew = false;
}
// Decide which pool of content parents we are going to be pulling from based
// on the aRemoteType and aLargeAllocationProcess flag.
nsAutoString contentProcessType(aLargeAllocationProcess
? NS_LITERAL_STRING(LARGE_ALLOCATION_REMOTE_TYPE)
: aRemoteType);
nsTArray<ContentParent*>& contentParents = GetOrCreatePool(aRemoteType);
nsTArray<ContentParent*>& contentParents = GetOrCreatePool(contentProcessType);
uint32_t maxContentParents = GetMaxProcessCount(contentProcessType);
uint32_t maxContentParents = GetMaxProcessCount(aRemoteType);
RefPtr<ContentParent> p;
if (contentParents.Length() >= uint32_t(maxContentParents) &&
(p = RandomSelect(contentParents, aOpener, maxContentParents))) {
return p.forget();
if (contentParents.Length() >= maxContentParents) {
// We never want to re-use Large-Allocation processes.
if (aRemoteType.EqualsLiteral(LARGE_ALLOCATION_REMOTE_TYPE)) {
return GetNewOrUsedBrowserProcess(NS_LITERAL_STRING(DEFAULT_REMOTE_TYPE),
aPriority,
aOpener);
}
if ((p = RandomSelect(contentParents, aOpener, maxContentParents))) {
return p.forget();
}
}
// Try to take the preallocated process only for the default process type.
if (contentProcessType.Equals(NS_LITERAL_STRING(DEFAULT_REMOTE_TYPE)) &&
if (aRemoteType.Equals(NS_LITERAL_STRING(DEFAULT_REMOTE_TYPE)) &&
(p = PreallocatedProcessManager::Take())) {
// For pre-allocated process we have not set the opener yet.
p->mOpener = aOpener;
} else {
p = new ContentParent(aOpener, contentProcessType);
if (aNew) {
*aNew = true;
}
p = new ContentParent(aOpener, aRemoteType);
if (!p->LaunchSubprocess(aPriority)) {
return nullptr;
@ -981,8 +974,7 @@ ContentParent::RecvFindPlugins(const uint32_t& aPluginEpoch,
/*static*/ TabParent*
ContentParent::CreateBrowser(const TabContext& aContext,
Element* aFrameElement,
ContentParent* aOpenerContentParent,
bool aFreshProcess)
ContentParent* aOpenerContentParent)
{
PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
@ -1005,7 +997,12 @@ ContentParent::CreateBrowser(const TabContext& aContext,
openerTabId = TabParent::GetTabIdFrom(docShell);
}
bool newProcess = false;
nsAutoString remoteType;
if (!aFrameElement->GetAttr(kNameSpaceID_None, nsGkAtoms::RemoteType,
remoteType)) {
remoteType.AssignLiteral(DEFAULT_REMOTE_TYPE);
}
RefPtr<nsIContentParent> constructorSender;
if (isInContentProcess) {
MOZ_ASSERT(aContext.IsMozBrowserElement());
@ -1015,15 +1012,8 @@ ContentParent::CreateBrowser(const TabContext& aContext,
if (aOpenerContentParent) {
constructorSender = aOpenerContentParent;
} else {
nsAutoString remoteType;
if (!aFrameElement->GetAttr(kNameSpaceID_None, nsGkAtoms::RemoteType,
remoteType)) {
remoteType.AssignLiteral(DEFAULT_REMOTE_TYPE);
}
constructorSender =
GetNewOrUsedBrowserProcess(remoteType, initialPriority, nullptr,
aFreshProcess, &newProcess);
GetNewOrUsedBrowserProcess(remoteType, initialPriority, nullptr);
if (!constructorSender) {
return nullptr;
}
@ -1070,11 +1060,10 @@ ContentParent::CreateBrowser(const TabContext& aContext,
constructorSender->ChildID(),
constructorSender->IsForBrowser());
if (aFreshProcess) {
if (remoteType.EqualsLiteral(LARGE_ALLOCATION_REMOTE_TYPE)) {
// Tell the TabChild object that it was created due to a Large-Allocation
// request, and whether or not that Large-Allocation request succeeded at
// creating a new content process.
Unused << browser->SendSetIsLargeAllocation(true, newProcess);
// request.
Unused << browser->SendAwaitLargeAlloc();
}
if (browser) {

View File

@ -173,9 +173,7 @@ public:
GetNewOrUsedBrowserProcess(const nsAString& aRemoteType = NS_LITERAL_STRING(NO_REMOTE_TYPE),
hal::ProcessPriority aPriority =
hal::ProcessPriority::PROCESS_PRIORITY_FOREGROUND,
ContentParent* aOpener = nullptr,
bool aLargeAllocationProcess = false,
bool* anew = nullptr);
ContentParent* aOpener = nullptr);
/**
* Get or create a content process for the given TabContext. aFrameElement
@ -185,8 +183,7 @@ public:
static TabParent*
CreateBrowser(const TabContext& aContext,
Element* aFrameElement,
ContentParent* aOpenerContentParent,
bool aFreshProcess = false);
ContentParent* aOpenerContentParent);
static void GetAll(nsTArray<ContentParent*>& aArray);

View File

@ -896,10 +896,10 @@ child:
async NotifyPartialSHistoryDeactive();
/**
* Tell the child that it is a fresh process created for a Large-Allocation
* load.
* Tell the TabChild that it should expect a Large-Allocation load to occur.
* Loads which occur until this flag is cleared will not leave the process.
*/
async SetIsLargeAllocation(bool aIsLA, bool aNewProcess);
async AwaitLargeAlloc();
/*
* FIXME: write protocol!

View File

@ -158,7 +158,6 @@ static const char BEFORE_FIRST_PAINT[] = "before-first-paint";
typedef nsDataHashtable<nsUint64HashKey, TabChild*> TabChildMap;
static TabChildMap* sTabChildren;
bool TabChild::sInLargeAllocProcess = false;
TabChildBase::TabChildBase()
: mTabChildGlobal(nullptr)
@ -3121,10 +3120,9 @@ TabChild::RecvThemeChanged(nsTArray<LookAndFeelInt>&& aLookAndFeelIntCache)
}
mozilla::ipc::IPCResult
TabChild::RecvSetIsLargeAllocation(const bool& aIsLA, const bool& aNewProcess)
TabChild::RecvAwaitLargeAlloc()
{
mAwaitingLA = aIsLA;
sInLargeAllocProcess = aIsLA && aNewProcess;
mAwaitingLA = true;
return IPC_OK();
}
@ -3135,7 +3133,7 @@ TabChild::IsAwaitingLargeAlloc()
}
bool
TabChild::TakeAwaitingLargeAlloc()
TabChild::StopAwaitingLargeAlloc()
{
bool awaiting = mAwaitingLA;
mAwaitingLA = false;

View File

@ -664,17 +664,9 @@ public:
// These methods return `true` if this TabChild is currently awaiting a
// Large-Allocation header.
bool TakeAwaitingLargeAlloc();
bool StopAwaitingLargeAlloc();
bool IsAwaitingLargeAlloc();
// Returns `true` if this this process was created to load a docshell in a
// "Fresh Process". This value is initialized to `false`, and is set to `true`
// in RecvSetFreshProcess.
static bool InLargeAllocProcess()
{
return sInLargeAllocProcess;
}
already_AddRefed<nsISHistory> GetRelatedSHistory();
mozilla::dom::TabGroup* TabGroup();
@ -716,8 +708,7 @@ protected:
virtual mozilla::ipc::IPCResult RecvNotifyPartialSHistoryDeactive() override;
virtual mozilla::ipc::IPCResult RecvSetIsLargeAllocation(const bool& aIsLA,
const bool& aNewProcess) override;
virtual mozilla::ipc::IPCResult RecvAwaitLargeAlloc() override;
private:
void HandleDoubleTap(const CSSPoint& aPoint, const Modifiers& aModifiers,
@ -829,8 +820,6 @@ private:
uintptr_t mNativeWindowHandle;
#endif // defined(XP_WIN)
static bool sInLargeAllocProcess;
DISALLOW_EVIL_CONSTRUCTORS(TabChild);
};

View File

@ -965,7 +965,9 @@ TabParent::RecvPDocAccessibleConstructor(PDocAccessibleParent* aDoc,
a11y::WrapperFor(doc)->SetID(aMsaaID);
MOZ_ASSERT(!aDocCOMProxy.IsNull());
RefPtr<IAccessible> proxy(aDocCOMProxy.Get());
doc->SetCOMProxy(proxy);
doc->SetCOMInterface(proxy);
doc->MaybeInitWindowEmulation();
doc->SendParentCOMProxy();
#endif
}
#endif

View File

@ -73,7 +73,7 @@ VP9Benchmark::IsVP9DecodeFast()
Preferences::SetUint(sBenchmarkFpsPref, aDecodeFps);
Preferences::SetUint(sBenchmarkFpsVersionCheck, sBenchmarkVersionID);
}
Telemetry::Accumulate(Telemetry::ID::VIDEO_VP9_BENCHMARK_FPS, aDecodeFps);
Telemetry::Accumulate(Telemetry::HistogramID::VIDEO_VP9_BENCHMARK_FPS, aDecodeFps);
},
[]() { });
}

View File

@ -876,7 +876,7 @@ MediaDecoder::EnsureTelemetryReported()
}
for (const nsCString& codec : codecs) {
DECODER_LOG("Telemetry MEDIA_CODEC_USED= '%s'", codec.get());
Telemetry::Accumulate(Telemetry::ID::MEDIA_CODEC_USED, codec);
Telemetry::Accumulate(Telemetry::HistogramID::MEDIA_CODEC_USED, codec);
}
mTelemetryReported = true;

View File

@ -22,8 +22,8 @@ DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe)
Telemetry::HistogramID aSuccessLatencyProbe,
Telemetry::HistogramID aFailureLatencyProbe)
: DetailedPromise(aGlobal, aName)
{
mSuccessLatencyProbe.Construct(aSuccessLatencyProbe);
@ -75,8 +75,8 @@ DetailedPromise::Create(nsIGlobalObject* aGlobal,
DetailedPromise::Create(nsIGlobalObject* aGlobal,
ErrorResult& aRv,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe)
Telemetry::HistogramID aSuccessLatencyProbe,
Telemetry::HistogramID aFailureLatencyProbe)
{
RefPtr<DetailedPromise> promise = new DetailedPromise(aGlobal, aName, aSuccessLatencyProbe, aFailureLatencyProbe);
promise->CreateWrapper(nullptr, aRv);
@ -96,8 +96,8 @@ DetailedPromise::MaybeReportTelemetry(Status aStatus)
uint32_t latency = (TimeStamp::Now() - mStartTime).ToMilliseconds();
EME_LOG("%s %s latency %ums reported via telemetry", mName.get(),
((aStatus == Succeeded) ? "succcess" : "failure"), latency);
Telemetry::ID tid = (aStatus == Succeeded) ? mSuccessLatencyProbe.Value()
: mFailureLatencyProbe.Value();
Telemetry::HistogramID tid = (aStatus == Succeeded) ? mSuccessLatencyProbe.Value()
: mFailureLatencyProbe.Value();
Telemetry::Accumulate(tid, latency);
}

View File

@ -30,8 +30,8 @@ public:
static already_AddRefed<DetailedPromise>
Create(nsIGlobalObject* aGlobal, ErrorResult& aRv,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe);
Telemetry::HistogramID aSuccessLatencyProbe,
Telemetry::HistogramID aFailureLatencyProbe);
template <typename T>
void MaybeResolve(const T& aArg)
@ -53,8 +53,8 @@ private:
explicit DetailedPromise(nsIGlobalObject* aGlobal,
const nsACString& aName,
Telemetry::ID aSuccessLatencyProbe,
Telemetry::ID aFailureLatencyProbe);
Telemetry::HistogramID aSuccessLatencyProbe,
Telemetry::HistogramID aFailureLatencyProbe);
virtual ~DetailedPromise();
enum Status { Succeeded, Failed };
@ -63,8 +63,8 @@ private:
nsCString mName;
bool mResponded;
TimeStamp mStartTime;
Optional<Telemetry::ID> mSuccessLatencyProbe;
Optional<Telemetry::ID> mFailureLatencyProbe;
Optional<Telemetry::HistogramID> mSuccessLatencyProbe;
Optional<Telemetry::HistogramID> mFailureLatencyProbe;
};
} // namespace dom

View File

@ -130,7 +130,7 @@ OggDemuxer::~OggDemuxer()
bool isChained = mIsChained;
nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction([=]() -> void {
OGG_DEBUG("Reporting telemetry MEDIA_OGG_LOADED_IS_CHAINED=%d", isChained);
Telemetry::Accumulate(Telemetry::ID::MEDIA_OGG_LOADED_IS_CHAINED, isChained);
Telemetry::Accumulate(Telemetry::HistogramID::MEDIA_OGG_LOADED_IS_CHAINED, isChained);
});
// Non-DocGroup version of AbstractThread::MainThread is fine for Telemetry.
AbstractThread::MainThread()->Dispatch(task.forget());

View File

@ -251,7 +251,7 @@ WMFAudioMFTManager::Output(int64_t aStreamOffset,
LOG("Audio MFTDecoder returned success but null output.");
nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction([]() -> void {
LOG("Reporting telemetry AUDIO_MFT_OUTPUT_NULL_SAMPLES");
Telemetry::Accumulate(Telemetry::ID::AUDIO_MFT_OUTPUT_NULL_SAMPLES, 1);
Telemetry::Accumulate(Telemetry::HistogramID::AUDIO_MFT_OUTPUT_NULL_SAMPLES, 1);
});
// Non-DocGroup version of AbstractThread::MainThread is fine for Telemetry.
AbstractThread::MainThread()->Dispatch(task.forget());

View File

@ -131,7 +131,7 @@ WMFVideoMFTManager::~WMFVideoMFTManager()
LOG(nsPrintfCString("Reporting telemetry VIDEO_MFT_OUTPUT_NULL_SAMPLES=%d",
telemetry)
.get());
Telemetry::Accumulate(Telemetry::ID::VIDEO_MFT_OUTPUT_NULL_SAMPLES,
Telemetry::Accumulate(Telemetry::HistogramID::VIDEO_MFT_OUTPUT_NULL_SAMPLES,
telemetry);
});
// Non-DocGroup version of AbstractThread::MainThread is fine for Telemetry.

View File

@ -289,7 +289,7 @@ MediaDecodeTask::OnMetadataRead(MetadataHolder* aMetadata)
MOZ_LOG(gMediaDecoderLog,
LogLevel::Debug,
("Telemetry (WebAudio) MEDIA_CODEC_USED= '%s'", codec.get()));
Telemetry::Accumulate(Telemetry::ID::MEDIA_CODEC_USED, codec);
Telemetry::Accumulate(Telemetry::HistogramID::MEDIA_CODEC_USED, codec);
});
// Non-DocGroup version of AbstractThread::MainThread is fine for Telemetry.
AbstractThread::MainThread()->Dispatch(task.forget());
@ -640,4 +640,3 @@ WebAudioDecodeJob::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
}
} // namespace mozilla

View File

@ -319,7 +319,7 @@ namespace {
class TelemetryAutoTimer
{
public:
explicit TelemetryAutoTimer(Telemetry::ID aId)
explicit TelemetryAutoTimer(Telemetry::HistogramID aId)
: id(aId), start(TimeStamp::Now())
{}
@ -329,14 +329,14 @@ public:
}
private:
Telemetry::ID id;
Telemetry::HistogramID id;
const TimeStamp start;
};
} // namespace
void
StorageCache::WaitForPreload(Telemetry::ID aTelemetryID)
StorageCache::WaitForPreload(Telemetry::HistogramID aTelemetryID)
{
if (!mPersistent) {
return;

View File

@ -172,7 +172,7 @@ private:
private:
// Synchronously blocks until the cache is fully loaded from the database
void WaitForPreload(mozilla::Telemetry::ID aTelemetryID);
void WaitForPreload(mozilla::Telemetry::HistogramID aTelemetryID);
// Helper to get one of the 3 data sets (regular, private, session)
Data& DataSet(const Storage* aStorage);

View File

@ -48,12 +48,7 @@ function getPID(aBrowser) {
function getInLAProc(aBrowser) {
return ContentTask.spawn(aBrowser, null, () => {
try {
return docShell.inLargeAllocProcess;
} catch (e) {
// This must be a non-remote browser, which means it is not fresh
return false;
}
return Services.appinfo.remoteType == "webLargeAllocation";
});
}
@ -350,8 +345,46 @@ function* largeAllocSuccessTests() {
});
});
// Try dragging the tab into a new window when not at the maximum number of
// Large-Allocation processes.
yield BrowserTestUtils.withNewTab("about:blank", function*(aBrowser) {
info("Starting test 7");
let pid1 = yield getPID(aBrowser);
is(false, yield getInLAProc(aBrowser));
let ready = Promise.all([expectProcessCreated(),
BrowserTestUtils.browserLoaded(aBrowser)]);
yield ContentTask.spawn(aBrowser, TEST_URI, TEST_URI => {
content.document.location = TEST_URI;
});
yield ready;
let pid2 = yield getPID(aBrowser);
isnot(pid1, pid2, "PIDs 1 and 2 should not match");
is(true, yield getInLAProc(aBrowser));
let newWindow = yield BrowserTestUtils.openNewBrowserWindow();
newWindow.gBrowser.adoptTab(gBrowser.getTabForBrowser(aBrowser), 0);
let newTab = newWindow.gBrowser.tabs[0];
is(newTab.linkedBrowser.currentURI.spec, TEST_URI);
is(newTab.linkedBrowser.remoteType, "webLargeAllocation");
let pid3 = yield getPID(newTab.linkedBrowser);
is(pid2, pid3, "PIDs 2 and 3 should match");
is(true, yield getInLAProc(newTab.linkedBrowser));
yield BrowserTestUtils.closeWindow(newWindow);
});
// Try opening a new Large-Allocation document when at the max number of large
// allocation processes.
yield BrowserTestUtils.withNewTab("about:blank", function*(aBrowser) {
info("Starting test 8");
yield SpecialPowers.pushPrefEnv({
set: [
["dom.ipc.processCount.webLargeAllocation", 1]
@ -399,7 +432,7 @@ function* largeAllocSuccessTests() {
// view-source tabs should not be considered to be in a large-allocation process.
yield BrowserTestUtils.withNewTab("about:blank", function*(aBrowser) {
info("Starting test 8");
info("Starting test 9");
let pid1 = yield getPID(aBrowser);
is(false, yield getInLAProc(aBrowser));
@ -419,6 +452,50 @@ function* largeAllocSuccessTests() {
stopExpectNoProcess();
});
// Try dragging tab into new window when at the max number of large allocation
// processes.
yield BrowserTestUtils.withNewTab("about:blank", function*(aBrowser) {
info("Starting test 10");
yield SpecialPowers.pushPrefEnv({
set: [
["dom.ipc.processCount.webLargeAllocation", 1]
],
});
let pid1 = yield getPID(aBrowser);
is(false, yield getInLAProc(aBrowser));
let ready = Promise.all([expectProcessCreated(),
BrowserTestUtils.browserLoaded(aBrowser)]);
yield ContentTask.spawn(aBrowser, TEST_URI, TEST_URI => {
content.document.location = TEST_URI;
});
yield ready;
let pid2 = yield getPID(aBrowser);
isnot(pid1, pid2, "PIDs 1 and 2 should not match");
is(true, yield getInLAProc(aBrowser));
let newWindow = yield BrowserTestUtils.openNewBrowserWindow();
newWindow.gBrowser.adoptTab(gBrowser.getTabForBrowser(aBrowser), 0);
let newTab = newWindow.gBrowser.tabs[0];
is(newTab.linkedBrowser.currentURI.spec, TEST_URI);
is(newTab.linkedBrowser.remoteType, "webLargeAllocation");
let pid3 = yield getPID(newTab.linkedBrowser);
is(pid2, pid3, "PIDs 2 and 3 should match");
is(true, yield getInLAProc(newTab.linkedBrowser));
yield BrowserTestUtils.closeWindow(newWindow);
});
// XXX: Make sure to reset dom.ipc.processCount.webLargeAllocation if adding a
// test after the above test.
}
function* largeAllocFailTests() {

View File

@ -74,6 +74,7 @@ skip-if = (toolkit == 'android') # Disabled on Android, see bug 1230231
[test_bug1170911.html]
subsuite = clipboard
[test_bug1208217.html]
[test_bug1313753.html]
[test_clientRects.html]
[test_clipboard_disallowed.html]
[test_clipboard_events.html]

View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<meta charset=utf-8>
<title>Test for bug 1313753</title>
<script type="application/javascript"
src="/tests/SimpleTest/SimpleTest.js"></script>
<div id="log"></div>
<script>
function runTest() {
// Change visible region of |closure| element.
document.getElementById("target").classList.add("rotate");
window.setTimeout(function() {
var target = document.getElementById("target");
var bounds = target.getBoundingClientRect();
var x = bounds.x + bounds.width / 2;
var y = bounds.y + bounds.height / 2;
is(document.elementFromPoint(x, y).id, target.id,
"it should be |target| element if visible regions of closure is correct");
SimpleTest.finish();
}, 0);
}
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(runTest);
</script>
<style>
.panel {
transform: rotateX(-150deg);
backface-visibility: hidden;
transform-origin: 0px 0px;
position: absolute;
display: block;
width: 100px;
height: 100px;
background-color: green;
}
#closure .rotate {
transform: rotateX(0deg);
}
#closure {
perspective: 100px;
width: 200px;
z-index: 1;
}
#outer {
height: 400px;
width: 200px;
}
</style>
<div id="outer">
<div id="closure">
<div style="transform-style: preserve-3d;">
<div style="transform-style: preserve-3d; background-color: blue;">
<ul>
<li><div id="target" class="panel"></div>
</li>
</ul>
</div>
</div>
</div>
</div>

View File

@ -137,9 +137,14 @@ CompositableHost::Create(const TextureInfo& aTextureInfo)
}
break;
case CompositableType::CONTENT_SINGLE:
result = new ContentHostSingleBuffered(aTextureInfo);
if (gfxVars::UseWebRender()) {
result = new WebRenderImageHost(aTextureInfo);
} else {
result = new ContentHostSingleBuffered(aTextureInfo);
}
break;
case CompositableType::CONTENT_DOUBLE:
MOZ_ASSERT(!gfxVars::UseWebRender());
result = new ContentHostDoubleBuffered(aTextureInfo);
break;
default:

View File

@ -328,6 +328,10 @@ WebRenderBridgeParent::ProcessWebrenderCommands(InfallibleTArray<WebRenderComman
builder.PushImage(op.bounds(), op.clip(), op.mask().ptrOr(nullptr), op.filter(), key);
keysToDelete.push_back(key);
dSurf->Unmap();
// XXX workaround for releasing Readlock. See Bug 1339625
if(host->GetType() == CompositableType::CONTENT_SINGLE) {
host->CleanupResources();
}
break;
}
case WebRenderCommand::TOpDPPushIframe: {

View File

@ -65,9 +65,19 @@ WebRenderImageHost::UseTextureHost(const nsTArray<TimedTexture>& aTextures)
newImages.Clear();
}
void
WebRenderImageHost::UseComponentAlphaTextures(TextureHost* aTextureOnBlack,
TextureHost* aTextureOnWhite)
{
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
}
void
WebRenderImageHost::CleanupResources()
{
nsTArray<TimedImage> newImages;
mImages.SwapElements(newImages);
newImages.Clear();
}
void

View File

@ -34,7 +34,8 @@ public:
const Maybe<gfx::Polygon>& aGeometry = Nothing()) override;
virtual void UseTextureHost(const nsTArray<TimedTexture>& aTextures) override;
virtual void UseComponentAlphaTextures(TextureHost* aTextureOnBlack,
TextureHost* aTextureOnWhite) override;
virtual void RemoveTextureHost(TextureHost* aTexture) override;
virtual TextureHost* GetAsTextureHost(gfx::IntRect* aPictureRect = nullptr) override;

View File

@ -18,11 +18,13 @@ namespace layers {
using namespace mozilla::gfx;
void
WebRenderPaintedLayer::PaintThebes()
WebRenderPaintedLayer::PaintThebes(nsTArray<ReadbackProcessor::Update>* aReadbackUpdates)
{
PROFILER_LABEL("WebRenderPaintedLayer", "PaintThebes",
js::ProfileEntry::Category::GRAPHICS);
mContentClient->BeginPaint();
uint32_t flags = RotatedContentBuffer::PAINT_CAN_DRAW_ROTATED;
PaintState state =
@ -66,6 +68,9 @@ WebRenderPaintedLayer::PaintThebes()
mContentClient->ReturnDrawTargetToBuffer(target);
didUpdate = true;
}
mContentClient->EndPaint(aReadbackUpdates);
if (didUpdate) {
Mutated();
@ -100,10 +105,7 @@ WebRenderPaintedLayer::RenderLayerWithReadback(ReadbackProcessor *aReadback)
aReadback->GetPaintedLayerUpdates(this, &readbackUpdates);
}
IntPoint origin(mVisibleRegion.GetBounds().x, mVisibleRegion.GetBounds().y);
mContentClient->BeginPaint();
PaintThebes();
mContentClient->EndPaint(&readbackUpdates);
PaintThebes(&readbackUpdates);
}
void

View File

@ -52,7 +52,7 @@ public:
Layer* GetLayer() override { return this; }
void RenderLayer() override;
void PaintThebes();
void PaintThebes(nsTArray<ReadbackProcessor::Update>* aReadbackUpdates);
void RenderLayerWithReadback(ReadbackProcessor *aReadback);
RefPtr<ContentClient> mContentClient;
};

View File

@ -23,7 +23,7 @@
namespace mozilla {
namespace Telemetry {
enum ID : uint32_t;
enum HistogramID : uint32_t;
} // namespace Telemetry
namespace image {
@ -56,7 +56,7 @@ struct DecoderFinalStatus final
struct DecoderTelemetry final
{
DecoderTelemetry(const Maybe<Telemetry::ID>& aSpeedHistogram,
DecoderTelemetry(const Maybe<Telemetry::HistogramID>& aSpeedHistogram,
size_t aBytesDecoded,
uint32_t aChunkCount,
TimeDuration aDecodeTime)
@ -77,7 +77,7 @@ struct DecoderTelemetry final
/// The per-image-format telemetry ID for recording our decoder's speed, or
/// Nothing() if we don't record speed telemetry for this kind of decoder.
const Maybe<Telemetry::ID> mSpeedHistogram;
const Maybe<Telemetry::HistogramID> mSpeedHistogram;
/// The number of bytes of input our decoder processed.
const size_t mBytesDecoded;
@ -403,7 +403,7 @@ protected:
* speed, or Nothing() if we don't record speed telemetry for this kind of
* decoder.
*/
virtual Maybe<Telemetry::ID> SpeedHistogram() const { return Nothing(); }
virtual Maybe<Telemetry::HistogramID> SpeedHistogram() const { return Nothing(); }
/*

View File

@ -1083,7 +1083,7 @@ nsGIFDecoder2::SkipSubBlocks(const char* aData)
nextSubBlockLength);
}
Maybe<Telemetry::ID>
Maybe<Telemetry::HistogramID>
nsGIFDecoder2::SpeedHistogram() const
{
return Some(Telemetry::IMAGE_DECODE_SPEED_GIF);

View File

@ -29,7 +29,7 @@ protected:
IResumable* aOnResume) override;
nsresult FinishInternal() override;
Maybe<Telemetry::ID> SpeedHistogram() const override;
Maybe<Telemetry::HistogramID> SpeedHistogram() const override;
private:
friend class DecoderFactory;

View File

@ -122,7 +122,7 @@ nsJPEGDecoder::~nsJPEGDecoder()
this));
}
Maybe<Telemetry::ID>
Maybe<Telemetry::HistogramID>
nsJPEGDecoder::SpeedHistogram() const
{
return Some(Telemetry::IMAGE_DECODE_SPEED_JPEG);

View File

@ -60,7 +60,7 @@ protected:
IResumable* aOnResume) override;
nsresult FinishInternal() override;
Maybe<Telemetry::ID> SpeedHistogram() const override;
Maybe<Telemetry::HistogramID> SpeedHistogram() const override;
protected:
Orientation ReadOrientationFromEXIF();

View File

@ -1054,7 +1054,7 @@ nsPNGDecoder::warning_callback(png_structp png_ptr, png_const_charp warning_msg)
MOZ_LOG(sPNGLog, LogLevel::Warning, ("libpng warning: %s\n", warning_msg));
}
Maybe<Telemetry::ID>
Maybe<Telemetry::HistogramID>
nsPNGDecoder::SpeedHistogram() const
{
return Some(Telemetry::IMAGE_DECODE_SPEED_PNG);

View File

@ -30,7 +30,7 @@ protected:
LexerResult DoDecode(SourceBufferIterator& aIterator,
IResumable* aOnResume) override;
Maybe<Telemetry::ID> SpeedHistogram() const override;
Maybe<Telemetry::HistogramID> SpeedHistogram() const override;
private:
friend class DecoderFactory;

View File

@ -1306,6 +1306,22 @@ EnsureFlatString(JSContext* cx, unsigned argc, Value* vp)
return true;
}
static bool
RepresentativeStringArray(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
RootedObject array(cx, JS_NewArrayObject(cx, 0));
if (!array)
return false;
if (!JSString::fillWithRepresentatives(cx, array.as<ArrayObject>()))
return false;
args.rval().setObject(*array);
return true;
}
#if defined(DEBUG) || defined(JS_OOM_BREAKPOINT)
static bool
OOMThreadTypes(JSContext* cx, unsigned argc, Value* vp)
@ -4337,6 +4353,11 @@ static const JSFunctionSpecWithHelp TestingFunctions[] = {
"ensureFlatString(str)",
" Ensures str is a flat (null-terminated) string and returns it."),
JS_FN_HELP("representativeStringArray", RepresentativeStringArray, 0, 0,
"representativeStringArray()",
" Returns an array of strings that represent the various internal string\n"
" types and character encodings."),
#if defined(DEBUG) || defined(JS_OOM_BREAKPOINT)
JS_FN_HELP("oomThreadTypes", OOMThreadTypes, 0, 0,
"oomThreadTypes()",

View File

@ -15,6 +15,12 @@ ext = newExternalString("abc\0defg\0");
assertEq(ensureFlatString(ext), "abc\0defg\0");
assertEq(ensureFlatString(ext), "abc\0defg\0");
for (var s of representativeStringArray())
assertEq(ensureFlatString(s), s);
for (var s of representativeStringArray())
assertEq(newExternalString(s), s);
function testQuote() {
for (var data of [["abc", "abc"],
["abc\t", "abc\\t"],

View File

@ -1440,3 +1440,174 @@ JSFlatString::dumpRepresentation(FILE* fp, int indent) const
dumpRepresentationChars(fp, indent);
}
#endif
static void
FinalizeRepresentativeExternalString(Zone* zone, const JSStringFinalizer* fin, char16_t* chars);
static const JSStringFinalizer RepresentativeExternalStringFinalizer =
{ FinalizeRepresentativeExternalString };
static void
FinalizeRepresentativeExternalString(Zone* zone, const JSStringFinalizer* fin, char16_t* chars)
{
// Constant chars, nothing to free.
MOZ_ASSERT(fin == &RepresentativeExternalStringFinalizer);
}
template <typename CheckString, typename CharT>
static bool
FillWithRepresentatives(JSContext* cx, HandleArrayObject array, uint32_t* index,
const CharT* chars, size_t len,
size_t fatInlineMaxLength,
const CheckString& check)
{
auto AppendString =
[&check](JSContext* cx, HandleArrayObject array, uint32_t* index, HandleString s)
{
MOZ_ASSERT(check(s));
RootedValue val(cx, StringValue(s));
return JS_DefineElement(cx, array, (*index)++, val, 0);
};
MOZ_ASSERT(len > fatInlineMaxLength);
// Normal atom.
RootedString atom1(cx, AtomizeChars(cx, chars, len));
if (!atom1 || !AppendString(cx, array, index, atom1))
return false;
MOZ_ASSERT(atom1->isAtom());
// Inline atom.
RootedString atom2(cx, AtomizeChars(cx, chars, 2));
if (!atom2 || !AppendString(cx, array, index, atom2))
return false;
MOZ_ASSERT(atom2->isAtom());
MOZ_ASSERT(atom2->isInline());
// Fat inline atom.
RootedString atom3(cx, AtomizeChars(cx, chars, fatInlineMaxLength));
if (!atom3 || !AppendString(cx, array, index, atom3))
return false;
MOZ_ASSERT(atom3->isAtom());
MOZ_ASSERT(atom3->isFatInline());
// Normal flat string.
RootedString flat1(cx, NewStringCopyN<CanGC>(cx, chars, len));
if (!flat1 || !AppendString(cx, array, index, flat1))
return false;
MOZ_ASSERT(flat1->isFlat());
// Inline string.
RootedString flat2(cx, NewStringCopyN<CanGC>(cx, chars, 3));
if (!flat2 || !AppendString(cx, array, index, flat2))
return false;
MOZ_ASSERT(flat2->isFlat());
MOZ_ASSERT(flat2->isInline());
// Fat inline string.
RootedString flat3(cx, NewStringCopyN<CanGC>(cx, chars, fatInlineMaxLength));
if (!flat3 || !AppendString(cx, array, index, flat3))
return false;
MOZ_ASSERT(flat3->isFlat());
MOZ_ASSERT(flat3->isFatInline());
// Rope.
RootedString rope(cx, ConcatStrings<CanGC>(cx, atom1, atom3));
if (!rope || !AppendString(cx, array, index, rope))
return false;
MOZ_ASSERT(rope->isRope());
// Dependent.
RootedString dep(cx, NewDependentString(cx, atom1, 0, len - 2));
if (!dep || !AppendString(cx, array, index, dep))
return false;
MOZ_ASSERT(dep->isDependent());
// Undepended.
RootedString undep(cx, NewDependentString(cx, atom1, 0, len - 3));
if (!undep || !undep->ensureFlat(cx) || !AppendString(cx, array, index, undep))
return false;
MOZ_ASSERT(undep->isUndepended());
// Extensible.
RootedString temp1(cx, NewStringCopyN<CanGC>(cx, chars, len));
if (!temp1)
return false;
RootedString extensible(cx, ConcatStrings<CanGC>(cx, temp1, atom3));
if (!extensible || !extensible->ensureLinear(cx))
return false;
if (!AppendString(cx, array, index, extensible))
return false;
MOZ_ASSERT(extensible->isExtensible());
// External. Note that we currently only support TwoByte external strings.
RootedString external1(cx), external2(cx);
if (IsSame<CharT, char16_t>::value) {
external1 = JS_NewExternalString(cx, (const char16_t*)chars, len,
&RepresentativeExternalStringFinalizer);
if (!external1 || !AppendString(cx, array, index, external1))
return false;
MOZ_ASSERT(external1->isExternal());
external2 = JS_NewExternalString(cx, (const char16_t*)chars, 2,
&RepresentativeExternalStringFinalizer);
if (!external2 || !AppendString(cx, array, index, external2))
return false;
MOZ_ASSERT(external2->isExternal());
}
// Assert the strings still have the types we expect after creating the
// other strings.
MOZ_ASSERT(atom1->isAtom());
MOZ_ASSERT(atom2->isAtom());
MOZ_ASSERT(atom3->isAtom());
MOZ_ASSERT(atom2->isInline());
MOZ_ASSERT(atom3->isFatInline());
MOZ_ASSERT(flat1->isFlat());
MOZ_ASSERT(flat2->isFlat());
MOZ_ASSERT(flat3->isFlat());
MOZ_ASSERT(flat2->isInline());
MOZ_ASSERT(flat3->isFatInline());
MOZ_ASSERT(rope->isRope());
MOZ_ASSERT(dep->isDependent());
MOZ_ASSERT(undep->isUndepended());
MOZ_ASSERT(extensible->isExtensible());
MOZ_ASSERT_IF(external1, external1->isExternal());
MOZ_ASSERT_IF(external2, external2->isExternal());
return true;
}
/* static */ bool
JSString::fillWithRepresentatives(JSContext* cx, HandleArrayObject array)
{
uint32_t index = 0;
auto CheckTwoByte = [](JSString* str) { return str->hasTwoByteChars(); };
auto CheckLatin1 = [](JSString* str) { return str->hasLatin1Chars(); };
// Append TwoByte strings.
static const char16_t twoByteChars[] = u"\u1234abc\0def\u5678ghijklmasdfa\0xyz0123456789";
if (!FillWithRepresentatives(cx, array, &index,
twoByteChars, mozilla::ArrayLength(twoByteChars) - 1,
JSFatInlineString::MAX_LENGTH_TWO_BYTE,
CheckTwoByte))
{
return false;
}
// Append Latin1 strings.
static const Latin1Char latin1Chars[] = "abc\0defghijklmasdfa\0xyz0123456789";
if (!FillWithRepresentatives(cx, array, &index,
latin1Chars, mozilla::ArrayLength(latin1Chars) - 1,
JSFatInlineString::MAX_LENGTH_LATIN1,
CheckLatin1))
{
return false;
}
MOZ_ASSERT(index == 22);
return true;
}

View File

@ -467,6 +467,10 @@ class JSString : public js::gc::TenuredCell
return *(JSAtom*)this;
}
// Fills |array| with various strings that represent the different string
// kinds and character encodings.
static bool fillWithRepresentatives(JSContext* cx, js::HandleArrayObject array);
/* Only called by the GC for dependent or undepended strings. */
inline bool hasBase() const {

View File

@ -1660,7 +1660,7 @@ nsPresContext::RecordInteractionTime(InteractionType aType,
// Array of histogram IDs for the different interaction types,
// keyed by InteractionType.
Telemetry::ID histogramIds[] = {
Telemetry::HistogramID histogramIds[] = {
Telemetry::TIME_TO_FIRST_CLICK_MS,
Telemetry::TIME_TO_FIRST_KEY_INPUT_MS,
Telemetry::TIME_TO_FIRST_MOUSE_MOVE_MS,

View File

@ -5,4 +5,4 @@ Makefile.in build files for the Mozilla build system.
The cubeb git repository is: git://github.com/kinetiknz/cubeb.git
The git commit ID used was 21e96ac7fd456dc957cd9947a61da1366a1f862d.
The git commit ID used was 8977c13bf0dab9a7716501ae92ca5945fe4e1dae.

View File

@ -717,7 +717,8 @@ TEST(cubeb, resampler_passthrough_duplex_callback_reordering)
output_seq_idx += BUF_BASE_SIZE;
ASSERT_EQ(prebuffer_frames, static_cast<long>(ARRAY_LENGTH(input_buffer_prebuffer) / input_params.channels));
// prebuffer_frames will hold the frames used by the resampler.
ASSERT_EQ(prebuffer_frames, BUF_BASE_SIZE);
ASSERT_EQ(got, BUF_BASE_SIZE);
for (uint32_t i = 0; i < 300; i++) {

View File

@ -49,6 +49,16 @@ typedef UInt32 AudioFormatFlags;
const char * DISPATCH_QUEUE_LABEL = "org.mozilla.cubeb";
#ifdef ALOGV
#undef ALOGV
#endif
#define ALOGV(msg, ...) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{LOGV(msg, ##__VA_ARGS__);})
#ifdef ALOG
#undef ALOG
#endif
#define ALOG(msg, ...) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{LOG(msg, ##__VA_ARGS__);})
/* Testing empirically, some headsets report a minimal latency that is very
* low, but this does not work in practice. Lie and say the minimum is 256
* frames. */
@ -221,13 +231,17 @@ struct cubeb_stream {
/* Hold the input samples in every
* input callback iteration */
std::unique_ptr<auto_array_wrapper> input_linear_buffer;
// After the resampling some input data remains stored inside
// the resampler. This number is used in order to calculate
// the number of extra silence frames in input.
std::atomic<uint32_t> available_input_frames{ 0 };
/* Frames on input buffer */
std::atomic<uint32_t> input_buffer_frames{ 0 };
/* Frame counters */
std::atomic<uint64_t> frames_played{ 0 };
uint64_t frames_queued = 0;
std::atomic<int64_t> frames_read{ 0 };
std::atomic<bool> shutdown{ false };
std::atomic<bool> shutdown{ true };
std::atomic<bool> draining{ false };
/* Latency requested by the user. */
uint32_t latency_frames = 0;
@ -235,11 +249,6 @@ struct cubeb_stream {
uint64_t hw_latency_frames = UINT64_MAX;
std::atomic<float> panning{ 0 };
std::unique_ptr<cubeb_resampler, decltype(&cubeb_resampler_destroy)> resampler;
/* This is the number of output callback we got in a row. This is usually one,
* but can be two when the input and output rate are different, and more when
* a device has been plugged or unplugged, as there can be some time before
* the device is ready. */
std::atomic<int> output_callback_in_a_row{ 0 };
/* This is true if a device change callback is currently running. */
std::atomic<bool> switching_device{ false };
std::atomic<bool> buffer_size_change_state{ false };
@ -377,16 +386,18 @@ audiounit_render_input(cubeb_stream * stm,
stm->input_linear_buffer->push(input_buffer_list.mBuffers[0].mData,
input_frames * stm->input_desc.mChannelsPerFrame);
LOGV("(%p) input: buffers %u, size %u, channels %u, frames %d.",
/* Advance input frame counter. */
assert(input_frames > 0);
stm->frames_read += input_frames;
stm->available_input_frames += input_frames;
ALOGV("(%p) input: buffers %u, size %u, channels %u, rendered frames %d, total frames %d.",
stm,
(unsigned int) input_buffer_list.mNumberBuffers,
(unsigned int) input_buffer_list.mBuffers[0].mDataByteSize,
(unsigned int) input_buffer_list.mBuffers[0].mNumberChannels,
(unsigned int) input_frames);
/* Advance input frame counter. */
assert(input_frames > 0);
stm->frames_read += input_frames;
(unsigned int) input_frames,
stm->available_input_frames.load());
return noErr;
}
@ -405,19 +416,10 @@ audiounit_input_callback(void * user_ptr,
assert(AU_IN_BUS == bus);
if (stm->shutdown) {
LOG("(%p) input shutdown", stm);
ALOG("(%p) input shutdown", stm);
return noErr;
}
// This happens when we're finally getting a new input callback after having
// switched device, we can clear the input buffer now, only keeping the data
// we just got.
if (stm->output_callback_in_a_row > stm->expected_output_callbacks_in_a_row) {
stm->input_linear_buffer->pop(
stm->input_linear_buffer->length() -
input_frames * stm->input_stream_params.channels);
}
OSStatus r = audiounit_render_input(stm, flags, tstamp, bus, input_frames);
if (r != noErr) {
return r;
@ -425,7 +427,6 @@ audiounit_input_callback(void * user_ptr,
// Full Duplex. We'll call data_callback in the AudioUnit output callback.
if (stm->output_unit != NULL) {
stm->output_callback_in_a_row = 0;
return noErr;
}
@ -449,6 +450,12 @@ audiounit_input_callback(void * user_ptr,
return noErr;
}
static uint32_t
minimum_resampling_input_frames(cubeb_stream *stm)
{
return ceilf(stm->input_hw_rate / stm->output_hw_rate * stm->input_buffer_frames);
}
static bool
is_extra_input_needed(cubeb_stream * stm)
{
@ -457,17 +464,8 @@ is_extra_input_needed(cubeb_stream * stm)
* Otherwise, if we had more than expected callbacks in a row, or we're currently
* switching, we add some silence as well to compensate for the fact that
* we're lacking some input data. */
/* If resampling is taking place after every output callback
* the input buffer expected to be empty. Any frame left over
* from resampling is stored inside the resampler available to
* be used in next iteration as needed.
* BUT when noop_resampler is operating we have left over
* frames since it does not store anything internally. */
return stm->frames_read == 0 ||
(stm->input_linear_buffer->length() == 0 &&
(stm->output_callback_in_a_row > stm->expected_output_callbacks_in_a_row ||
stm->switching_device));
stm->available_input_frames.load() < minimum_resampling_input_frames(stm);
}
static OSStatus
@ -483,20 +481,19 @@ audiounit_output_callback(void * user_ptr,
cubeb_stream * stm = static_cast<cubeb_stream *>(user_ptr);
stm->output_callback_in_a_row++;
ALOGV("(%p) output: buffers %u, size %u, channels %u, frames %u, total input frames %d.",
stm,
(unsigned int) outBufferList->mNumberBuffers,
(unsigned int) outBufferList->mBuffers[0].mDataByteSize,
(unsigned int) outBufferList->mBuffers[0].mNumberChannels,
(unsigned int) output_frames,
stm->available_input_frames.load());
LOGV("(%p) output: buffers %u, size %u, channels %u, frames %u.",
stm,
(unsigned int) outBufferList->mNumberBuffers,
(unsigned int) outBufferList->mBuffers[0].mDataByteSize,
(unsigned int) outBufferList->mBuffers[0].mNumberChannels,
(unsigned int) output_frames);
long input_frames = 0;
long input_frames = 0, input_frames_before_fill = 0;
void * output_buffer = NULL, * input_buffer = NULL;
if (stm->shutdown) {
LOG("(%p) output shutdown.", stm);
ALOG("(%p) output shutdown.", stm);
audiounit_make_silent(&outBufferList->mBuffers[0]);
return noErr;
}
@ -518,16 +515,19 @@ audiounit_output_callback(void * user_ptr,
/* If Full duplex get also input buffer */
if (stm->input_unit != NULL) {
if (is_extra_input_needed(stm)) {
uint32_t min_input_frames_required = ceilf(stm->input_hw_rate / stm->output_hw_rate *
stm->input_buffer_frames);
stm->input_linear_buffer->push_silence(min_input_frames_required * stm->input_desc.mChannelsPerFrame);
LOG("(%p) %s pushed %u frames of input silence.", stm, stm->frames_read == 0 ? "Input hasn't started," :
stm->switching_device ? "Device switching," : "Drop out,", min_input_frames_required);
uint32_t min_input_frames = minimum_resampling_input_frames(stm);
stm->input_linear_buffer->push_silence(min_input_frames * stm->input_desc.mChannelsPerFrame);
stm->available_input_frames += min_input_frames;
ALOG("(%p) %s pushed %u frames of input silence.", stm, stm->frames_read == 0 ? "Input hasn't started," :
stm->switching_device ? "Device switching," : "Drop out,", min_input_frames);
}
// The input buffer
input_buffer = stm->input_linear_buffer->data();
// Number of input frames in the buffer
// Number of input frames in the buffer. It will change to actually used frames
// inside fill
input_frames = stm->input_linear_buffer->length() / stm->input_desc.mChannelsPerFrame;
// Number of input frames pushed inside resampler.
input_frames_before_fill = input_frames;
}
/* Call user callback through resampler. */
@ -538,7 +538,11 @@ audiounit_output_callback(void * user_ptr,
output_frames);
if (input_buffer) {
stm->input_linear_buffer->pop(input_frames * stm->input_desc.mChannelsPerFrame);
// Decrease counter by the number of frames used by resampler
stm->available_input_frames -= input_frames;
assert(stm->available_input_frames.load() >= 0);
// Pop from the buffer the frames pushed to the resampler.
stm->input_linear_buffer->pop(input_frames_before_fill * stm->input_desc.mChannelsPerFrame);
}
if (outframes < 0) {
@ -714,6 +718,9 @@ audiounit_property_listener_callback(AudioObjectID /* id */, UInt32 address_coun
case kAudioDevicePropertyDataSource:
LOG("Event[%u] - mSelector == kAudioHardwarePropertyDataSource", (unsigned int) i);
break;
default:
LOG("Event[%u] - mSelector == Unexpected Event id %d, return", (unsigned int) i, addresses[i].mSelector);
return noErr;
}
}
@ -890,6 +897,16 @@ audiounit_uninstall_device_changed_callback(cubeb_stream * stm)
if (r != noErr) {
return CUBEB_ERROR;
}
/* Event to notify when the input is going away. */
AudioDeviceID dev = stm->input_device ? stm->input_device :
audiounit_get_default_device_id(CUBEB_DEVICE_TYPE_INPUT);
r = audiounit_remove_listener(stm, dev, kAudioDevicePropertyDeviceIsAlive,
kAudioObjectPropertyScopeGlobal, &audiounit_property_listener_callback);
if (r != noErr) {
PRINT_ERROR_CODE("AudioObjectRemovePropertyListener/input/kAudioDevicePropertyDeviceIsAlive", r);
return CUBEB_ERROR;
}
}
return CUBEB_OK;
}
@ -1301,18 +1318,8 @@ audiounit_init_input_linear_buffer(cubeb_stream * stream, uint32_t capacity)
} else {
stream->input_linear_buffer.reset(new auto_array_wrapper_impl<float>(size));
}
assert(stream->input_linear_buffer->length() == 0);
// Pre-buffer silence if needed
if (capacity != 1) {
size_t silence_size = stream->input_buffer_frames *
stream->input_desc.mChannelsPerFrame;
stream->input_linear_buffer->push_silence(silence_size);
assert(stream->input_linear_buffer->length() == silence_size);
}
return CUBEB_OK;
}

View File

@ -72,6 +72,7 @@ long passthrough_resampler<T>::fill(void * input_buffer, long * input_frames_cou
if (input_buffer) {
internal_input_buffer.pop(nullptr, frames_to_samples(output_frames));
*input_frames_count = output_frames;
}
return rv;
@ -179,7 +180,7 @@ cubeb_resampler_speex<T, InputProcessor, OutputProcessor>
/* process the input, and present exactly `output_frames_needed` in the
* callback. */
input_processor->input(input_buffer, *input_frames_count);
resampled_input = input_processor->output(resampled_frame_count);
resampled_input = input_processor->output(resampled_frame_count, (size_t*)input_frames_count);
long got = data_callback(stream, user_ptr,
resampled_input, nullptr, resampled_frame_count);
@ -226,7 +227,7 @@ cubeb_resampler_speex<T, InputProcessor, OutputProcessor>
* callback. */
input_processor->input(in_buffer, *input_frames_count);
resampled_input =
input_processor->output(output_frames_before_processing);
input_processor->output(output_frames_before_processing, (size_t*)input_frames_count);
} else {
resampled_input = nullptr;
}

View File

@ -222,7 +222,7 @@ public:
/** Returns a buffer containing exactly `output_frame_count` resampled frames.
* The consumer should not hold onto the pointer. */
T * output(size_t output_frame_count)
T * output(size_t output_frame_count, size_t * input_frames_used)
{
if (resampling_out_buffer.capacity() < frames_to_samples(output_frame_count)) {
resampling_out_buffer.reserve(frames_to_samples(output_frame_count));
@ -239,6 +239,7 @@ public:
/* This shifts back any unresampled samples to the beginning of the input
buffer. */
resampling_in_buffer.pop(nullptr, frames_to_samples(in_len));
*input_frames_used = in_len;
return resampling_out_buffer.data();
}
@ -376,7 +377,7 @@ public:
* @parameter frames_needed the number of frames to be returned.
* @return a buffer containing the delayed frames. The consumer should not
* hold onto the pointer. */
T * output(uint32_t frames_needed)
T * output(uint32_t frames_needed, size_t * input_frames_used)
{
if (delay_output_buffer.capacity() < frames_to_samples(frames_needed)) {
delay_output_buffer.reserve(frames_to_samples(frames_needed));
@ -386,6 +387,7 @@ public:
delay_output_buffer.push(delay_input_buffer.data(),
frames_to_samples(frames_needed));
delay_input_buffer.pop(nullptr, frames_to_samples(frames_needed));
*input_frames_used = frames_needed;
return delay_output_buffer.data();
}

View File

@ -254,7 +254,7 @@ EverySecondTelemetryCallback_s(nsAutoPtr<RTCStatsQueries> aQueryList) {
bool isAudio = (s.mId.Value().Find("audio") != -1);
if (s.mPacketsLost.WasPassed() && s.mPacketsReceived.WasPassed() &&
(s.mPacketsLost.Value() + s.mPacketsReceived.Value()) != 0) {
ID id;
HistogramID id;
if (s.mIsRemote) {
id = isAudio ? WEBRTC_AUDIO_QUALITY_OUTBOUND_PACKETLOSS_RATE :
WEBRTC_VIDEO_QUALITY_OUTBOUND_PACKETLOSS_RATE;
@ -268,7 +268,7 @@ EverySecondTelemetryCallback_s(nsAutoPtr<RTCStatsQueries> aQueryList) {
(s.mPacketsLost.Value() + s.mPacketsReceived.Value()));
}
if (s.mJitter.WasPassed()) {
ID id;
HistogramID id;
if (s.mIsRemote) {
id = isAudio ? WEBRTC_AUDIO_QUALITY_OUTBOUND_JITTER :
WEBRTC_VIDEO_QUALITY_OUTBOUND_JITTER;
@ -280,8 +280,8 @@ EverySecondTelemetryCallback_s(nsAutoPtr<RTCStatsQueries> aQueryList) {
}
if (s.mMozRtt.WasPassed()) {
MOZ_ASSERT(s.mIsRemote);
ID id = isAudio ? WEBRTC_AUDIO_QUALITY_OUTBOUND_RTT :
WEBRTC_VIDEO_QUALITY_OUTBOUND_RTT;
HistogramID id = isAudio ? WEBRTC_AUDIO_QUALITY_OUTBOUND_RTT :
WEBRTC_VIDEO_QUALITY_OUTBOUND_RTT;
Accumulate(id, s.mMozRtt.Value());
}
if (lastInboundStats && s.mBytesReceived.WasPassed()) {
@ -295,7 +295,7 @@ EverySecondTelemetryCallback_s(nsAutoPtr<RTCStatsQueries> aQueryList) {
// In theory we're called every second, so delta *should* be in that range.
// Small deltas could cause errors due to division
if (delta_ms > 500 && delta_ms < 60000) {
ID id;
HistogramID id;
if (s.mIsRemote) {
id = isAudio ? WEBRTC_AUDIO_QUALITY_OUTBOUND_BANDWIDTH_KBITS :
WEBRTC_VIDEO_QUALITY_OUTBOUND_BANDWIDTH_KBITS;

View File

@ -9,6 +9,7 @@
#include "mozilla/ArrayUtils.h"
#include "mozilla/Assertions.h"
#include "mozilla/IntegerPrintfMacros.h"
#include "mozilla/ScopeExit.h"
#include "mozilla/StackWalk.h"
#include <string.h>
@ -337,6 +338,20 @@ WalkStackMain64(struct WalkStackData* aData)
frame64.AddrReturn.Mode = AddrModeFlat;
#endif
#ifdef _WIN64
// Workaround possible deadlock where the thread we're profiling happens to
// be in RtlLookupFunctionEntry (see below) or in RtlAddFunctionTable or
// RtlDeleteFunctionTable when starting or shutting down the JS engine.
// On Win64 each of these Rtl* functions will take a lock, so we need to make
// sure we don't deadlock when a suspended thread is holding it.
if (!TryAcquireStackWalkWorkaroundLock()) {
return;
}
auto releaseLock = mozilla::MakeScopeExit([] {
ReleaseStackWalkWorkaroundLock();
});
#endif
// Skip our own stack walking frames.
int skip = (aData->walkCallingThread ? 3 : 0) + aData->skipFrames;

View File

@ -3232,11 +3232,11 @@ nsSocketTransport::CloseSocket(PRFileDesc *aFd, bool aTelemetryEnabled)
void
nsSocketTransport::SendPRBlockingTelemetry(PRIntervalTime aStart,
Telemetry::ID aIDNormal,
Telemetry::ID aIDShutdown,
Telemetry::ID aIDConnectivityChange,
Telemetry::ID aIDLinkChange,
Telemetry::ID aIDOffline)
Telemetry::HistogramID aIDNormal,
Telemetry::HistogramID aIDShutdown,
Telemetry::HistogramID aIDConnectivityChange,
Telemetry::HistogramID aIDLinkChange,
Telemetry::HistogramID aIDOffline)
{
PRIntervalTime now = PR_IntervalNow();
if (gIOService->IsNetTearingDown()) {

View File

@ -171,11 +171,11 @@ public:
uint64_t ByteCountSent() override { return mOutput.ByteCount(); }
static void CloseSocket(PRFileDesc *aFd, bool aTelemetryEnabled);
static void SendPRBlockingTelemetry(PRIntervalTime aStart,
Telemetry::ID aIDNormal,
Telemetry::ID aIDShutdown,
Telemetry::ID aIDConnectivityChange,
Telemetry::ID aIDLinkChange,
Telemetry::ID aIDOffline);
Telemetry::HistogramID aIDNormal,
Telemetry::HistogramID aIDShutdown,
Telemetry::HistogramID aIDConnectivityChange,
Telemetry::HistogramID aIDLinkChange,
Telemetry::HistogramID aIDOffline);
protected:
virtual ~nsSocketTransport();

View File

@ -2646,10 +2646,10 @@ nsCacheService::Lock()
}
void
nsCacheService::Lock(mozilla::Telemetry::ID mainThreadLockerID)
nsCacheService::Lock(mozilla::Telemetry::HistogramID mainThreadLockerID)
{
mozilla::Telemetry::ID lockerID;
mozilla::Telemetry::ID generalID;
mozilla::Telemetry::HistogramID lockerID;
mozilla::Telemetry::HistogramID generalID;
if (NS_IsMainThread()) {
lockerID = mainThreadLockerID;

View File

@ -255,7 +255,7 @@ private:
*/
static void Lock();
static void Lock(::mozilla::Telemetry::ID mainThreadLockerID);
static void Lock(::mozilla::Telemetry::HistogramID mainThreadLockerID);
static void Unlock();
void LockAcquired();
void LockReleased();
@ -381,7 +381,7 @@ public:
nsCacheServiceAutoLock() {
nsCacheService::Lock();
}
explicit nsCacheServiceAutoLock(mozilla::Telemetry::ID mainThreadLockerID) {
explicit nsCacheServiceAutoLock(mozilla::Telemetry::HistogramID mainThreadLockerID) {
nsCacheService::Lock(mainThreadLockerID);
}
~nsCacheServiceAutoLock() {

View File

@ -49,7 +49,7 @@ void CacheIOTelemetry::Report(uint32_t aLevel, CacheIOTelemetry::size_type aLeng
return;
}
static Telemetry::ID telemetryID[] = {
static Telemetry::HistogramID telemetryID[] = {
Telemetry::HTTP_CACHE_IO_QUEUE_2_OPEN_PRIORITY,
Telemetry::HTTP_CACHE_IO_QUEUE_2_READ_PRIORITY,
Telemetry::HTTP_CACHE_IO_QUEUE_2_MANAGEMENT,

View File

@ -1483,7 +1483,7 @@ nsHostResolver::ThreadFunc(void *arg)
uint32_t millis = static_cast<uint32_t>(elapsed.ToMilliseconds());
if (NS_SUCCEEDED(status)) {
Telemetry::ID histogramID;
Telemetry::HistogramID histogramID;
if (!rec->addr_info_gencnt) {
// Time for initial lookup.
histogramID = Telemetry::DNS_LOOKUP_TIME;

View File

@ -19,6 +19,7 @@
#include "nsHttpChannel.h"
#include "LoadInfo.h"
#include "mozilla/Unused.h"
#include "nsQueryObject.h"
namespace mozilla {
namespace net {
@ -129,7 +130,9 @@ HSTSPrimingListener::CheckHSTSPrimingRequestStatus(nsIRequest* aRequest)
}
bool synthesized = false;
nsHttpChannel* rawHttpChannel = static_cast<nsHttpChannel*>(httpChannel.get());
RefPtr<nsHttpChannel> rawHttpChannel = do_QueryObject(httpChannel);
NS_ENSURE_STATE(rawHttpChannel);
rv = rawHttpChannel->GetResponseSynthesized(&synthesized);
NS_ENSURE_SUCCESS(rv, rv);
if (synthesized) {

View File

@ -86,9 +86,9 @@ protected:
uint32_t mPeakSize;
uint32_t mPeakCount;
MOZ_INIT_OUTSIDE_CTOR
Telemetry::ID mPeakSizeID;
Telemetry::HistogramID mPeakSizeID;
MOZ_INIT_OUTSIDE_CTOR
Telemetry::ID mPeakCountID;
Telemetry::HistogramID mPeakCountID;
private:
RefPtr<HpackDynamicTableReporter> mDynamicReporter;

View File

@ -2723,12 +2723,6 @@ HttpBaseChannel::GetIntegrityMetadata(nsAString& aIntegrityMetadata)
return NS_OK;
}
mozilla::net::nsHttpChannel*
HttpBaseChannel::QueryHttpChannelImpl(void)
{
return nullptr;
}
//-----------------------------------------------------------------------------
// HttpBaseChannel::nsISupportsPriority
//-----------------------------------------------------------------------------

View File

@ -252,7 +252,6 @@ public:
NS_IMETHOD GetConnectionInfoHashKey(nsACString& aConnectionInfoHashKey) override;
NS_IMETHOD GetIntegrityMetadata(nsAString& aIntegrityMetadata) override;
NS_IMETHOD SetIntegrityMetadata(const nsAString& aIntegrityMetadata) override;
virtual mozilla::net::nsHttpChannel * QueryHttpChannelImpl(void) override;
inline void CleanRedirectCacheChainIfNecessary()
{

View File

@ -40,6 +40,7 @@
#include "nsIWindowWatcher.h"
#include "nsIDocument.h"
#include "nsStringStream.h"
#include "nsQueryObject.h"
using mozilla::BasePrincipal;
using namespace mozilla::dom;
@ -366,13 +367,14 @@ HttpChannelParent::DoAsyncOpen( const URIParams& aURI,
nsCOMPtr<nsIChannel> channel;
rv = NS_NewChannelInternal(getter_AddRefs(channel), uri, loadInfo,
nullptr, nullptr, aLoadFlags, ios);
if (NS_FAILED(rv))
if (NS_FAILED(rv)) {
return SendFailedAsyncOpen(rv);
}
// This cast is safe since this is AsyncOpen specific to http. channel
// is ensured to be nsHttpChannel.
mChannel = static_cast<nsHttpChannel *>(channel.get());
mChannel = do_QueryObject(channel, &rv);
if (NS_FAILED(rv)) {
return SendFailedAsyncOpen(rv);
}
// Set the channelId allocated in child to the parent instance
mChannel->SetChannelId(aChannelId);
@ -601,11 +603,13 @@ HttpChannelParent::ConnectChannel(const uint32_t& registrarId, const bool& shoul
return true;
}
// It's safe to cast here since the found parent-side real channel is ensured
// to be http (nsHttpChannel). ConnectChannel called from HttpChannelParent::Init
// can only be called for http channels. It's bound by ipdl.
mChannel = static_cast<nsHttpChannel*>(channel.get());
LOG((" found channel %p, rv=%08" PRIx32, mChannel.get(), static_cast<uint32_t>(rv)));
LOG((" found channel %p, rv=%08" PRIx32, channel.get(), static_cast<uint32_t>(rv)));
mChannel = do_QueryObject(channel);
if (!mChannel) {
LOG((" but it's not nsHttpChannel"));
Delete();
return true;
}
nsCOMPtr<nsINetworkInterceptController> controller;
NS_QueryNotificationCallbacks(channel, controller);
@ -1102,14 +1106,7 @@ HttpChannelParent::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext)
MOZ_RELEASE_ASSERT(!mDivertingFromChild,
"Cannot call OnStartRequest if diverting is set!");
// We can't cast here since the new channel can be a redirect to a different
// schema. We must query the channel implementation through a special method.
nsHttpChannel *chan = nullptr;
nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal(do_QueryInterface(aRequest));
if (httpChannelInternal) {
chan = httpChannelInternal->QueryHttpChannelImpl();
}
RefPtr<nsHttpChannel> chan = do_QueryObject(aRequest);
if (!chan) {
LOG((" aRequest is not nsHttpChannel"));
NS_ERROR("Expecting only nsHttpChannel as aRequest in HttpChannelParent::OnStartRequest");

View File

@ -6274,12 +6274,6 @@ nsHttpChannel::ForceIntercepted(uint64_t aInterceptionID)
return NS_OK;
}
mozilla::net::nsHttpChannel*
nsHttpChannel::QueryHttpChannelImpl(void)
{
return this;
}
//-----------------------------------------------------------------------------
// nsHttpChannel::nsISupportsPriority
//-----------------------------------------------------------------------------

View File

@ -152,7 +152,6 @@ public:
// nsIHttpChannelInternal
NS_IMETHOD SetupFallbackChannel(const char *aFallbackKey) override;
NS_IMETHOD ForceIntercepted(uint64_t aInterceptionID) override;
virtual mozilla::net::nsHttpChannel * QueryHttpChannelImpl(void) override;
// nsISupportsPriority
NS_IMETHOD SetPriority(int32_t value) override;
// nsIClassOfService

View File

@ -1597,7 +1597,8 @@ nsHttpConnection::Version()
//-----------------------------------------------------------------------------
void
nsHttpConnection::CloseTransaction(nsAHttpTransaction *trans, nsresult reason)
nsHttpConnection::CloseTransaction(nsAHttpTransaction *trans, nsresult reason,
bool aIsShutdown)
{
LOG(("nsHttpConnection::CloseTransaction[this=%p trans=%p reason=%" PRIx32 "]\n",
this, trans, static_cast<uint32_t>(reason)));
@ -1633,7 +1634,7 @@ nsHttpConnection::CloseTransaction(nsAHttpTransaction *trans, nsresult reason)
}
if (NS_FAILED(reason) && (reason != NS_BINDING_RETARGETED)) {
Close(reason);
Close(reason, aIsShutdown);
}
// flag the connection as reused here for convenience sake. certainly

View File

@ -128,7 +128,7 @@ public:
// nsAHttpConnection compatible methods (non-virtual):
nsresult OnHeadersAvailable(nsAHttpTransaction *, nsHttpRequestHead *, nsHttpResponseHead *, bool *reset);
void CloseTransaction(nsAHttpTransaction *, nsresult reason);
void CloseTransaction(nsAHttpTransaction *, nsresult reason, bool aIsShutdown = false);
void GetConnectionInfo(nsHttpConnectionInfo **ci) { NS_IF_ADDREF(*ci = mConnInfo); }
nsresult TakeTransport(nsISocketTransport **,
nsIAsyncInputStream **,

View File

@ -2149,7 +2149,10 @@ nsHttpConnectionMgr::OnMsgShutdown(int32_t, ARefBase *param)
RefPtr<nsHttpConnection> conn(ent->mActiveConns[0]);
ent->mActiveConns.RemoveElementAt(0);
DecrementActiveConnCount(conn);
conn->Close(NS_ERROR_ABORT, true);
// Since nsHttpConnection::Close doesn't break the bond with
// the connection's transaction, we must explicitely tell it
// to close its transaction and not just self.
conn->CloseTransaction(conn->Transaction(), NS_ERROR_ABORT, true);
}
// Close all idle connections.

View File

@ -9,12 +9,10 @@
#include "nsTArrayForwardDeclare.h"
template<class T> class nsCOMArray;
class nsCString;
namespace mozilla { namespace net { class nsHttpChannel; } }
%}
[ptr] native StringArray(nsTArray<nsCString>);
[ref] native StringArrayRef(const nsTArray<nsCString>);
[ref] native securityMessagesArray(nsCOMArray<nsISecurityConsoleMessage>);
[ptr] native nsHttpChannelPtr(mozilla::net::nsHttpChannel);
interface nsIAsyncInputStream;
interface nsIAsyncOutputStream;
@ -305,10 +303,4 @@ interface nsIHttpChannelInternal : nsISupports
* The connection info's hash key. We use it to test connection separation.
*/
readonly attribute ACString connectionInfoHashKey;
/**
* Returns nsHttpChannel (self) when this actually is implementing nsHttpChannel.
*/
[noscript, notxpcom, nostdcall]
nsHttpChannelPtr queryHttpChannelImpl();
};

View File

@ -1015,15 +1015,9 @@ nsViewSourceChannel::SetIsMainDocumentChannel(bool aValue)
mHttpChannel->SetIsMainDocumentChannel(aValue);
}
// Have to manually forward since these are [notxpcom]
// Have to manually forward SetCorsPreflightParameters since it's [notxpcom]
void
nsViewSourceChannel::SetCorsPreflightParameters(const nsTArray<nsCString>& aUnsafeHeaders)
{
mHttpChannelInternal->SetCorsPreflightParameters(aUnsafeHeaders);
}
mozilla::net::nsHttpChannel *
nsViewSourceChannel::QueryHttpChannelImpl()
{
return mHttpChannelInternal->QueryHttpChannelImpl();
}

View File

@ -22,6 +22,7 @@ const FLAG_WRONG_PASSWORD = 1 << 1;
const FLAG_BOGUS_USER = 1 << 2;
const FLAG_PREVIOUS_FAILED = 1 << 3;
const CROSS_ORIGIN = 1 << 4;
const FLAG_NO_REALM = 1 << 5;
const nsIAuthPrompt2 = Components.interfaces.nsIAuthPrompt2;
const nsIAuthInformation = Components.interfaces.nsIAuthInformation;
@ -51,8 +52,10 @@ AuthPrompt1.prototype = {
promptUsernameAndPassword:
function ap1_promptUP(title, text, realm, savePW, user, pw)
{
// Note that the realm here isn't actually the realm. it's a pw mgr key.
do_check_eq(URL + " (" + this.expectedRealm + ")", realm);
if (this.flags & FLAG_NO_REALM) {
// Note that the realm here isn't actually the realm. it's a pw mgr key.
do_check_eq(URL + " (" + this.expectedRealm + ")", realm);
}
if (!(this.flags & CROSS_ORIGIN)) {
if (text.indexOf(this.expectedRealm) == -1) {
do_throw("Text must indicate the realm");
@ -115,8 +118,9 @@ AuthPrompt2.prototype = {
var isNTLM = channel.URI.path.indexOf("ntlm") != -1;
var isDigest = channel.URI.path.indexOf("digest") != -1;
if (isNTLM)
if (isNTLM || (this.flags & FLAG_NO_REALM)) {
this.expectedRealm = ""; // NTLM knows no realms
}
do_check_eq(this.expectedRealm, authInfo.realm);
@ -302,7 +306,8 @@ var tests = [test_noauth, test_returnfalse1, test_wrongpw1, test_prompt1,
test_prompt1CrossOrigin, test_prompt2CrossOrigin,
test_returnfalse2, test_wrongpw2, test_prompt2, test_ntlm,
test_basicrealm, test_digest_noauth, test_digest,
test_digest_bogus_user, test_large_realm, test_large_domain];
test_digest_bogus_user, test_short_digest, test_large_realm,
test_large_domain];
var current_test = 0;
@ -315,6 +320,7 @@ function run_test() {
httpserv.registerPathHandler("/auth/ntlm/simple", authNtlmSimple);
httpserv.registerPathHandler("/auth/realm", authRealm);
httpserv.registerPathHandler("/auth/digest", authDigest);
httpserv.registerPathHandler("/auth/short_digest", authShortDigest);
httpserv.registerPathHandler("/largeRealm", largeRealm);
httpserv.registerPathHandler("/largeDomain", largeDomain);
@ -461,6 +467,16 @@ function test_digest_bogus_user() {
do_test_pending();
}
// Test header "WWW-Authenticate: Digest" - bug 1338876.
function test_short_digest() {
var chan = makeChan(URL + "/auth/short_digest", URL);
chan.notificationCallbacks = new Requestor(FLAG_NO_REALM, 2);
listener.expectedCode = 401; // OK
chan.asyncOpen2(listener);
do_test_pending();
}
// PATH HANDLERS
// /auth
@ -589,6 +605,13 @@ function authDigest(metadata, response) {
response.bodyOutputStream.write(body, body.length);
}
function authShortDigest(metadata, response) {
// no header, send one
response.setStatusLine(metadata.httpVersion, 401, "Unauthorized");
response.setHeader("WWW-Authenticate", 'Digest', false);
body = "failed, no header";
}
function largeRealm(metadata, response) {
// test > 32KB realm tokens
var body;

View File

@ -118,6 +118,8 @@ Please commit or stash these changes before vendoring, or re-run with `--ignore-
self._run_command_in_srcdir(args=[cargo, 'vendor', '--sync', mozpath.join(path, 'Cargo.lock'), vendor_dir])
self.repository.add_remove_files(vendor_dir)
# 100k is a reasonable upper bound on source file size.
FILESIZE_LIMIT = 100 * 1024
large_files = set()
cumulative_added_size = 0
for f in self.repository.get_added_files():

View File

@ -68,7 +68,7 @@ public:
// Should we accumulate pinning telemetry for the result?
bool accumulateResult;
Telemetry::ID certPinningResultHistogram;
Telemetry::HistogramID certPinningResultHistogram;
int32_t certPinningResultBucket;
// Should we accumulate telemetry for the root?
bool accumulateForRoot;

View File

@ -273,7 +273,7 @@ CheckPinsForHostname(const UniqueCERTCertList& certList, const char* hostname,
return rv;
}
chainHasValidPins = enforceTestModeResult;
Telemetry::ID histogram = staticFingerprints->mIsMoz
Telemetry::HistogramID histogram = staticFingerprints->mIsMoz
? Telemetry::CERT_PINNING_MOZ_RESULTS
: Telemetry::CERT_PINNING_RESULTS;
if (staticFingerprints->mTestMode) {

View File

@ -77,7 +77,7 @@ RootCABinNumber(const SECItem* cert)
// Attempt to increment the appropriate bin in the provided Telemetry probe ID. If
// there was a hash failure, we do nothing.
void
AccumulateTelemetryForRootCA(mozilla::Telemetry::ID probe,
AccumulateTelemetryForRootCA(mozilla::Telemetry::HistogramID probe,
const CERTCertificate* cert)
{
int32_t binId = RootCABinNumber(&cert->derCert);

View File

@ -22,7 +22,7 @@ int32_t
RootCABinNumber(const SECItem* cert);
void
AccumulateTelemetryForRootCA(mozilla::Telemetry::ID probe, const CERTCertificate* cert);
AccumulateTelemetryForRootCA(mozilla::Telemetry::HistogramID probe, const CERTCertificate* cert);
} // namespace psm
} // namespace mozilla

View File

@ -244,7 +244,7 @@ public:
SSLServerCertVerificationResult(nsNSSSocketInfo* infoObject,
PRErrorCode errorCode,
Telemetry::ID telemetryID = Telemetry::HistogramCount,
Telemetry::HistogramID telemetryID = Telemetry::HistogramCount,
uint32_t telemetryValue = -1,
SSLErrorMessageType errorMessageType =
PlainErrorMessage);
@ -255,7 +255,7 @@ private:
public:
const PRErrorCode mErrorCode;
const SSLErrorMessageType mErrorMessageType;
const Telemetry::ID mTelemetryID;
const Telemetry::HistogramID mTelemetryID;
const uint32_t mTelemetryValue;
};
@ -1503,9 +1503,9 @@ SSLServerCertVerificationJob::Run()
if (mInfoObject->isAlreadyShutDown()) {
error = SEC_ERROR_USER_CANCELLED;
} else {
Telemetry::ID successTelemetry
Telemetry::HistogramID successTelemetry
= Telemetry::SSL_SUCCESFUL_CERT_VALIDATION_TIME_MOZILLAPKIX;
Telemetry::ID failureTelemetry
Telemetry::HistogramID failureTelemetry
= Telemetry::SSL_INITIAL_FAILED_CERT_VALIDATION_TIME_MOZILLAPKIX;
// Reset the error code here so we can detect if AuthCertificate fails to
@ -1757,7 +1757,7 @@ AuthCertificateHook(void* arg, PRFileDesc* fd, PRBool checkSig, PRBool isServer)
SSLServerCertVerificationResult::SSLServerCertVerificationResult(
nsNSSSocketInfo* infoObject, PRErrorCode errorCode,
Telemetry::ID telemetryID, uint32_t telemetryValue,
Telemetry::HistogramID telemetryID, uint32_t telemetryValue,
SSLErrorMessageType errorMessageType)
: mInfoObject(infoObject)
, mErrorCode(errorCode)

View File

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

View File

@ -39,7 +39,7 @@ using namespace mozilla::psm;
extern LazyLogModule gPIPNSSLog;
static void AccumulateCipherSuite(Telemetry::ID probe,
static void AccumulateCipherSuite(Telemetry::HistogramID probe,
const SSLChannelInfo& channelInfo);
namespace {
@ -982,7 +982,7 @@ CanFalseStartCallback(PRFileDesc* fd, void* client_data, PRBool *canFalseStart)
}
static void
AccumulateNonECCKeySize(Telemetry::ID probe, uint32_t bits)
AccumulateNonECCKeySize(Telemetry::HistogramID probe, uint32_t bits)
{
unsigned int value = bits < 512 ? 1 : bits == 512 ? 2
: bits < 768 ? 3 : bits == 768 ? 4
@ -1005,7 +1005,7 @@ AccumulateNonECCKeySize(Telemetry::ID probe, uint32_t bits)
// named curves for a given size (e.g. secp256k1 vs. secp256r1). We punt on
// that for now. See also NSS bug 323674.
static void
AccumulateECCCurve(Telemetry::ID probe, uint32_t bits)
AccumulateECCCurve(Telemetry::HistogramID probe, uint32_t bits)
{
unsigned int value = bits == 256 ? 23 // P-256
: bits == 384 ? 24 // P-384
@ -1015,7 +1015,7 @@ AccumulateECCCurve(Telemetry::ID probe, uint32_t bits)
}
static void
AccumulateCipherSuite(Telemetry::ID probe, const SSLChannelInfo& channelInfo)
AccumulateCipherSuite(Telemetry::HistogramID probe, const SSLChannelInfo& channelInfo)
{
uint32_t value;
switch (channelInfo.cipherSuite) {

View File

@ -1108,8 +1108,8 @@ retryDueToTLSIntolerance(PRErrorCode err, nsNSSSocketInfo* socketInfo)
return false;
}
Telemetry::ID pre;
Telemetry::ID post;
Telemetry::HistogramID pre;
Telemetry::HistogramID post;
switch (range.max) {
case SSL_LIBRARY_VERSION_TLS_1_3:
pre = Telemetry::SSL_TLS13_INTOLERANCE_REASON_PRE;

View File

@ -50,7 +50,7 @@
4679.space: could not connect to host
47ronin.com: did not receive HSTS header
4cclothing.com: could not connect to host
4elements.com: did not receive HSTS header
4elements.com: could not connect to host
4mm.org: did not receive HSTS header
4sqsu.eu: could not connect to host
50millionablaze.org: did not receive HSTS header
@ -135,6 +135,7 @@ afp548.tk: could not connect to host
agalaxyfarfaraway.co.uk: could not connect to host
agbremen.de: did not receive HSTS header
agentseeker.ca: could not connect to host
agonswim.com: could not connect to host
agrimap.com: did not receive HSTS header
agrios.de: did not receive HSTS header
agro-id.gov.ua: could not connect to host
@ -345,6 +346,7 @@ authentication.io: could not connect to host
authoritynutrition.com: did not receive HSTS header
auto-serwis.zgorzelec.pl: did not receive HSTS header
auto4trade.nl: could not connect to host
autoepc.ro: did not receive HSTS header
autojuhos.sk: could not connect to host
autokovrik-diskont.ru: did not receive HSTS header
autotsum.com: could not connect to host
@ -390,7 +392,6 @@ barely.sexy: did not receive HSTS header
bashcode.ninja: could not connect to host
basicsolutionsus.com: did not receive HSTS header
basilisk.io: could not connect to host
basnieuwenhuizen.nl: could not connect to host
bassh.net: could not connect to host
baud.ninja: could not connect to host
baumstark.ca: could not connect to host
@ -512,7 +513,9 @@ blueliv.com: did not receive HSTS header
bluescloud.xyz: could not connect to host
bluetenmeer.com: did not receive HSTS header
blupig.net: did not receive HSTS header
bluserv.net: could not connect to host
bm-trading.nl: did not receive HSTS header
bmone.net: could not connect to host
bngsecure.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]
bnhlibrary.com: could not connect to host
bobiji.com: did not receive HSTS header
@ -530,13 +533,12 @@ 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
bootjp.me: did not receive HSTS header
boringsecurity.net: could not connect to host
boris.one: did not receive HSTS header
boris.one: could not connect to host
borisbesemer.com: could not connect to host
botox.bz: did not receive HSTS header
bouwbedrijfpurmerend.nl: did not receive HSTS header
@ -576,7 +578,6 @@ 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
@ -600,7 +601,6 @@ 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
@ -632,6 +632,7 @@ calvin.me: max-age too low: 2592000
calvinallen.net: did not receive HSTS header
calyxinstitute.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]
camolist.com: could not connect to host
campfire.co.il: could not connect to host
canadiangamblingchoice.com: did not receive HSTS header
cancelmyprofile.com: did not receive HSTS header
candicontrols.com: did not receive HSTS header
@ -646,6 +647,7 @@ capturethepen.co.uk: could not connect to host
car-navi.ph: did not receive HSTS header
carano-service.de: did not receive HSTS header
caraudio69.cz: could not connect to host
cardloan-manual.net: could not connect to host
cardoni.net: did not receive HSTS header
cardstream.com: did not receive HSTS header
cardurl.com: did not receive HSTS header
@ -692,7 +694,6 @@ cfcproperties.com: did not receive HSTS header
cfetengineering.com: could not connect to host
cg.search.yahoo.com: did not receive HSTS header
chainmonitor.com: could not connect to host
chamathellawala.com: could not connect to host
championsofregnum.com: did not receive HSTS header
chandlerredding.com: did not receive HSTS header
changelab.cc: [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]
@ -726,7 +727,6 @@ chinawhale.com: did not receive HSTS header
chirgui.eu: could not connect to host
chloe.re: could not connect to host
chm.vn: did not receive HSTS header
chokladfantasi.net: could not connect to host
chontalpa.pw: could not connect to host
chopperforums.com: did not receive HSTS header
chotu.net: could not connect to host
@ -740,7 +740,6 @@ 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)
@ -756,6 +755,7 @@ cigi.site: could not connect to host
cim2b.de: could not connect to host
cimalando.eu: could not connect to host
cinefilzonen.se: could not connect to host
cintdirect.com: could not connect to host
ciplanutrition.com: did not receive HSTS header
circara.com: did not receive HSTS header
ciscommerce.net: [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]
@ -847,6 +847,7 @@ 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
computersystems.guru: did not receive HSTS header
concord-group.co.jp: did not receive HSTS header
condesaelectronics.com: max-age too low: 0
confirm365.com: could not connect to host
@ -916,7 +917,6 @@ cryptopartyatx.org: could not connect to host
cryptopush.com: did not receive HSTS header
crysadm.com: max-age too low: 1
crystalclassics.co.uk: did not receive HSTS header
csabg.org: could not connect to host
csapak.com: max-age too low: 0
csawctf.poly.edu: could not connect to host
csfs.org.uk: could not connect to host
@ -925,7 +925,6 @@ 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
@ -948,7 +947,6 @@ 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
@ -958,6 +956,7 @@ daimadi.com: could not connect to host
dakrib.net: could not connect to host
daku.gdn: did not receive HSTS header
dalingk.co: could not connect to host
damedrogy.cz: could not connect to host
damianuv-blog.cz: did not receive HSTS header
dango.in: did not receive HSTS header
daniel-steuer.de: could not connect to host
@ -1089,7 +1088,6 @@ djz4music.com: did not receive HSTS header
dl.google.com: did not receive HSTS header (error ignored - included regardless)
dlc.viasinc.com: could not connect to host
dlemper.de: did not receive HSTS header
dlouwrink.nl: could not connect to host
dn42.eu: could not connect to host
dns.google.com: did not receive HSTS header (error ignored - included regardless)
dnsknowledge.com: did not receive HSTS header
@ -1117,6 +1115,7 @@ donttrustrobots.nl: could not connect to host
donzelot.co.uk: max-age too low: 3600
doomleika.com: could not connect to host
dopost.it: could not connect to host
dopply.com: could not connect to host
doridian.com: could not connect to host
doridian.de: could not connect to host
doridian.net: did not receive HSTS header
@ -1152,7 +1151,6 @@ dustri.org: did not receive HSTS header
dutchrank.com: could not connect to host
dwhd.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]
dworzak.ch: could not connect to host
dxa.io: could not connect to host
dycontrol.de: could not connect to host
dylanscott.com.au: did not receive HSTS header
dymersion.com: did not receive HSTS header
@ -1223,7 +1221,7 @@ 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: could not connect to host
elsitar.com: did not receive HSTS header
email.lookout.com: could not connect to host
emanatepixels.com: could not connect to host
emeldi-commerce.com: max-age too low: 0
@ -1237,6 +1235,7 @@ empleosentorreon.mx: could not connect to host
empleostampico.com: did not receive HSTS header
enaah.de: could not connect to host
enargia.jp: max-age too low: 0
encode.host: did not receive HSTS header
encode.space: did not receive HSTS header
encoder.pw: could not connect to host
encontrebarato.com.br: did not receive HSTS header
@ -1274,6 +1273,7 @@ equilibre-yoga-jennifer-will.com: could not connect to host
erawanarifnugroho.com: did not receive HSTS header
eressea.xyz: could not connect to host
eridanus.uk: could not connect to host
erikhubers.nl: could not connect to host
ernaehrungsberatung-rapperswil.ch: [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]
ernaehrungsberatung-zurich.ch: could not connect to host
ernesto.at: could not connect to host
@ -1469,6 +1469,7 @@ frangor.info: did not receive HSTS header
franta.biz: did not receive HSTS header
franta.email: did not receive HSTS header
franzt.de: could not connect to host
franzt.ovh: could not connect to host
frasys.io: max-age too low: 7776000
fredvoyage.fr: did not receive HSTS header
freeflow.tv: could not connect to host
@ -1499,6 +1500,7 @@ ftctele.com: did not receive HSTS header
fuckbilibili.com: did not receive HSTS header
fuckgfw233.org: could not connect to host
fukushima-web.com: did not receive HSTS header
fumo.se: could not connect to host
fundacionhijosdelsol.org: could not connect to host
funkyweddingideas.com.au: could not connect to host
funrun.com: did not receive HSTS header
@ -1513,6 +1515,7 @@ fx-rk.com: did not receive HSTS header
fysiohaenraets.nl: did not receive HSTS header
fzn.io: could not connect to host
fzslm.me: did not receive HSTS header
g01.in.ua: could not connect to host
g2a.co: did not receive HSTS header
g2g.com: did not receive HSTS header
g4w.co: did not receive HSTS header (error ignored - included regardless)
@ -1520,8 +1523,9 @@ g5led.nl: could not connect to host
gabber.scot: could not connect to host
gaelleetarnaud.com: did not receive HSTS header
gafachi.com: could not connect to host
gaichon.com: could not connect to host
gaite.me: could not connect to host
gakkainavi.jp: did not receive HSTS header
gakkainavi.net: did not receive HSTS header
gakkainavi4.com: could not connect to host
gakkainavi4.net: did not receive HSTS header
galardi.org: did not receive HSTS header
@ -1646,6 +1650,7 @@ gogold-g.com: could not connect to host
gold24.in: did not receive HSTS header
goldendata.io: could not connect to host
golocal-media.de: did not receive HSTS header
gong8.win: did not receive HSTS header
gonzalosanchez.mx: could not connect to host
goodenough.nz: did not receive HSTS header
goodwin43.ru: could not connect to host
@ -1666,11 +1671,9 @@ gpsfix.cz: could not connect to host
gpstuner.com: did not receive HSTS header
gracesofgrief.com: max-age too low: 86400
gradienthosting.co.uk: did not receive HSTS header
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
@ -1744,6 +1747,7 @@ halo.red: could not connect to host
hancc.net: could not connect to host
hanfu.la: could not connect to host
hang333.pw: did not receive HSTS header
hanimalis.fr: could not connect to host
hansen.hn: could not connect to host
hao2taiwan.com: max-age too low: 0
haoyugao.com: could not connect to host
@ -1785,6 +1789,8 @@ heart.ge: did not receive HSTS header
heartlandrentals.com: did not receive HSTS header
hectorj.net: could not connect to host
heftkaufen.de: did not receive HSTS header
helgakristoffer.com: could not connect to host
helgakristoffer.wedding: could not connect to host
helloworldhost.com: did not receive HSTS header
helpadmin.net: could not connect to host
helpium.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]
@ -1861,11 +1867,13 @@ hu.search.yahoo.com: did not receive HSTS header
huarongdao.com: did not receive HSTS header
hugocollignon.fr: could not connect to host
hugosleep.com.au: did not receive HSTS header
huihui.moe: could not connect to host
humankode.com: did not receive HSTS header
humblefinances.com: could not connect to host
humeurs.net: could not connect to host
humpteedumptee.in: did not receive HSTS header
huntshomeinspections.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]
hup.blue: could not connect to host
hurricanelabs.com: did not receive HSTS header
huskybutt.dog: could not connect to host
hydra.ws: could not connect to host
@ -1975,7 +1983,6 @@ insite-feedback.com: did not receive HSTS header
inspire-av.com: did not receive HSTS header
inspiroinc.com: could not connect to host
instacart.com: did not receive HSTS header
instagram-atom.appspot.com: did not receive HSTS header
instantdev.io: could not connect to host
institutoflordelavida.com: could not connect to host
institutolancaster.com: could not connect to host
@ -1984,12 +1991,14 @@ intel.li: could not connect to host
intelldynamics.com: could not connect to host
interference.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]
interlun.com: could not connect to host
internect.co.za: did not receive HSTS header
internetcasinos.de: could not connect to host
internetcensus.org: could not connect to host
interserved.com: did not receive HSTS header
intex.es: max-age too low: 0
intim-uslugi-kazan.net: could not connect to host
intimtoy.com.ua: could not connect to host
intrp.net: did not receive HSTS header
inverselink-user-content.com: could not connect to host
inverselink.com: could not connect to host
invite24.pro: could not connect to host
@ -2011,7 +2020,6 @@ iranianlawschool.com: could not connect to host
iraqidinar.org: did not receive HSTS header
irazimina.ru: did not receive HSTS header
irccloud.com: did not receive HSTS header
ireef.tv: could not connect to host
irelandesign.com: did not receive HSTS header
irmtrudjurke.de: did not receive HSTS header
ischool.co.jp: did not receive HSTS header
@ -2024,6 +2032,7 @@ israkurort.com: did not receive HSTS header
isslshop.com: could not connect to host
istaspirtslietas.lv: did not receive HSTS header
it-go.net: did not receive HSTS header
itchy.nl: could not connect to host
itechgeek.com: max-age too low: 0
itos.asia: did not receive HSTS header
itos.pl: did not receive HSTS header
@ -2169,12 +2178,12 @@ 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
kaisers.de: did not receive HSTS header
kalami.nl: did not receive HSTS header
kaleidomarketing.com: could not connect to host
kaliaa.fi: could not connect to host
kamikano.com: could not connect to host
kaneo-gmbh.de: did not receive HSTS header
@ -2279,6 +2288,7 @@ kreavis.com: did not receive HSTS header
kredite.sale: could not connect to host
kriegt.es: could not connect to host
kristjanrang.eu: did not receive HSTS header
kristofferkoch.com: could not connect to host
krmela.com: could not connect to host
kroetenfuchs.de: could not connect to host
kropkait.pl: could not connect to host
@ -2286,6 +2296,7 @@ krouzkyliduska.cz: [Exception... "Component returned failure code: 0x80004005 (N
krunut.com: did not receive HSTS header
krypteia.org: could not connect to host
kryptomech.com: could not connect to host
ks-watch.de: did not receive HSTS header
ksfh-mail.de: could not connect to host
kstan.me: could not connect to host
kswriter.com: could not connect to host
@ -2340,6 +2351,7 @@ lawformt.com: could not connect to host
laxatus.com: did not receive HSTS header
laxiongames.es: could not connect to host
lbrt.xyz: could not connect to host
lbs-logics.com: max-age too low: 0
ldarby.me.uk: could not connect to host
leadership9.com: could not connect to host
leardev.de: did not receive HSTS header
@ -2506,6 +2518,7 @@ maarten.nyc: did not receive HSTS header
maartenvandekamp.nl: did not receive HSTS header
mac-torrents.me: did not receive HSTS header
macchaberrycream.com: could not connect to host
macchedil.com: did not receive HSTS header
macdj.tk: could not connect to host
macgeneral.de: did not receive HSTS header
machon.biz: could not connect to host
@ -2588,7 +2601,6 @@ maultrom.ml: could not connect to host
maur.cz: did not receive HSTS header
mavisang.cf: could not connect to host
mawe.red: could not connect to host
maxfox.me: did not receive HSTS header
maya.mg: could not connect to host
mca2017.org: did not receive HSTS header
mcc.re: could not connect to host
@ -2596,6 +2608,7 @@ mccarty.io: could not connect to host
mccrackon.com: could not connect to host
mcdonalds.ru: did not receive HSTS header
mcga.media: did not receive HSTS header
mcjackk77.com: could not connect to host
mclab.su: could not connect to host
mdewendt.de: could not connect to host
mdfnet.se: did not receive HSTS header
@ -2639,7 +2652,6 @@ 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
@ -2815,6 +2827,7 @@ 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
@ -2847,7 +2860,7 @@ natuurbehangnederland.nl: could not connect to host
nauck.org: did not receive HSTS header
nav.jobs: could not connect to host
naval.tf: could not connect to host
navenlle.com: could not connect to host
navenlle.com: did not receive HSTS header
navjobs.com: did not receive HSTS header
nbb.io: could not connect to host
nbg-ha.de: could not connect to host
@ -2855,6 +2868,7 @@ ncc60205.info: could not connect to host
ncpc.gov: could not connect to host
nct.org.uk: max-age too low: 1
nctx.co.uk: did not receive HSTS header
ne-on.org: could not connect to host
near.st: did not receive HSTS header
neels.ch: [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]
neftaly.com: did not receive HSTS header
@ -2870,7 +2884,6 @@ netbox.cc: could not connect to host
netherwind.eu: did not receive HSTS header
netloanusa.com: max-age too low: 0
netmagik.com: did not receive HSTS header
netronix.be: did not receive HSTS header
nettefoundation.com: could not connect to host
netulo.com: could not connect to host
netzbit.de: could not connect to host
@ -3079,7 +3092,6 @@ 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
@ -3172,6 +3184,7 @@ pbprint.ru: max-age too low: 0
pc-nf.de: did not receive HSTS header
pcfun.net: could not connect to host
pchax.net: could not connect to host
pdamsidoarjo.co.id: could not connect to host
pdevio.com: could not connect to host
pdf.yt: could not connect to host
peakapp.nl: could not connect to host
@ -3223,7 +3236,6 @@ 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
pinesandneedles.com: did not receive HSTS header
pippen.io: could not connect to host
piratedb.com: could not connect to host
piratedot.com: could not connect to host
@ -3264,7 +3276,6 @@ plombirator.kz: did not receive HSTS header
plothost.com: did not receive HSTS header
ploup.net: could not connect to host
pluff.nl: could not connect to host
plusstreamfeed.appspot.com: did not receive HSTS header
pmnts.io: could not connect to host
po.gl: did not receive HSTS header
pocketsix.com: did not receive HSTS header
@ -3285,9 +3296,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
@ -3298,6 +3309,7 @@ powerxequality.com: could not connect to host
ppr-truby.ru: could not connect to host
ppy3.com: did not receive HSTS header
pr.search.yahoo.com: did not receive HSTS header
preezzie.com: could not connect to host
prefontaine.name: could not connect to host
prego-shop.de: did not receive HSTS header
preissler.co.uk: could not connect to host
@ -3328,7 +3340,6 @@ 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
@ -3423,6 +3434,7 @@ rcafox.com: could not connect to host
rcpcbd.com: did not receive HSTS header
rdns.im: did not receive HSTS header
re-customer.net: did not receive HSTS header
reachr.com: could not connect to host
readr.pw: could not connect to host
realmic.net: could not connect to host
realmofespionage.com: could not connect to host
@ -3499,6 +3511,7 @@ rippleunion.com: could not connect to host
riskmgt.com.au: could not connect to host
rj.gg: could not connect to host
rk6.cz: could not connect to host
rkkhok.hu: did not receive HSTS header
rkmantpur.org: did not receive HSTS header
rme.li: did not receive HSTS header
rngmeme.com: could not connect to host
@ -3535,6 +3548,7 @@ roundtheme.com: did not receive HSTS header
rous.se: could not connect to host
rout0r.org: did not receive HSTS header
rouvray.org: could not connect to host
royalpub.net: did not receive HSTS header
rr.in.th: could not connect to host
rrke.cc: did not receive HSTS header
rsajeey.info: could not connect to host
@ -3567,6 +3581,7 @@ ryansmithphotography.com: did not receive HSTS header
ryanteck.uk: did not receive HSTS header
s.how: did not receive HSTS header
s007.co: could not connect to host
saba-piserver.info: could not connect to host
safematix.com: could not connect to host
safewings-nh.nl: did not receive HSTS header
safic.net: could not connect to host
@ -3627,6 +3642,7 @@ schreiber-netzwerk.eu: did not receive HSTS header
schrodinger.io: could not connect to host
schulterglatzen-altenwalde.de: could not connect to host
schultzflorists.com: could not connect to host
schumanandmonnet.eu: did not receive HSTS header
schwarzkopfforyou.de: did not receive HSTS header
scienceathome.org: did not receive HSTS header
scooshonline.co.uk: did not receive HSTS header
@ -3761,7 +3777,6 @@ simplefraud.com: [Exception... "Component returned failure code: 0x80004005 (NS_
simplelearner.com: could not connect to host
simplepractice.com: did not receive HSTS header
simply-premium.com: max-age too low: 0
simplycloud.de: could not connect to host
sin30.net: could not connect to host
sincron.org: could not connect to host
sinful.pw: could not connect to host
@ -3793,7 +3808,6 @@ 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
@ -3847,6 +3861,7 @@ someshit.xyz: could not connect to host
somethingnew.xyz: did not receive HSTS header
sonicrainboom.rocks: could not connect to host
soobi.org: did not receive HSTS header
soondy.com: did not receive HSTS header
sotiran.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]
sotor.de: did not receive HSTS header
soulema.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]
@ -3893,6 +3908,7 @@ spotlightsrule.ddns.net: could not connect to host
spreadsheets.google.com: did not receive HSTS header (error ignored - included regardless)
spreed.me: did not receive HSTS header
sproutconnections.com: did not receive HSTS header
sprutech.de: could not connect to host
sprybear.com: did not receive HSTS header
square.gs: could not connect to host
squatldf.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]
@ -3941,7 +3957,7 @@ stillblackhat.id: could not connect to host
stirlingpoon.xyz: could not connect to host
stkbn.com: did not receive HSTS header
stmbgr.com: could not connect to host
stn.me.uk: could not connect to host
stn.me.uk: did not receive HSTS header
stocktrade.de: could not connect to host
stoffe-monster.de: did not receive HSTS header
stole-my.bike: could not connect to host
@ -3957,7 +3973,6 @@ strasweb.fr: did not receive HSTS header
streamingeverywhere.com: did not receive HSTS header
streamingmagazin.de: could not connect to host
streampanel.net: did not receive HSTS header
streams.dyndns.org: could not connect to host
strictlysudo.com: could not connect to host
strivephysmed.com: did not receive HSTS header
stroeercrm.de: could not connect to host
@ -4004,6 +4019,7 @@ supweb.ovh: did not receive HSTS header
surfeasy.com: did not receive HSTS header
surfone-leucate.com: did not receive HSTS header
sushi101tempe.com: did not receive HSTS header
sushifrick.de: could not connect to host
suzukikenichi.com: did not receive HSTS header
sv.search.yahoo.com: did not receive HSTS header
svarovani.tk: could not connect to host
@ -4086,6 +4102,7 @@ technogroup.cz: did not receive HSTS header
technosavvyport.com: did not receive HSTS header
techpointed.com: could not connect to host
tedb.us: could not connect to host
tedovo.com: did not receive HSTS header
tegelsensanitaironline.nl: did not receive HSTS header
tekshrek.com: did not receive HSTS header
telefonnummer.online: could not connect to host
@ -4133,6 +4150,7 @@ thecoffeehouse.xyz: could not connect to host
thediaryofadam.com: did not receive HSTS header
theendofzion.com: did not receive HSTS header
theescapistswiki.com: could not connect to host
theeyeopener.com: did not receive HSTS header
thefarbeyond.com: could not connect to host
theflowerbasketonline.com: could not connect to host
thefootballanalyst.com: could not connect to host
@ -4241,7 +4259,6 @@ tomharris.tech: did not receive HSTS header
tomlankhorst.nl: did not receive HSTS header
tommsy.com: did not receive HSTS header
tommyads.com: could not connect to host
tomudding.nl: did not receive HSTS header
tonburi.jp: [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]
tonyfantjr.com: could not connect to host
tonyw.xyz: could not connect to host
@ -4272,13 +4289,11 @@ 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
@ -4331,7 +4346,6 @@ ubicv.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_
ublox.com: did not receive HSTS header
ubuntuhot.com: did not receive HSTS header
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
ui8.net: max-age too low: 86400
@ -4389,7 +4403,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
userify.com: did not receive HSTS header
ustr.gov: max-age too low: 86400
utleieplassen.no: could not connect to host
utopiagalaxy.space: could not connect to host
@ -4427,6 +4441,7 @@ 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
veblr.com: did not receive HSTS header
vechkasov.ru: did not receive HSTS header
vehent.org: did not receive HSTS header
vemokin.net: did not receive HSTS header
@ -4452,15 +4467,16 @@ 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
vipmusic.ga: could not connect to host
vipnettikasinoklubi.com: did not receive HSTS header
visiontree-beta.eu: could not connect to host
visitbroadstairs.com: could not connect to host
vissanum.com: did not receive HSTS header
vistarait.com: did not receive HSTS header
vitagenda.nl: could not connect to host
vitalorange.com: did not receive HSTS header
viva-french.com: did not receive HSTS header
vlastimilburian.cz: did not receive HSTS header
@ -4519,7 +4535,6 @@ 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
@ -4554,7 +4569,6 @@ weddingenvelopes.co.uk: 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]
welpy.com: could not connect to host
weltmeisterschaft.net: could not connect to host
weltverschwoerung.de: did not receive HSTS header
weme.eu: could not connect to host
@ -4644,16 +4658,19 @@ woording.com: could not connect to host
wootton95.com: could not connect to host
woresite.jp: did not receive HSTS header
workfone.io: did not receive HSTS header
workwithgo.com: could not connect to host
worldsbeststory.com: could not connect to host
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
wsscompany.com.ve: could not connect to host
wubocong.com: could not connect to host
wufu.org: did not receive HSTS header
wuhengmin.com: did not receive HSTS header
wurzelzwerg.net: could not connect to host
wusx.club: could not connect to host
www.apollo-auto.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]
www.apollo-auto.com: could not connect to host
www.braintreepayments.com: did not receive HSTS header
www.calyxinstitute.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]
www.cueup.com: could not connect to host
@ -4664,6 +4681,7 @@ www.gamesdepartment.co.uk: did not receive HSTS header
www.gmail.com: did not receive HSTS header (error ignored - included regardless)
www.googlemail.com: did not receive HSTS header (error ignored - included regardless)
www.greplin.com: could not connect to host
www.heliosnet.com: could not connect to host
www.honeybadger.io: did not receive HSTS header
www.jitsi.org: did not receive HSTS header
www.ledgerscope.net: could not connect to host

File diff suppressed because it is too large Load Diff

View File

@ -37,11 +37,11 @@ using namespace mozilla::dom::quota;
struct Histograms {
const char *name;
const Telemetry::ID readB;
const Telemetry::ID writeB;
const Telemetry::ID readMS;
const Telemetry::ID writeMS;
const Telemetry::ID syncMS;
const Telemetry::HistogramID readB;
const Telemetry::HistogramID writeB;
const Telemetry::HistogramID readMS;
const Telemetry::HistogramID writeMS;
const Telemetry::HistogramID syncMS;
};
#define SQLITE_TELEMETRY(FILENAME, HGRAM) \
@ -78,7 +78,7 @@ public:
* IOInterposer. Filename will be reported as NULL, and reference will be
* either "sqlite-mainthread" or "sqlite-otherthread".
*/
explicit IOThreadAutoTimer(Telemetry::ID aId,
explicit IOThreadAutoTimer(Telemetry::HistogramID aId,
IOInterposeObserver::Operation aOp = IOInterposeObserver::OpNone)
: start(TimeStamp::Now()),
id(aId)
@ -108,7 +108,7 @@ public:
TimeStamp end(TimeStamp::Now());
uint32_t mainThread = NS_IsMainThread() ? 1 : 0;
if (id != Telemetry::HistogramCount) {
Telemetry::AccumulateTimeDelta(static_cast<Telemetry::ID>(id + mainThread),
Telemetry::AccumulateTimeDelta(static_cast<Telemetry::HistogramID>(id + mainThread),
start, end);
}
// We don't report SQLite I/O on Windows because we have a comprehensive
@ -130,7 +130,7 @@ public:
private:
const TimeStamp start;
const Telemetry::ID id;
const Telemetry::HistogramID id;
#if defined(MOZ_GECKO_PROFILER) && !defined(XP_WIN)
IOInterposeObserver::Operation op;
#endif

View File

@ -934,8 +934,8 @@ reftest-stylo:
chunks: 16
run-on-projects:
by-test-platform:
linux64-stylo/opt: []
linux64-stylo/debug: []
linux64-stylo/opt: [ 'stylo', 'autoland', 'mozilla-central' ]
linux64-stylo/debug: [ 'stylo', 'autoland', 'mozilla-inbound', 'mozilla-central' ]
e10s:
by-test-platform:
linux64-stylo/opt:

View File

@ -129,6 +129,11 @@ all_locales
For the ``l10n`` and ``nightly-l10n`` kinds, this attribute contains the list
of relevant locales for the platform.
all_locales_with_changesets
===========================
Contains a dict of l10n changesets, mapped by locales (same as in ``all_locales``).
l10n_chunk
==========
For the ``l10n`` and ``nightly-l10n`` kinds, this attribute contains the chunk

View File

@ -8,6 +8,7 @@ Do transforms specific to l10n kind
from __future__ import absolute_import, print_function, unicode_literals
import copy
import json
from mozbuild.chunkify import chunkify
from taskgraph.transforms.base import (
@ -136,15 +137,31 @@ def _parse_locales_file(locales_file, platform=None):
If platform is unset matches all platforms.
"""
locales = []
if locales_file.endswith('json'):
# Release process uses .json for locale files sometimes.
raise NotImplementedError("Don't know how to parse a .json locales file")
else:
with open(locales_file, mode='r') as lf:
locales = lf.read().split()
with open(locales_file, mode='r') as f:
if locales_file.endswith('json'):
all_locales = json.load(f)
# XXX Only single locales are fetched
locales = {
locale: data['revision']
for locale, data in all_locales.items()
if 'android' in data['platforms']
}
else:
all_locales = f.read().split()
# 'default' is the hg revision at the top of hg repo, in this context
locales = {locale: 'default' for locale in all_locales}
return locales
def _remove_ja_jp_mac_locale(locales):
# ja-JP-mac is a mac-only locale, but there are no mac builds being repacked,
# so just omit it unconditionally
return {
locale: revision for locale, revision in locales.items() if locale != 'ja-JP-mac'
}
@transforms.add
def setup_name(config, jobs):
for job in jobs:
@ -232,14 +249,13 @@ def handle_keyed_by(config, jobs):
@transforms.add
def all_locales_attribute(config, jobs):
for job in jobs:
locales = set(_parse_locales_file(job["locales-file"]))
# ja-JP-mac is a mac-only locale, but there are no
# mac builds being repacked, so just omit it unconditionally
locales = locales - set(("ja-JP-mac", ))
# Convert to mutable list.
locales = list(sorted(locales))
locales_with_changesets = _parse_locales_file(job["locales-file"])
locales_with_changesets = _remove_ja_jp_mac_locale(locales_with_changesets)
locales = sorted(locales_with_changesets.keys())
attributes = job.setdefault('attributes', {})
attributes["all_locales"] = locales
attributes["all_locales_with_changesets"] = locales_with_changesets
yield job
@ -248,24 +264,27 @@ def chunk_locales(config, jobs):
""" Utilizes chunking for l10n stuff """
for job in jobs:
chunks = job.get('chunks')
all_locales = job['attributes']['all_locales']
locales_with_changesets = job['attributes']['all_locales_with_changesets']
if chunks:
if chunks > len(all_locales):
if chunks > len(locales_with_changesets):
# Reduce chunks down to the number of locales
chunks = len(all_locales)
chunks = len(locales_with_changesets)
for this_chunk in range(1, chunks + 1):
chunked = copy.deepcopy(job)
chunked['name'] = chunked['name'].replace(
'/', '-{}/'.format(this_chunk), 1
)
chunked['mozharness']['options'] = chunked['mozharness'].get('options', [])
my_locales = []
my_locales = chunkify(all_locales, this_chunk, chunks)
# chunkify doesn't work with dicts
locales_with_changesets_as_list = locales_with_changesets.items()
chunked_locales = chunkify(locales_with_changesets_as_list, this_chunk, chunks)
chunked['mozharness']['options'].extend([
"locale={}".format(locale) for locale in my_locales
])
'locale={}:{}'.format(locale, changeset)
for locale, changeset in chunked_locales
])
chunked['attributes']['l10n_chunk'] = str(this_chunk)
chunked['attributes']['chunk_locales'] = my_locales
# strip revision
chunked['attributes']['chunk_locales'] = [locale for locale, _ in chunked_locales]
# add the chunk number to the TH symbol
group, symbol = split_symbol(
@ -276,8 +295,9 @@ def chunk_locales(config, jobs):
else:
job['mozharness']['options'] = job['mozharness'].get('options', [])
job['mozharness']['options'].extend([
"locale={}".format(locale) for locale in all_locales
])
'locale={}:{}'.format(locale, changeset)
for locale, changeset in locales_with_changesets.items()
])
yield job

View File

@ -1,5 +0,0 @@
[Blob-close.html]
type: testharness
[Blob.close]
expected: FAIL

View File

@ -0,0 +1,5 @@
[filereader_abort.html]
type: testharness
[Aborting after read]
expected: FAIL

View File

@ -0,0 +1,17 @@
[clone-before-keypath-eval.html]
type: testharness
[Key generator and key path validity check operates on a clone]
expected: FAIL
[Failing key path validity check operates on a clone]
expected: FAIL
[Index key path evaluations operate on a clone]
expected: FAIL
[Store and index key path evaluations operate on the same clone]
expected: FAIL
[Cursor update checks and keypath evaluations operate on a clone]
expected: FAIL

View File

@ -0,0 +1,8 @@
[idb-binary-key-detached.htm]
type: testharness
[Detached ArrayBuffer]
expected: FAIL
[Detached TypedArray]
expected: FAIL

Some files were not shown because too many files have changed in this diff Show More