зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1195930 - Part 8: Fixed support for origin clearing, reworked internal origin patterns to use OriginAttributesPattern; r=asuth
This commit is contained in:
Родитель
1fb4d91a67
Коммит
af49dba19e
|
@ -186,6 +186,42 @@ public:
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Overlaps(const OriginAttributesPattern& aOther) const
|
||||
{
|
||||
if (mAppId.WasPassed() && aOther.mAppId.WasPassed() &&
|
||||
mAppId.Value() != aOther.mAppId.Value()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mInIsolatedMozBrowser.WasPassed() &&
|
||||
aOther.mInIsolatedMozBrowser.WasPassed() &&
|
||||
mInIsolatedMozBrowser.Value() != aOther.mInIsolatedMozBrowser.Value()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mAddonId.WasPassed() && aOther.mAddonId.WasPassed() &&
|
||||
mAddonId.Value() != aOther.mAddonId.Value()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUserContextId.WasPassed() && aOther.mUserContextId.WasPassed() &&
|
||||
mUserContextId.Value() != aOther.mUserContextId.Value()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mSignedPkg.WasPassed() && aOther.mSignedPkg.WasPassed() &&
|
||||
mSignedPkg.Value() != aOther.mSignedPkg.Value()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mPrivateBrowsingId.WasPassed() && aOther.mPrivateBrowsingId.WasPassed() &&
|
||||
mPrivateBrowsingId.Value() != aOther.mPrivateBrowsingId.Value()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -250,7 +250,7 @@ QuotaRequestChild::Recv__delete__(const RequestResponse& aResponse)
|
|||
break;
|
||||
|
||||
case RequestResponse::TClearOriginResponse:
|
||||
case RequestResponse::TClearAppResponse:
|
||||
case RequestResponse::TClearOriginsResponse:
|
||||
case RequestResponse::TClearAllResponse:
|
||||
case RequestResponse::TResetAllResponse:
|
||||
HandleResponse();
|
||||
|
|
|
@ -347,10 +347,6 @@ public:
|
|||
bool aInternal,
|
||||
OpenDirectoryListener* aOpenListener);
|
||||
|
||||
static bool
|
||||
MatchOriginScopes(const OriginScope& aOriginScope1,
|
||||
const OriginScope& aOriginScope2);
|
||||
|
||||
void
|
||||
AssertIsOnOwningThread() const
|
||||
#ifdef DEBUG
|
||||
|
@ -1220,7 +1216,7 @@ class OriginClearOp final
|
|||
: public QuotaRequestBase
|
||||
{
|
||||
const RequestParams mParams;
|
||||
const bool mApp;
|
||||
const bool mMultiple;
|
||||
|
||||
public:
|
||||
explicit OriginClearOp(const RequestParams& aParams);
|
||||
|
@ -1289,14 +1285,6 @@ AssertNoUnderflow(T aDest, U aArg)
|
|||
MOZ_ASSERT(uint64_t(aDest) >= uint64_t(aArg));
|
||||
}
|
||||
|
||||
bool
|
||||
PatternMatchesOrigin(const nsACString& aPatternString,
|
||||
const nsACString& aOrigin)
|
||||
{
|
||||
// Aren't we smart!
|
||||
return StringBeginsWith(aOrigin, aPatternString);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
BackgroundThreadObject::BackgroundThreadObject()
|
||||
|
@ -2223,13 +2211,12 @@ DirectoryLockImpl::DirectoryLockImpl(QuotaManager* aQuotaManager,
|
|||
{
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT(aQuotaManager);
|
||||
MOZ_ASSERT_IF(aOriginScope.IsOrigin(), !aOriginScope.GetOrigin().IsEmpty());
|
||||
MOZ_ASSERT_IF(!aInternal, !aPersistenceType.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal,
|
||||
aPersistenceType.Value() != PERSISTENCE_TYPE_INVALID);
|
||||
MOZ_ASSERT_IF(!aInternal, !aGroup.IsEmpty());
|
||||
MOZ_ASSERT_IF(aInternal, !aOriginScope.IsEmpty() || aOriginScope.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal, aOriginScope.IsOrigin());
|
||||
MOZ_ASSERT_IF(!aInternal, !aOriginScope.IsEmpty());
|
||||
MOZ_ASSERT_IF(!aInternal, !aIsApp.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal, !aClientType.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal, aClientType.Value() != Client::TYPE_MAX);
|
||||
|
@ -2250,33 +2237,6 @@ DirectoryLockImpl::~DirectoryLockImpl()
|
|||
mQuotaManager->UnregisterDirectoryLock(this);
|
||||
}
|
||||
|
||||
// static
|
||||
bool
|
||||
DirectoryLockImpl::MatchOriginScopes(const OriginScope& aOriginScope1,
|
||||
const OriginScope& aOriginScope2)
|
||||
{
|
||||
AssertIsOnBackgroundThread();
|
||||
|
||||
bool match;
|
||||
|
||||
if (aOriginScope2.IsNull() || aOriginScope1.IsNull()) {
|
||||
match = true;
|
||||
} else if (aOriginScope2.IsOrigin()) {
|
||||
if (aOriginScope1.IsOrigin()) {
|
||||
match = aOriginScope2.Equals(aOriginScope1);
|
||||
} else {
|
||||
match = PatternMatchesOrigin(aOriginScope1, aOriginScope2);
|
||||
}
|
||||
} else if (aOriginScope1.IsOrigin()) {
|
||||
match = PatternMatchesOrigin(aOriginScope2, aOriginScope1);
|
||||
} else {
|
||||
match = PatternMatchesOrigin(aOriginScope1, aOriginScope2) ||
|
||||
PatternMatchesOrigin(aOriginScope2, aOriginScope1);
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
void
|
||||
|
@ -2305,7 +2265,7 @@ DirectoryLockImpl::MustWaitFor(const DirectoryLockImpl& aExistingLock)
|
|||
}
|
||||
|
||||
// If the origin scopes don't overlap, the op can proceed.
|
||||
bool match = MatchOriginScopes(mOriginScope, aExistingLock.mOriginScope);
|
||||
bool match = aExistingLock.mOriginScope.Matches(mOriginScope);
|
||||
if (!match) {
|
||||
return false;
|
||||
}
|
||||
|
@ -2737,10 +2697,10 @@ QuotaObject::MaybeUpdateSize(int64_t aSize, bool aTruncate)
|
|||
for (RefPtr<DirectoryLockImpl>& lock : locks) {
|
||||
MOZ_ASSERT(!lock->GetPersistenceType().IsNull());
|
||||
MOZ_ASSERT(lock->GetOriginScope().IsOrigin());
|
||||
MOZ_ASSERT(!lock->GetOriginScope().IsEmpty());
|
||||
MOZ_ASSERT(!lock->GetOriginScope().GetOrigin().IsEmpty());
|
||||
|
||||
quotaManager->DeleteFilesForOrigin(lock->GetPersistenceType().Value(),
|
||||
lock->GetOriginScope());
|
||||
lock->GetOriginScope().GetOrigin());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2752,14 +2712,14 @@ QuotaObject::MaybeUpdateSize(int64_t aSize, bool aTruncate)
|
|||
MOZ_ASSERT(!lock->GetPersistenceType().IsNull());
|
||||
MOZ_ASSERT(!lock->GetGroup().IsEmpty());
|
||||
MOZ_ASSERT(lock->GetOriginScope().IsOrigin());
|
||||
MOZ_ASSERT(!lock->GetOriginScope().IsEmpty());
|
||||
MOZ_ASSERT(lock->GetOriginScope() != mOriginInfo->mOrigin,
|
||||
MOZ_ASSERT(!lock->GetOriginScope().GetOrigin().IsEmpty());
|
||||
MOZ_ASSERT(lock->GetOriginScope().GetOrigin() != mOriginInfo->mOrigin,
|
||||
"Deleted itself!");
|
||||
|
||||
quotaManager->LockedRemoveQuotaForOrigin(
|
||||
lock->GetPersistenceType().Value(),
|
||||
lock->GetGroup(),
|
||||
lock->GetOriginScope());
|
||||
lock->GetOriginScope().GetOrigin());
|
||||
}
|
||||
|
||||
// We unlocked and relocked several times so we need to recompute all the
|
||||
|
@ -2925,13 +2885,12 @@ QuotaManager::CreateDirectoryLock(Nullable<PersistenceType> aPersistenceType,
|
|||
-> already_AddRefed<DirectoryLockImpl>
|
||||
{
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT_IF(aOriginScope.IsOrigin(), !aOriginScope.GetOrigin().IsEmpty());
|
||||
MOZ_ASSERT_IF(!aInternal, !aPersistenceType.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal,
|
||||
aPersistenceType.Value() != PERSISTENCE_TYPE_INVALID);
|
||||
MOZ_ASSERT_IF(!aInternal, !aGroup.IsEmpty());
|
||||
MOZ_ASSERT_IF(aInternal, !aOriginScope.IsEmpty() || aOriginScope.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal, aOriginScope.IsOrigin());
|
||||
MOZ_ASSERT_IF(!aInternal, !aOriginScope.IsEmpty());
|
||||
MOZ_ASSERT_IF(!aInternal, !aIsApp.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal, !aClientType.IsNull());
|
||||
MOZ_ASSERT_IF(!aInternal, aClientType.Value() != Client::TYPE_MAX);
|
||||
|
@ -3020,20 +2979,20 @@ QuotaManager::RegisterDirectoryLock(DirectoryLockImpl* aLock)
|
|||
MOZ_ASSERT(!persistenceType.IsNull());
|
||||
MOZ_ASSERT(!aLock->GetGroup().IsEmpty());
|
||||
MOZ_ASSERT(originScope.IsOrigin());
|
||||
MOZ_ASSERT(!originScope.IsEmpty());
|
||||
MOZ_ASSERT(!originScope.GetOrigin().IsEmpty());
|
||||
|
||||
DirectoryLockTable& directoryLockTable =
|
||||
GetDirectoryLockTable(persistenceType.Value());
|
||||
|
||||
nsTArray<DirectoryLockImpl*>* array;
|
||||
if (!directoryLockTable.Get(originScope, &array)) {
|
||||
if (!directoryLockTable.Get(originScope.GetOrigin(), &array)) {
|
||||
array = new nsTArray<DirectoryLockImpl*>();
|
||||
directoryLockTable.Put(originScope, array);
|
||||
directoryLockTable.Put(originScope.GetOrigin(), array);
|
||||
|
||||
if (!IsShuttingDown()) {
|
||||
UpdateOriginAccessTime(persistenceType.Value(),
|
||||
aLock->GetGroup(),
|
||||
originScope);
|
||||
originScope.GetOrigin());
|
||||
}
|
||||
}
|
||||
array->AppendElement(aLock);
|
||||
|
@ -3055,22 +3014,22 @@ QuotaManager::UnregisterDirectoryLock(DirectoryLockImpl* aLock)
|
|||
MOZ_ASSERT(!persistenceType.IsNull());
|
||||
MOZ_ASSERT(!aLock->GetGroup().IsEmpty());
|
||||
MOZ_ASSERT(originScope.IsOrigin());
|
||||
MOZ_ASSERT(!originScope.IsEmpty());
|
||||
MOZ_ASSERT(!originScope.GetOrigin().IsEmpty());
|
||||
|
||||
DirectoryLockTable& directoryLockTable =
|
||||
GetDirectoryLockTable(persistenceType.Value());
|
||||
|
||||
nsTArray<DirectoryLockImpl*>* array;
|
||||
MOZ_ALWAYS_TRUE(directoryLockTable.Get(originScope, &array));
|
||||
MOZ_ALWAYS_TRUE(directoryLockTable.Get(originScope.GetOrigin(), &array));
|
||||
|
||||
MOZ_ALWAYS_TRUE(array->RemoveElement(aLock));
|
||||
if (array->IsEmpty()) {
|
||||
directoryLockTable.Remove(originScope);
|
||||
directoryLockTable.Remove(originScope.GetOrigin());
|
||||
|
||||
if (!IsShuttingDown()) {
|
||||
UpdateOriginAccessTime(persistenceType.Value(),
|
||||
aLock->GetGroup(),
|
||||
originScope);
|
||||
originScope.GetOrigin());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3109,8 +3068,7 @@ QuotaManager::CollectOriginsForEviction(
|
|||
bool match = false;
|
||||
for (uint32_t j = aLocks.Length(); j > 0; j--) {
|
||||
DirectoryLockImpl* lock = aLocks[j - 1];
|
||||
if (DirectoryLockImpl::MatchOriginScopes(originScope,
|
||||
lock->GetOriginScope())) {
|
||||
if (originScope.Matches(lock->GetOriginScope())) {
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
|
@ -4451,13 +4409,13 @@ QuotaManager::OpenDirectoryInternal(Nullable<PersistenceType> aPersistenceType,
|
|||
|
||||
const OriginScope& originScope = blockedOnLock->GetOriginScope();
|
||||
MOZ_ASSERT(originScope.IsOrigin());
|
||||
MOZ_ASSERT(!originScope.IsEmpty());
|
||||
MOZ_ASSERT(!originScope.GetOrigin().IsEmpty());
|
||||
|
||||
nsAutoPtr<nsTHashtable<nsCStringHashKey>>& origin = origins[clientType];
|
||||
if (!origin) {
|
||||
origin = new nsTHashtable<nsCStringHashKey>();
|
||||
}
|
||||
origin->PutEntry(originScope);
|
||||
origin->PutEntry(originScope.GetOrigin());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5147,48 +5105,6 @@ QuotaManager::FinalizeOriginEviction(
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
QuotaManager::GetOriginPatternString(uint32_t aAppId,
|
||||
MozBrowserPatternFlag aBrowserFlag,
|
||||
const nsACString& aOrigin,
|
||||
nsAutoCString& _retval)
|
||||
{
|
||||
NS_ASSERTION(aAppId != kUnknownAppId, "Bad appId!");
|
||||
NS_ASSERTION(aOrigin.IsEmpty() || aBrowserFlag != IgnoreMozBrowser,
|
||||
"Bad args!");
|
||||
|
||||
if (aOrigin.IsEmpty()) {
|
||||
_retval.Truncate();
|
||||
|
||||
_retval.AppendInt(aAppId);
|
||||
_retval.Append('+');
|
||||
|
||||
if (aBrowserFlag != IgnoreMozBrowser) {
|
||||
if (aBrowserFlag == MozBrowser) {
|
||||
_retval.Append('t');
|
||||
}
|
||||
else {
|
||||
_retval.Append('f');
|
||||
}
|
||||
_retval.Append('+');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
if (aAppId != nsIScriptSecurityManager::NO_APP_ID ||
|
||||
aBrowserFlag == MozBrowser) {
|
||||
nsAutoCString pattern;
|
||||
GetOriginPatternString(aAppId, aBrowserFlag, EmptyCString(), pattern);
|
||||
NS_ASSERTION(PatternMatchesOrigin(pattern, aOrigin),
|
||||
"Origin doesn't match parameters!");
|
||||
}
|
||||
#endif
|
||||
|
||||
_retval = aOrigin;
|
||||
}
|
||||
|
||||
void
|
||||
QuotaManager::ShutdownTimerCallback(nsITimer* aTimer, void* aClosure)
|
||||
{
|
||||
|
@ -5629,7 +5545,7 @@ FinalizeOriginEvictionOp::DoDirectoryWork(QuotaManager* aQuotaManager)
|
|||
|
||||
for (RefPtr<DirectoryLockImpl>& lock : mLocks) {
|
||||
aQuotaManager->OriginClearCompleted(lock->GetPersistenceType().Value(),
|
||||
lock->GetOriginScope(),
|
||||
lock->GetOriginScope().GetOrigin(),
|
||||
lock->GetIsApp().Value());
|
||||
}
|
||||
|
||||
|
@ -5722,7 +5638,7 @@ SaveOriginAccessTimeOp::DoDirectoryWork(QuotaManager* aQuotaManager)
|
|||
nsCOMPtr<nsIFile> directory;
|
||||
nsresult rv =
|
||||
aQuotaManager->GetDirectoryForOrigin(mPersistenceType.Value(),
|
||||
mOriginScope,
|
||||
mOriginScope.GetOrigin(),
|
||||
getter_AddRefs(directory));
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
|
@ -5841,7 +5757,7 @@ Quota::AllocPQuotaRequestParent(const RequestParams& aParams)
|
|||
AssertIsOnBackgroundThread();
|
||||
MOZ_ASSERT(aParams.type() != RequestParams::T__None);
|
||||
|
||||
if (aParams.type() == RequestParams::TClearAppParams) {
|
||||
if (aParams.type() == RequestParams::TClearOriginsParams) {
|
||||
PBackgroundParent* actor = Manager();
|
||||
MOZ_ASSERT(actor);
|
||||
|
||||
|
@ -5855,7 +5771,7 @@ Quota::AllocPQuotaRequestParent(const RequestParams& aParams)
|
|||
|
||||
switch (aParams.type()) {
|
||||
case RequestParams::TClearOriginParams:
|
||||
case RequestParams::TClearAppParams:
|
||||
case RequestParams::TClearOriginsParams:
|
||||
actor = new OriginClearOp(aParams);
|
||||
break;
|
||||
|
||||
|
@ -6023,7 +5939,7 @@ GetUsageOp::AddToUsage(QuotaManager* aQuotaManager,
|
|||
|
||||
nsCOMPtr<nsIFile> directory;
|
||||
nsresult rv = aQuotaManager->GetDirectoryForOrigin(aPersistenceType,
|
||||
mOriginScope,
|
||||
mOriginScope.GetOrigin(),
|
||||
getter_AddRefs(directory));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
|
@ -6037,7 +5953,8 @@ GetUsageOp::AddToUsage(QuotaManager* aQuotaManager,
|
|||
bool initialized;
|
||||
|
||||
if (IsTreatedAsPersistent(aPersistenceType, mIsApp)) {
|
||||
nsCString originKey = OriginKey(aPersistenceType, mOriginScope);
|
||||
nsCString originKey =
|
||||
OriginKey(aPersistenceType, mOriginScope.GetOrigin());
|
||||
initialized = aQuotaManager->IsOriginInitialized(originKey);
|
||||
} else {
|
||||
initialized = aQuotaManager->IsTemporaryStorageInitialized();
|
||||
|
@ -6096,11 +6013,15 @@ GetUsageOp::AddToUsage(QuotaManager* aQuotaManager,
|
|||
MOZ_ASSERT(client);
|
||||
|
||||
if (initialized) {
|
||||
rv = client->GetUsageForOrigin(aPersistenceType, mGroup, mOriginScope,
|
||||
rv = client->GetUsageForOrigin(aPersistenceType,
|
||||
mGroup,
|
||||
mOriginScope.GetOrigin(),
|
||||
&mUsageInfo);
|
||||
}
|
||||
else {
|
||||
rv = client->InitOrigin(aPersistenceType, mGroup, mOriginScope,
|
||||
rv = client->InitOrigin(aPersistenceType,
|
||||
mGroup,
|
||||
mOriginScope.GetOrigin(),
|
||||
&mUsageInfo);
|
||||
}
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
@ -6306,10 +6227,10 @@ ResetOrClearOp::GetResponse(RequestResponse& aResponse)
|
|||
OriginClearOp::OriginClearOp(const RequestParams& aParams)
|
||||
: QuotaRequestBase(/* aExclusive */ true)
|
||||
, mParams(aParams)
|
||||
, mApp(aParams.type() == RequestParams::TClearAppParams)
|
||||
, mMultiple(aParams.type() == RequestParams::TClearOriginsParams)
|
||||
{
|
||||
MOZ_ASSERT(aParams.type() == RequestParams::TClearOriginParams ||
|
||||
aParams.type() == RequestParams::TClearAppParams);
|
||||
aParams.type() == RequestParams::TClearOriginsParams);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -6322,16 +6243,7 @@ OriginClearOp::Init(Quota* aQuota)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (mApp) {
|
||||
const ClearAppParams& params = mParams.get_ClearAppParams();
|
||||
|
||||
nsAutoCString pattern;
|
||||
QuotaManager::GetOriginPatternStringMaybeIgnoreBrowser(params.appId(),
|
||||
params.browserOnly(),
|
||||
pattern);
|
||||
|
||||
mOriginScope.SetFromPattern(pattern);
|
||||
} else {
|
||||
if (!mMultiple) {
|
||||
const ClearOriginParams& params = mParams.get_ClearOriginParams();
|
||||
|
||||
if (params.persistenceTypeIsExplicit()) {
|
||||
|
@ -6339,10 +6251,10 @@ OriginClearOp::Init(Quota* aQuota)
|
|||
|
||||
mPersistenceType.SetValue(params.persistenceType());
|
||||
}
|
||||
|
||||
mNeedsMainThreadInit = true;
|
||||
}
|
||||
|
||||
mNeedsMainThreadInit = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -6351,37 +6263,35 @@ OriginClearOp::DoInitOnMainThread()
|
|||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
MOZ_ASSERT(GetState() == State_Initializing);
|
||||
MOZ_ASSERT(!mApp);
|
||||
MOZ_ASSERT(mNeedsMainThreadInit);
|
||||
|
||||
const ClearOriginParams& params = mParams.get_ClearOriginParams();
|
||||
if (mMultiple) {
|
||||
const ClearOriginsParams& params = mParams.get_ClearOriginsParams();
|
||||
|
||||
const PrincipalInfo& principalInfo = params.principalInfo();
|
||||
mOriginScope.SetFromJSONPattern(params.pattern());
|
||||
} else {
|
||||
const ClearOriginParams& params = mParams.get_ClearOriginParams();
|
||||
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIPrincipal> principal =
|
||||
PrincipalInfoToPrincipal(principalInfo, &rv);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
const PrincipalInfo& principalInfo = params.principalInfo();
|
||||
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIPrincipal> principal =
|
||||
PrincipalInfoToPrincipal(principalInfo, &rv);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Figure out which origin we're dealing with.
|
||||
nsCString origin;
|
||||
rv = QuotaManager::GetInfoFromPrincipal(principal, nullptr, nullptr, &origin,
|
||||
nullptr);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
mOriginScope.SetFromOrigin(origin);
|
||||
}
|
||||
|
||||
// Figure out which origin we're dealing with.
|
||||
nsCString origin;
|
||||
rv = QuotaManager::GetInfoFromPrincipal(principal, nullptr, nullptr, &origin,
|
||||
nullptr);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
const mozilla::PrincipalOriginAttributes& attrs =
|
||||
mozilla::BasePrincipal::Cast(principal)->OriginAttributesRef();
|
||||
|
||||
nsAutoCString pattern;
|
||||
QuotaManager::GetOriginPatternString(attrs.mAppId, attrs.mInIsolatedMozBrowser, origin,
|
||||
pattern);
|
||||
|
||||
mOriginScope.SetFromPattern(pattern);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -6411,8 +6321,12 @@ OriginClearOp::DeleteFiles(QuotaManager* aQuotaManager,
|
|||
return;
|
||||
}
|
||||
|
||||
nsCString originSanitized(mOriginScope);
|
||||
SanitizeOriginString(originSanitized);
|
||||
OriginScope originScope = mOriginScope.Clone();
|
||||
if (originScope.IsOrigin()) {
|
||||
nsCString originSanitized(originScope.GetOrigin());
|
||||
SanitizeOriginString(originSanitized);
|
||||
originScope.SetOrigin(originSanitized);
|
||||
}
|
||||
|
||||
bool hasMore;
|
||||
while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore) {
|
||||
|
@ -6445,9 +6359,9 @@ OriginClearOp::DeleteFiles(QuotaManager* aQuotaManager,
|
|||
continue;
|
||||
}
|
||||
|
||||
// Skip storages for other apps.
|
||||
if (!PatternMatchesOrigin(originSanitized,
|
||||
NS_ConvertUTF16toUTF8(leafName))) {
|
||||
// Skip the origin directory if it doesn't match the pattern.
|
||||
if (!originScope.MatchesOrigin(OriginScope::FromOrigin(
|
||||
NS_ConvertUTF16toUTF8(leafName)))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -6517,8 +6431,8 @@ OriginClearOp::GetResponse(RequestResponse& aResponse)
|
|||
{
|
||||
AssertIsOnOwningThread();
|
||||
|
||||
if (mApp) {
|
||||
aResponse = ClearAppResponse();
|
||||
if (mMultiple) {
|
||||
aResponse = ClearOriginsResponse();
|
||||
} else {
|
||||
aResponse = ClearOriginResponse();
|
||||
}
|
||||
|
|
|
@ -9,9 +9,11 @@
|
|||
|
||||
#include "mozilla/dom/quota/QuotaCommon.h"
|
||||
|
||||
#include "mozilla/BasePrincipal.h"
|
||||
|
||||
BEGIN_QUOTA_NAMESPACE
|
||||
|
||||
class OriginScope : public nsCString
|
||||
class OriginScope
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
|
@ -24,19 +26,25 @@ public:
|
|||
static OriginScope
|
||||
FromOrigin(const nsACString& aOrigin)
|
||||
{
|
||||
return OriginScope(aOrigin, eOrigin);
|
||||
return OriginScope(aOrigin);
|
||||
}
|
||||
|
||||
static OriginScope
|
||||
FromPattern(const nsACString& aPattern)
|
||||
FromPattern(const mozilla::OriginAttributesPattern& aPattern)
|
||||
{
|
||||
return OriginScope(aPattern, ePattern);
|
||||
return OriginScope(aPattern);
|
||||
}
|
||||
|
||||
static OriginScope
|
||||
FromJSONPattern(const nsAString& aJSONPattern)
|
||||
{
|
||||
return OriginScope(aJSONPattern);
|
||||
}
|
||||
|
||||
static OriginScope
|
||||
FromNull()
|
||||
{
|
||||
return OriginScope(NullCString(), eNull);
|
||||
return OriginScope();
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -66,32 +74,157 @@ public:
|
|||
void
|
||||
SetFromOrigin(const nsACString& aOrigin)
|
||||
{
|
||||
Assign(aOrigin);
|
||||
mOrigin = aOrigin;
|
||||
mType = eOrigin;
|
||||
|
||||
nsCString originNoSuffix;
|
||||
MOZ_ALWAYS_TRUE(mOriginAttributes.PopulateFromOrigin(aOrigin,
|
||||
originNoSuffix));
|
||||
}
|
||||
|
||||
void
|
||||
SetFromPattern(const nsACString& aPattern)
|
||||
SetFromPattern(const mozilla::OriginAttributesPattern& aPattern)
|
||||
{
|
||||
Assign(aPattern);
|
||||
mPattern = aPattern;
|
||||
mType = ePattern;
|
||||
}
|
||||
|
||||
void
|
||||
SetFromJSONPattern(const nsAString& aJSONPattern)
|
||||
{
|
||||
MOZ_ALWAYS_TRUE(mPattern.Init(aJSONPattern));
|
||||
mType = ePattern;
|
||||
}
|
||||
|
||||
void
|
||||
SetFromNull()
|
||||
{
|
||||
SetIsVoid(true);
|
||||
mType = eNull;
|
||||
}
|
||||
|
||||
const nsACString&
|
||||
GetOrigin() const
|
||||
{
|
||||
MOZ_ASSERT(IsOrigin());
|
||||
return mOrigin;
|
||||
}
|
||||
|
||||
void
|
||||
SetOrigin(const nsACString& aOrigin)
|
||||
{
|
||||
MOZ_ASSERT(IsOrigin());
|
||||
mOrigin = aOrigin;
|
||||
}
|
||||
|
||||
const mozilla::OriginAttributes&
|
||||
GetOriginAttributes() const
|
||||
{
|
||||
MOZ_ASSERT(IsOrigin());
|
||||
return mOriginAttributes;
|
||||
}
|
||||
|
||||
const mozilla::OriginAttributesPattern&
|
||||
GetPattern() const
|
||||
{
|
||||
MOZ_ASSERT(IsPattern());
|
||||
return mPattern;
|
||||
}
|
||||
|
||||
bool MatchesOrigin(const OriginScope& aOther) const
|
||||
{
|
||||
MOZ_ASSERT(aOther.IsOrigin());
|
||||
|
||||
bool match;
|
||||
|
||||
if (IsOrigin()) {
|
||||
match = mOrigin.Equals(aOther.mOrigin);
|
||||
} else if (IsPattern()) {
|
||||
match = mPattern.Matches(aOther.mOriginAttributes);
|
||||
} else {
|
||||
match = true;
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
bool MatchesPattern(const OriginScope& aOther) const
|
||||
{
|
||||
MOZ_ASSERT(aOther.IsPattern());
|
||||
|
||||
bool match;
|
||||
|
||||
if (IsOrigin()) {
|
||||
match = aOther.mPattern.Matches(mOriginAttributes);
|
||||
} else if (IsPattern()) {
|
||||
match = mPattern.Overlaps(aOther.mPattern);
|
||||
} else {
|
||||
match = true;
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
bool Matches(const OriginScope& aOther) const
|
||||
{
|
||||
bool match;
|
||||
|
||||
if (aOther.IsOrigin()) {
|
||||
match = MatchesOrigin(aOther);
|
||||
} else if (aOther.IsPattern()) {
|
||||
match = MatchesPattern(aOther);
|
||||
} else {
|
||||
match = true;
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
OriginScope
|
||||
Clone()
|
||||
{
|
||||
if (IsOrigin()) {
|
||||
return OriginScope(mOrigin);
|
||||
}
|
||||
|
||||
if (IsPattern()) {
|
||||
return OriginScope(mPattern);
|
||||
}
|
||||
|
||||
MOZ_ASSERT(IsNull());
|
||||
return OriginScope();
|
||||
}
|
||||
|
||||
private:
|
||||
OriginScope(const nsACString& aString, Type aType)
|
||||
: nsCString(aString), mType(aType)
|
||||
explicit OriginScope(const nsACString& aOrigin)
|
||||
: mOrigin(aOrigin)
|
||||
, mType(eOrigin)
|
||||
{
|
||||
nsCString originNoSuffix;
|
||||
MOZ_ALWAYS_TRUE(mOriginAttributes.PopulateFromOrigin(aOrigin,
|
||||
originNoSuffix));
|
||||
}
|
||||
|
||||
explicit OriginScope(const mozilla::OriginAttributesPattern& aPattern)
|
||||
: mPattern(aPattern)
|
||||
, mType(ePattern)
|
||||
{ }
|
||||
|
||||
explicit OriginScope(const nsAString& aJSONPattern)
|
||||
: mType(ePattern)
|
||||
{
|
||||
MOZ_ALWAYS_TRUE(mPattern.Init(aJSONPattern));
|
||||
}
|
||||
|
||||
OriginScope()
|
||||
: mType(eNull)
|
||||
{ }
|
||||
|
||||
bool
|
||||
operator==(const OriginScope& aOther) = delete;
|
||||
|
||||
nsCString mOrigin;
|
||||
PrincipalOriginAttributes mOriginAttributes;
|
||||
mozilla::OriginAttributesPattern mPattern;
|
||||
Type mType;
|
||||
};
|
||||
|
||||
|
|
|
@ -34,10 +34,9 @@ struct ClearOriginParams
|
|||
bool persistenceTypeIsExplicit;
|
||||
};
|
||||
|
||||
struct ClearAppParams
|
||||
struct ClearOriginsParams
|
||||
{
|
||||
uint32_t appId;
|
||||
bool browserOnly;
|
||||
nsString pattern;
|
||||
};
|
||||
|
||||
struct ClearAllParams
|
||||
|
@ -51,7 +50,7 @@ struct ResetAllParams
|
|||
union RequestParams
|
||||
{
|
||||
ClearOriginParams;
|
||||
ClearAppParams;
|
||||
ClearOriginsParams;
|
||||
ClearAllParams;
|
||||
ResetAllParams;
|
||||
};
|
||||
|
|
|
@ -12,7 +12,7 @@ struct ClearOriginResponse
|
|||
{
|
||||
};
|
||||
|
||||
struct ClearAppResponse
|
||||
struct ClearOriginsResponse
|
||||
{
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@ union RequestResponse
|
|||
{
|
||||
nsresult;
|
||||
ClearOriginResponse;
|
||||
ClearAppResponse;
|
||||
ClearOriginsResponse;
|
||||
ClearAllResponse;
|
||||
ResetAllResponse;
|
||||
};
|
||||
|
|
|
@ -100,13 +100,6 @@ class QuotaManager final
|
|||
friend class OriginInfo;
|
||||
friend class QuotaObject;
|
||||
|
||||
enum MozBrowserPatternFlag
|
||||
{
|
||||
MozBrowser = 0,
|
||||
NotMozBrowser,
|
||||
IgnoreMozBrowser
|
||||
};
|
||||
|
||||
typedef nsClassHashtable<nsCStringHashKey,
|
||||
nsTArray<DirectoryLockImpl*>> DirectoryLockTable;
|
||||
|
||||
|
@ -396,24 +389,6 @@ public:
|
|||
static void
|
||||
ChromeOrigin(nsACString& aOrigin);
|
||||
|
||||
static void
|
||||
GetOriginPatternString(uint32_t aAppId, bool aBrowserOnly,
|
||||
const nsACString& aOrigin, nsAutoCString& _retval)
|
||||
{
|
||||
return GetOriginPatternString(aAppId,
|
||||
aBrowserOnly ? MozBrowser : NotMozBrowser,
|
||||
aOrigin, _retval);
|
||||
}
|
||||
|
||||
static void
|
||||
GetOriginPatternStringMaybeIgnoreBrowser(uint32_t aAppId, bool aBrowserOnly,
|
||||
nsAutoCString& _retval)
|
||||
{
|
||||
return GetOriginPatternString(aAppId,
|
||||
aBrowserOnly ? MozBrowser : IgnoreMozBrowser,
|
||||
EmptyCString(), _retval);
|
||||
}
|
||||
|
||||
private:
|
||||
QuotaManager();
|
||||
|
||||
|
@ -508,12 +483,6 @@ private:
|
|||
DirectoryLockTable&
|
||||
GetDirectoryLockTable(PersistenceType aPersistenceType);
|
||||
|
||||
static void
|
||||
GetOriginPatternString(uint32_t aAppId,
|
||||
MozBrowserPatternFlag aBrowserFlag,
|
||||
const nsACString& aOrigin,
|
||||
nsAutoCString& _retval);
|
||||
|
||||
static void
|
||||
ShutdownTimerCallback(nsITimer* aTimer, void* aClosure);
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
#include "QuotaManagerService.h"
|
||||
|
||||
#include "ActorsChild.h"
|
||||
#include "mozIApplicationClearPrivateDataParams.h"
|
||||
#include "mozilla/BasePrincipal.h"
|
||||
#include "mozilla/ClearOnShutdown.h"
|
||||
#include "mozilla/Hal.h"
|
||||
|
@ -643,34 +642,15 @@ QuotaManagerService::Observe(nsISupports* aSubject,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
if (!strcmp(aTopic, TOPIC_WEB_APP_CLEAR_DATA)) {
|
||||
nsCOMPtr<mozIApplicationClearPrivateDataParams> params =
|
||||
do_QueryInterface(aSubject);
|
||||
if (NS_WARN_IF(!params)) {
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
uint32_t appId;
|
||||
nsresult rv = params->GetAppId(&appId);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
bool browserOnly;
|
||||
rv = params->GetBrowserOnly(&browserOnly);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (!strcmp(aTopic, "clear-origin-data")) {
|
||||
RefPtr<Request> request = new Request();
|
||||
|
||||
ClearAppParams requestParams;
|
||||
requestParams.appId() = appId;
|
||||
requestParams.browserOnly() = browserOnly;
|
||||
ClearOriginsParams requestParams;
|
||||
requestParams.pattern() = nsDependentString(aData);
|
||||
|
||||
nsAutoPtr<PendingRequestInfo> info(new RequestInfo(request, requestParams));
|
||||
|
||||
rv = InitiateRequest(info);
|
||||
nsresult rv = InitiateRequest(info);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -1363,7 +1363,7 @@ static const mozilla::Module::CategoryEntry kLayoutCategories[] = {
|
|||
#ifndef MOZ_SIMPLEPUSH
|
||||
{ "app-startup", "Push Notifier", "service," PUSHNOTIFIER_CONTRACTID },
|
||||
#endif
|
||||
{ TOPIC_WEB_APP_CLEAR_DATA, "QuotaManagerService", "service," QUOTAMANAGER_SERVICE_CONTRACTID },
|
||||
{ "clear-origin-data", "QuotaManagerService", "service," QUOTAMANAGER_SERVICE_CONTRACTID },
|
||||
{ OBSERVER_TOPIC_IDLE_DAILY, "QuotaManagerService", QUOTAMANAGER_SERVICE_CONTRACTID },
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
{ "app-startup", "Volume Service", "service," NS_VOLUMESERVICE_CONTRACTID },
|
||||
|
|
Загрузка…
Ссылка в новой задаче