diff options
Diffstat (limited to 'gnu/packages/patches/icecat-bug-1348660-pt5.patch')
-rw-r--r-- | gnu/packages/patches/icecat-bug-1348660-pt5.patch | 727 |
1 files changed, 0 insertions, 727 deletions
diff --git a/gnu/packages/patches/icecat-bug-1348660-pt5.patch b/gnu/packages/patches/icecat-bug-1348660-pt5.patch deleted file mode 100644 index b0bede3b38..0000000000 --- a/gnu/packages/patches/icecat-bug-1348660-pt5.patch +++ /dev/null @@ -1,727 +0,0 @@ -This is a subset of the following changeset from upstream: - https://hg.mozilla.org/releases/mozilla-esr52/raw-rev/5e07bd37ac61 - -This excludes all test code from that changeset, including a GIT binary patch -that is not supported by Guix's patch-and-repack mechanism. - -# HG changeset patch -# User Jan Varga <jan.varga@gmail.com> -# Date 1490181244 -3600 -# Node ID 5e07bd37ac6162f218dfe03ed83b5dcca9653b68 -# Parent 28934912eede9e14895baf4af7575ca9639f59ee -Bug 1348660 - Part 5: Implement a method to retrieve usage data for all origins at once. r=btseng, a=lizzard - -diff --git a/dom/quota/ActorsChild.cpp b/dom/quota/ActorsChild.cpp ---- a/dom/quota/ActorsChild.cpp -+++ b/dom/quota/ActorsChild.cpp -@@ -137,16 +137,52 @@ QuotaUsageRequestChild::HandleResponse(n - AssertIsOnOwningThread(); - MOZ_ASSERT(NS_FAILED(aResponse)); - MOZ_ASSERT(mRequest); - - mRequest->SetError(aResponse); - } - - void -+QuotaUsageRequestChild::HandleResponse(const nsTArray<OriginUsage>& aResponse) -+{ -+ AssertIsOnOwningThread(); -+ MOZ_ASSERT(mRequest); -+ -+ RefPtr<nsVariant> variant = new nsVariant(); -+ -+ if (aResponse.IsEmpty()) { -+ variant->SetAsEmptyArray(); -+ } else { -+ nsTArray<RefPtr<UsageResult>> usageResults; -+ -+ const uint32_t count = aResponse.Length(); -+ -+ usageResults.SetCapacity(count); -+ -+ for (uint32_t index = 0; index < count; index++) { -+ auto& originUsage = aResponse[index]; -+ -+ RefPtr<UsageResult> usageResult = new UsageResult(originUsage.origin(), -+ originUsage.persisted(), -+ originUsage.usage()); -+ -+ usageResults.AppendElement(usageResult.forget()); -+ } -+ -+ variant->SetAsArray(nsIDataType::VTYPE_INTERFACE_IS, -+ &NS_GET_IID(nsIQuotaUsageResult), -+ usageResults.Length(), -+ static_cast<void*>(usageResults.Elements())); -+ } -+ -+ mRequest->SetResult(variant); -+} -+ -+void - QuotaUsageRequestChild::HandleResponse(const OriginUsageResponse& aResponse) - { - AssertIsOnOwningThread(); - MOZ_ASSERT(mRequest); - - RefPtr<OriginUsageResult> result = - new OriginUsageResult(aResponse.usage(), - aResponse.fileUsage(), -@@ -177,16 +213,20 @@ QuotaUsageRequestChild::Recv__delete__(c - AssertIsOnOwningThread(); - MOZ_ASSERT(mRequest); - - switch (aResponse.type()) { - case UsageRequestResponse::Tnsresult: - HandleResponse(aResponse.get_nsresult()); - break; - -+ case UsageRequestResponse::TAllUsageResponse: -+ HandleResponse(aResponse.get_AllUsageResponse().originUsages()); -+ break; -+ - case UsageRequestResponse::TOriginUsageResponse: - HandleResponse(aResponse.get_OriginUsageResponse()); - break; - - default: - MOZ_CRASH("Unknown response type!"); - } - -diff --git a/dom/quota/ActorsChild.h b/dom/quota/ActorsChild.h ---- a/dom/quota/ActorsChild.h -+++ b/dom/quota/ActorsChild.h -@@ -93,16 +93,19 @@ private: - - // Only destroyed by QuotaChild. - ~QuotaUsageRequestChild(); - - void - HandleResponse(nsresult aResponse); - - void -+ HandleResponse(const nsTArray<OriginUsage>& aResponse); -+ -+ void - HandleResponse(const OriginUsageResponse& aResponse); - - // IPDL methods are only called by IPDL. - virtual void - ActorDestroy(ActorDestroyReason aWhy) override; - - virtual bool - Recv__delete__(const UsageRequestResponse& aResponse) override; -diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp ---- a/dom/quota/ActorsParent.cpp -+++ b/dom/quota/ActorsParent.cpp -@@ -1039,16 +1039,42 @@ private: - // IPDL methods. - void - ActorDestroy(ActorDestroyReason aWhy) override; - - bool - RecvCancel() override; - }; - -+class GetUsageOp final -+ : public QuotaUsageRequestBase -+{ -+ nsTArray<OriginUsage> mOriginUsages; -+ nsDataHashtable<nsCStringHashKey, uint32_t> mOriginUsagesIndex; -+ -+ bool mGetAll; -+ -+public: -+ explicit GetUsageOp(const UsageRequestParams& aParams); -+ -+private: -+ ~GetUsageOp() -+ { } -+ -+ nsresult -+ TraverseRepository(QuotaManager* aQuotaManager, -+ PersistenceType aPersistenceType); -+ -+ nsresult -+ DoDirectoryWork(QuotaManager* aQuotaManager) override; -+ -+ void -+ GetResponse(UsageRequestResponse& aResponse) override; -+}; -+ - class GetOriginUsageOp final - : public QuotaUsageRequestBase - { - // If mGetGroupUsage is false, we use mUsageInfo to record the origin usage - // and the file usage. Otherwise, we use it to record the group usage and the - // limit. - UsageInfo mUsageInfo; - -@@ -5693,16 +5719,20 @@ PQuotaUsageRequestParent* - Quota::AllocPQuotaUsageRequestParent(const UsageRequestParams& aParams) - { - AssertIsOnBackgroundThread(); - MOZ_ASSERT(aParams.type() != UsageRequestParams::T__None); - - RefPtr<QuotaUsageRequestBase> actor; - - switch (aParams.type()) { -+ case UsageRequestParams::TAllUsageParams: -+ actor = new GetUsageOp(aParams); -+ break; -+ - case UsageRequestParams::TOriginUsageParams: - actor = new GetOriginUsageOp(aParams); - break; - - default: - MOZ_CRASH("Should never get here!"); - } - -@@ -6033,16 +6063,189 @@ QuotaUsageRequestBase::RecvCancel() - if (mCanceled.exchange(true)) { - NS_WARNING("Canceled more than once?!"); - return false; - } - - return true; - } - -+GetUsageOp::GetUsageOp(const UsageRequestParams& aParams) -+ : mGetAll(aParams.get_AllUsageParams().getAll()) -+{ -+ AssertIsOnOwningThread(); -+ MOZ_ASSERT(aParams.type() == UsageRequestParams::TAllUsageParams); -+} -+ -+nsresult -+GetUsageOp::TraverseRepository(QuotaManager* aQuotaManager, -+ PersistenceType aPersistenceType) -+{ -+ AssertIsOnIOThread(); -+ MOZ_ASSERT(aQuotaManager); -+ -+ nsresult rv; -+ -+ nsCOMPtr<nsIFile> directory = -+ do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ rv = directory->InitWithPath(aQuotaManager->GetStoragePath(aPersistenceType)); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ bool exists; -+ rv = directory->Exists(&exists); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ if (!exists) { -+ return NS_OK; -+ } -+ -+ nsCOMPtr<nsISimpleEnumerator> entries; -+ rv = directory->GetDirectoryEntries(getter_AddRefs(entries)); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ bool persistent = aPersistenceType == PERSISTENCE_TYPE_PERSISTENT; -+ -+ bool hasMore; -+ while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && -+ hasMore && !mCanceled) { -+ nsCOMPtr<nsISupports> entry; -+ rv = entries->GetNext(getter_AddRefs(entry)); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ nsCOMPtr<nsIFile> originDir = do_QueryInterface(entry); -+ MOZ_ASSERT(originDir); -+ -+ bool isDirectory; -+ rv = originDir->IsDirectory(&isDirectory); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ if (!isDirectory) { -+ nsString leafName; -+ rv = originDir->GetLeafName(leafName); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ if (!leafName.EqualsLiteral(DSSTORE_FILE_NAME)) { -+ QM_WARNING("Something (%s) in the repository that doesn't belong!", -+ NS_ConvertUTF16toUTF8(leafName).get()); -+ } -+ continue; -+ } -+ -+ int64_t timestamp; -+ nsCString suffix; -+ nsCString group; -+ nsCString origin; -+ bool isApp; -+ rv = aQuotaManager->GetDirectoryMetadata2WithRestore(originDir, -+ persistent, -+ ×tamp, -+ suffix, -+ group, -+ origin, -+ &isApp); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ if (!mGetAll && -+ aQuotaManager->IsOriginWhitelistedForPersistentStorage(origin)) { -+ continue; -+ } -+ -+ OriginUsage* originUsage; -+ -+ // We can't store pointers to OriginUsage objects in the hashtable -+ // since AppendElement() reallocates its internal array buffer as number -+ // of elements grows. -+ uint32_t index; -+ if (mOriginUsagesIndex.Get(origin, &index)) { -+ originUsage = &mOriginUsages[index]; -+ } else { -+ index = mOriginUsages.Length(); -+ -+ originUsage = mOriginUsages.AppendElement(); -+ -+ originUsage->origin() = origin; -+ originUsage->persisted() = false; -+ originUsage->usage() = 0; -+ -+ mOriginUsagesIndex.Put(origin, index); -+ } -+ -+ UsageInfo usageInfo; -+ rv = GetUsageForOrigin(aQuotaManager, -+ aPersistenceType, -+ group, -+ origin, -+ isApp, -+ &usageInfo); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ originUsage->usage() = originUsage->usage() + usageInfo.TotalUsage(); -+ } -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ return NS_OK; -+} -+ -+nsresult -+GetUsageOp::DoDirectoryWork(QuotaManager* aQuotaManager) -+{ -+ AssertIsOnIOThread(); -+ -+ PROFILER_LABEL("Quota", "GetUsageOp::DoDirectoryWork", -+ js::ProfileEntry::Category::OTHER); -+ -+ nsresult rv; -+ -+ for (const PersistenceType type : kAllPersistenceTypes) { -+ rv = TraverseRepository(aQuotaManager, type); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ } -+ -+ return NS_OK; -+} -+ -+void -+GetUsageOp::GetResponse(UsageRequestResponse& aResponse) -+{ -+ AssertIsOnOwningThread(); -+ -+ aResponse = AllUsageResponse(); -+ -+ if (!mOriginUsages.IsEmpty()) { -+ nsTArray<OriginUsage>& originUsages = -+ aResponse.get_AllUsageResponse().originUsages(); -+ -+ mOriginUsages.SwapElements(originUsages); -+ } -+} -+ - GetOriginUsageOp::GetOriginUsageOp(const UsageRequestParams& aParams) - : mParams(aParams.get_OriginUsageParams()) - , mGetGroupUsage(aParams.get_OriginUsageParams().getGroupUsage()) - { - AssertIsOnOwningThread(); - MOZ_ASSERT(aParams.type() == UsageRequestParams::TOriginUsageParams); - } - -diff --git a/dom/quota/PQuota.ipdl b/dom/quota/PQuota.ipdl ---- a/dom/quota/PQuota.ipdl -+++ b/dom/quota/PQuota.ipdl -@@ -12,24 +12,30 @@ include "mozilla/dom/quota/Serialization - - using mozilla::dom::quota::PersistenceType - from "mozilla/dom/quota/PersistenceType.h"; - - namespace mozilla { - namespace dom { - namespace quota { - -+struct AllUsageParams -+{ -+ bool getAll; -+}; -+ - struct OriginUsageParams - { - PrincipalInfo principalInfo; - bool getGroupUsage; - }; - - union UsageRequestParams - { -+ AllUsageParams; - OriginUsageParams; - }; - - struct ClearOriginParams - { - PrincipalInfo principalInfo; - PersistenceType persistenceType; - bool persistenceTypeIsExplicit; -diff --git a/dom/quota/PQuotaUsageRequest.ipdl b/dom/quota/PQuotaUsageRequest.ipdl ---- a/dom/quota/PQuotaUsageRequest.ipdl -+++ b/dom/quota/PQuotaUsageRequest.ipdl -@@ -3,26 +3,39 @@ - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - - include protocol PQuota; - - namespace mozilla { - namespace dom { - namespace quota { - -+struct OriginUsage -+{ -+ nsCString origin; -+ bool persisted; -+ uint64_t usage; -+}; -+ -+struct AllUsageResponse -+{ -+ OriginUsage[] originUsages; -+}; -+ - struct OriginUsageResponse - { - uint64_t usage; - uint64_t fileUsage; - uint64_t limit; - }; - - union UsageRequestResponse - { - nsresult; -+ AllUsageResponse; - OriginUsageResponse; - }; - - protocol PQuotaUsageRequest - { - manager PQuota; - - parent: -diff --git a/dom/quota/QuotaManagerService.cpp b/dom/quota/QuotaManagerService.cpp ---- a/dom/quota/QuotaManagerService.cpp -+++ b/dom/quota/QuotaManagerService.cpp -@@ -490,16 +490,41 @@ QuotaManagerService::RemoveIdleObserver( - - NS_IMPL_ADDREF(QuotaManagerService) - NS_IMPL_RELEASE_WITH_DESTROY(QuotaManagerService, Destroy()) - NS_IMPL_QUERY_INTERFACE(QuotaManagerService, - nsIQuotaManagerService, - nsIObserver) - - NS_IMETHODIMP -+QuotaManagerService::GetUsage(nsIQuotaUsageCallback* aCallback, -+ bool aGetAll, -+ nsIQuotaUsageRequest** _retval) -+{ -+ MOZ_ASSERT(NS_IsMainThread()); -+ MOZ_ASSERT(aCallback); -+ -+ RefPtr<UsageRequest> request = new UsageRequest(aCallback); -+ -+ AllUsageParams params; -+ -+ params.getAll() = aGetAll; -+ -+ nsAutoPtr<PendingRequestInfo> info(new UsageRequestInfo(request, params)); -+ -+ nsresult rv = InitiateRequest(info); -+ if (NS_WARN_IF(NS_FAILED(rv))) { -+ return rv; -+ } -+ -+ request.forget(_retval); -+ return NS_OK; -+} -+ -+NS_IMETHODIMP - QuotaManagerService::GetUsageForPrincipal(nsIPrincipal* aPrincipal, - nsIQuotaUsageCallback* aCallback, - bool aGetGroupUsage, - nsIQuotaUsageRequest** _retval) - { - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(aPrincipal); - MOZ_ASSERT(aCallback); -diff --git a/dom/quota/QuotaRequests.cpp b/dom/quota/QuotaRequests.cpp ---- a/dom/quota/QuotaRequests.cpp -+++ b/dom/quota/QuotaRequests.cpp -@@ -86,16 +86,25 @@ RequestBase::GetResultCode(nsresult* aRe - if (!mHaveResultOrErrorCode) { - return NS_ERROR_FAILURE; - } - - *aResultCode = mResultCode; - return NS_OK; - } - -+UsageRequest::UsageRequest(nsIQuotaUsageCallback* aCallback) -+ : mCallback(aCallback) -+ , mBackgroundActor(nullptr) -+ , mCanceled(false) -+{ -+ AssertIsOnOwningThread(); -+ MOZ_ASSERT(aCallback); -+} -+ - UsageRequest::UsageRequest(nsIPrincipal* aPrincipal, - nsIQuotaUsageCallback* aCallback) - : RequestBase(aPrincipal) - , mCallback(aCallback) - , mBackgroundActor(nullptr) - , mCanceled(false) - { - AssertIsOnOwningThread(); -diff --git a/dom/quota/QuotaRequests.h b/dom/quota/QuotaRequests.h ---- a/dom/quota/QuotaRequests.h -+++ b/dom/quota/QuotaRequests.h -@@ -73,16 +73,18 @@ class UsageRequest final - - nsCOMPtr<nsIVariant> mResult; - - QuotaUsageRequestChild* mBackgroundActor; - - bool mCanceled; - - public: -+ explicit UsageRequest(nsIQuotaUsageCallback* aCallback); -+ - UsageRequest(nsIPrincipal* aPrincipal, - nsIQuotaUsageCallback* aCallback); - - void - SetBackgroundActor(QuotaUsageRequestChild* aBackgroundActor); - - void - ClearBackgroundActor() -diff --git a/dom/quota/QuotaResults.cpp b/dom/quota/QuotaResults.cpp ---- a/dom/quota/QuotaResults.cpp -+++ b/dom/quota/QuotaResults.cpp -@@ -5,16 +5,53 @@ - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - #include "QuotaResults.h" - - namespace mozilla { - namespace dom { - namespace quota { - -+UsageResult::UsageResult(const nsACString& aOrigin, -+ bool aPersisted, -+ uint64_t aUsage) -+ : mOrigin(aOrigin) -+ , mUsage(aUsage) -+ , mPersisted(aPersisted) -+{ -+} -+ -+NS_IMPL_ISUPPORTS(UsageResult, -+ nsIQuotaUsageResult) -+ -+NS_IMETHODIMP -+UsageResult::GetOrigin(nsACString& aOrigin) -+{ -+ aOrigin = mOrigin; -+ return NS_OK; -+} -+ -+NS_IMETHODIMP -+UsageResult::GetPersisted(bool* aPersisted) -+{ -+ MOZ_ASSERT(aPersisted); -+ -+ *aPersisted = mPersisted; -+ return NS_OK; -+} -+ -+NS_IMETHODIMP -+UsageResult::GetUsage(uint64_t* aUsage) -+{ -+ MOZ_ASSERT(aUsage); -+ -+ *aUsage = mUsage; -+ return NS_OK; -+} -+ - OriginUsageResult::OriginUsageResult(uint64_t aUsage, - uint64_t aFileUsage, - uint64_t aLimit) - : mUsage(aUsage) - , mFileUsage(aFileUsage) - , mLimit(aLimit) - { - } -diff --git a/dom/quota/QuotaResults.h b/dom/quota/QuotaResults.h ---- a/dom/quota/QuotaResults.h -+++ b/dom/quota/QuotaResults.h -@@ -8,16 +8,36 @@ - #define mozilla_dom_quota_QuotaResults_h - - #include "nsIQuotaResults.h" - - namespace mozilla { - namespace dom { - namespace quota { - -+class UsageResult -+ : public nsIQuotaUsageResult -+{ -+ nsCString mOrigin; -+ uint64_t mUsage; -+ bool mPersisted; -+ -+public: -+ UsageResult(const nsACString& aOrigin, -+ bool aPersisted, -+ uint64_t aUsage); -+ -+private: -+ virtual ~UsageResult() -+ { } -+ -+ NS_DECL_ISUPPORTS -+ NS_DECL_NSIQUOTAUSAGERESULT -+}; -+ - class OriginUsageResult - : public nsIQuotaOriginUsageResult - { - uint64_t mUsage; - uint64_t mFileUsage; - uint64_t mLimit; - - public: -diff --git a/dom/quota/nsIQuotaManagerService.idl b/dom/quota/nsIQuotaManagerService.idl ---- a/dom/quota/nsIQuotaManagerService.idl -+++ b/dom/quota/nsIQuotaManagerService.idl -@@ -10,16 +10,31 @@ interface nsIPrincipal; - interface nsIQuotaRequest; - interface nsIQuotaUsageCallback; - interface nsIQuotaUsageRequest; - - [scriptable, builtinclass, uuid(1b3d0a38-8151-4cf9-89fa-4f92c2ef0e7e)] - interface nsIQuotaManagerService : nsISupports - { - /** -+ * Schedules an asynchronous callback that will inspect all origins and -+ * return the total amount of disk space being used by storages for each -+ * origin separately. -+ * -+ * @param aCallback -+ * The callback that will be called when the usage is available. -+ * @param aGetAll -+ * An optional boolean to indicate inspection of all origins, -+ * including internal ones. -+ */ -+ [must_use] nsIQuotaUsageRequest -+ getUsage(in nsIQuotaUsageCallback aCallback, -+ [optional] in boolean aGetAll); -+ -+ /** - * Schedules an asynchronous callback that will return the total amount of - * disk space being used by storages for the given origin. - * - * @param aPrincipal - * A principal for the origin whose usage is being queried. - * @param aCallback - * The callback that will be called when the usage is available. - * @param aGetGroupUsage -diff --git a/dom/quota/nsIQuotaRequests.idl b/dom/quota/nsIQuotaRequests.idl ---- a/dom/quota/nsIQuotaRequests.idl -+++ b/dom/quota/nsIQuotaRequests.idl -@@ -18,16 +18,17 @@ interface nsIQuotaRequestBase : nsISuppo - - [must_use] readonly attribute nsresult resultCode; - }; - - [scriptable, uuid(166e28e6-cf6d-4927-a6d7-b51bca9d3469)] - interface nsIQuotaUsageRequest : nsIQuotaRequestBase - { - // The result can contain one of these types: -+ // array of nsIQuotaUsageResult - // nsIQuotaOriginUsageResult - [must_use] readonly attribute nsIVariant result; - - attribute nsIQuotaUsageCallback callback; - - [must_use] void - cancel(); - }; -diff --git a/dom/quota/nsIQuotaResults.idl b/dom/quota/nsIQuotaResults.idl ---- a/dom/quota/nsIQuotaResults.idl -+++ b/dom/quota/nsIQuotaResults.idl -@@ -1,16 +1,26 @@ - /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ - /* vim: set ts=2 et sw=2 tw=80: */ - /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - #include "nsISupports.idl" - -+[scriptable, function, uuid(d8c9328b-9aa8-4f5d-90e6-482de4a6d5b8)] -+interface nsIQuotaUsageResult : nsISupports -+{ -+ readonly attribute ACString origin; -+ -+ readonly attribute boolean persisted; -+ -+ readonly attribute unsigned long long usage; -+}; -+ - [scriptable, function, uuid(96df03d2-116a-493f-bb0b-118c212a6b32)] - interface nsIQuotaOriginUsageResult : nsISupports - { - readonly attribute unsigned long long usage; - - readonly attribute unsigned long long fileUsage; - - readonly attribute unsigned long long limit; - |