зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1181428 - Add persist option to OriginKey to skip saving of temporal keys. r=mt
--HG-- extra : transplant_source : %7C%F5%ACv%E0%7F9I%A0%7F%9A%1A%02%BA%97%CA3%A7%B7%F2
This commit is contained in:
Родитель
88f4606bfa
Коммит
5e4109ceda
|
@ -1929,7 +1929,8 @@ MediaManager::EnumerateDevicesImpl(uint64_t aWindowId, MediaSourceEnum aVideoTyp
|
|||
// thread later once GetOriginKey resolves. Needed variables are "captured"
|
||||
// (passed by value) safely into the lambda.
|
||||
|
||||
nsRefPtr<Pledge<nsCString>> p = media::GetOriginKey(origin, privateBrowsing);
|
||||
nsRefPtr<Pledge<nsCString>> p = media::GetOriginKey(origin, privateBrowsing,
|
||||
true);
|
||||
p->Then([id, aWindowId, aVideoType,
|
||||
aFake, aFakeTracks](const nsCString& aOriginKey) mutable {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace mozilla {
|
|||
namespace media {
|
||||
|
||||
already_AddRefed<Pledge<nsCString>>
|
||||
GetOriginKey(const nsCString& aOrigin, bool aPrivateBrowsing)
|
||||
GetOriginKey(const nsCString& aOrigin, bool aPrivateBrowsing, bool aPersist)
|
||||
{
|
||||
nsRefPtr<MediaManager> mgr = MediaManager::GetInstance();
|
||||
MOZ_ASSERT(mgr);
|
||||
|
@ -29,9 +29,10 @@ GetOriginKey(const nsCString& aOrigin, bool aPrivateBrowsing)
|
|||
uint32_t id = mgr->mGetOriginKeyPledges.Append(*p);
|
||||
|
||||
if (XRE_GetProcessType() == GeckoProcessType_Default) {
|
||||
mgr->GetNonE10sParent()->RecvGetOriginKey(id, aOrigin, aPrivateBrowsing);
|
||||
mgr->GetNonE10sParent()->RecvGetOriginKey(id, aOrigin, aPrivateBrowsing,
|
||||
aPersist);
|
||||
} else {
|
||||
Child::Get()->SendGetOriginKey(id, aOrigin, aPrivateBrowsing);
|
||||
Child::Get()->SendGetOriginKey(id, aOrigin, aPrivateBrowsing, aPersist);
|
||||
}
|
||||
return p.forget();
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ namespace media {
|
|||
// (promise-like objects) with the future value. Use pledge.Then(func) to access.
|
||||
|
||||
already_AddRefed<Pledge<nsCString>>
|
||||
GetOriginKey(const nsCString& aOrigin, bool aPrivateBrowsing);
|
||||
GetOriginKey(const nsCString& aOrigin, bool aPrivateBrowsing, bool aPersist);
|
||||
|
||||
void
|
||||
SanitizeOriginKeys(const uint64_t& aSinceWhen);
|
||||
|
|
|
@ -48,7 +48,7 @@ class OriginKeyStore : public nsISupports
|
|||
static const size_t DecodedLength = 18;
|
||||
static const size_t EncodedLength = DecodedLength * 4 / 3;
|
||||
|
||||
OriginKey(const nsACString& aKey, int64_t aSecondsStamp)
|
||||
OriginKey(const nsACString& aKey, int64_t aSecondsStamp = 0) // 0 = temporal
|
||||
: mKey(aKey)
|
||||
, mSecondsStamp(aSecondsStamp) {}
|
||||
|
||||
|
@ -59,10 +59,10 @@ class OriginKeyStore : public nsISupports
|
|||
class OriginKeysTable
|
||||
{
|
||||
public:
|
||||
OriginKeysTable() {}
|
||||
OriginKeysTable() : mPersistCount(0) {}
|
||||
|
||||
nsresult
|
||||
GetOriginKey(const nsACString& aOrigin, nsCString& result)
|
||||
GetOriginKey(const nsACString& aOrigin, nsCString& aResult, bool aPersist = false)
|
||||
{
|
||||
OriginKey* key;
|
||||
if (!mKeys.Get(aOrigin, &key)) {
|
||||
|
@ -71,10 +71,14 @@ class OriginKeyStore : public nsISupports
|
|||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
key = new OriginKey(salt, PR_Now() / PR_USEC_PER_SEC);
|
||||
key = new OriginKey(salt);
|
||||
mKeys.Put(aOrigin, key);
|
||||
}
|
||||
result = key->mKey;
|
||||
if (aPersist && !key->mSecondsStamp) {
|
||||
key->mSecondsStamp = PR_Now() / PR_USEC_PER_SEC;
|
||||
mPersistCount++;
|
||||
}
|
||||
aResult = key->mKey;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -98,10 +102,12 @@ class OriginKeyStore : public nsISupports
|
|||
// Avoid int64_t* <-> void* casting offset
|
||||
OriginKey since(nsCString(), aSinceWhen / PR_USEC_PER_SEC);
|
||||
mKeys.Enumerate(HashCleaner, &since);
|
||||
mPersistCount = 0;
|
||||
}
|
||||
|
||||
protected:
|
||||
nsClassHashtable<nsCStringHashKey, OriginKey> mKeys;
|
||||
size_t mPersistCount;
|
||||
};
|
||||
|
||||
class OriginKeysLoader : public OriginKeysTable
|
||||
|
@ -110,11 +116,11 @@ class OriginKeyStore : public nsISupports
|
|||
OriginKeysLoader() {}
|
||||
|
||||
nsresult
|
||||
GetOriginKey(const nsACString& aOrigin, nsCString& result)
|
||||
GetOriginKey(const nsACString& aOrigin, nsCString& aResult, bool aPersist)
|
||||
{
|
||||
auto before = mKeys.Count();
|
||||
OriginKeysTable::GetOriginKey(aOrigin, result);
|
||||
if (mKeys.Count() != before) {
|
||||
auto before = mPersistCount;
|
||||
OriginKeysTable::GetOriginKey(aOrigin, aResult, aPersist);
|
||||
if (mPersistCount != before) {
|
||||
Save();
|
||||
}
|
||||
return NS_OK;
|
||||
|
@ -162,6 +168,7 @@ class OriginKeyStore : public nsISupports
|
|||
}
|
||||
nsCOMPtr<nsILineInputStream> i = do_QueryInterface(stream);
|
||||
MOZ_ASSERT(i);
|
||||
MOZ_ASSERT(!mPersistCount);
|
||||
|
||||
nsCString line;
|
||||
bool hasMoreLines;
|
||||
|
@ -208,6 +215,7 @@ class OriginKeyStore : public nsISupports
|
|||
}
|
||||
mKeys.Put(origin, new OriginKey(key, secondsstamp));
|
||||
}
|
||||
mPersistCount = mKeys.Count();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -216,6 +224,10 @@ class OriginKeyStore : public nsISupports
|
|||
{
|
||||
auto* stream = static_cast<nsIOutputStream *>(aUserArg);
|
||||
|
||||
if (!aOriginKey->mSecondsStamp) {
|
||||
return PL_DHASH_NEXT; // don't write temporal ones
|
||||
}
|
||||
|
||||
nsCString buffer;
|
||||
buffer.Append(aOriginKey->mKey);
|
||||
buffer.Append(' ');
|
||||
|
@ -375,8 +387,9 @@ Parent<Super>* GccGetSingleton() { return Parent<Super>::GetSingleton(); };
|
|||
|
||||
template<class Super> bool
|
||||
Parent<Super>::RecvGetOriginKey(const uint32_t& aRequestId,
|
||||
const nsCString& aOrigin,
|
||||
const bool& aPrivateBrowsing)
|
||||
const nsCString& aOrigin,
|
||||
const bool& aPrivateBrowsing,
|
||||
const bool& aPersist)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
|
@ -401,15 +414,15 @@ Parent<Super>::RecvGetOriginKey(const uint32_t& aRequestId,
|
|||
nsRefPtr<OriginKeyStore> store(mOriginKeyStore);
|
||||
bool sameProcess = mSameProcess;
|
||||
|
||||
rv = sts->Dispatch(NewRunnableFrom([id, profileDir, store, sameProcess,
|
||||
aOrigin, aPrivateBrowsing]() -> nsresult {
|
||||
rv = sts->Dispatch(NewRunnableFrom([id, profileDir, store, sameProcess, aOrigin,
|
||||
aPrivateBrowsing, aPersist]() -> nsresult {
|
||||
MOZ_ASSERT(!NS_IsMainThread());
|
||||
store->mOriginKeys.SetProfileDir(profileDir);
|
||||
nsCString result;
|
||||
if (aPrivateBrowsing) {
|
||||
store->mPrivateBrowsingOriginKeys.GetOriginKey(aOrigin, result);
|
||||
} else {
|
||||
store->mOriginKeys.GetOriginKey(aOrigin, result);
|
||||
store->mOriginKeys.GetOriginKey(aOrigin, result, aPersist);
|
||||
}
|
||||
|
||||
// Pass result back to main thread.
|
||||
|
|
|
@ -27,7 +27,8 @@ class NonE10s
|
|||
protected:
|
||||
virtual bool RecvGetOriginKey(const uint32_t& aRequestId,
|
||||
const nsCString& aOrigin,
|
||||
const bool& aPrivateBrowsing) = 0;
|
||||
const bool& aPrivateBrowsing,
|
||||
const bool& aPersist) = 0;
|
||||
virtual bool RecvSanitizeOriginKeys(const uint64_t& aSinceWhen) = 0;
|
||||
virtual void
|
||||
ActorDestroy(ActorDestroyReason aWhy) = 0;
|
||||
|
@ -45,7 +46,8 @@ public:
|
|||
|
||||
virtual bool RecvGetOriginKey(const uint32_t& aRequestId,
|
||||
const nsCString& aOrigin,
|
||||
const bool& aPrivateBrowsing) override;
|
||||
const bool& aPrivateBrowsing,
|
||||
const bool& aPersist) override;
|
||||
virtual bool RecvSanitizeOriginKeys(const uint64_t& aSinceWhen) override;
|
||||
virtual void ActorDestroy(ActorDestroyReason aWhy) override;
|
||||
|
||||
|
|
|
@ -13,12 +13,23 @@ protocol PMedia
|
|||
|
||||
parent:
|
||||
/**
|
||||
* Requests a persistent unique secret key for each origin.
|
||||
* Requests a potentially persistent unique secret key for each origin.
|
||||
* Has no expiry, but is cleared by age along with cookies.
|
||||
* This is needed by mediaDevices.enumerateDevices() to produce persistent
|
||||
* deviceIds that wont work cross-origin.
|
||||
*
|
||||
* If aPrivateBrowsing is false, a key for this origin is returned from a
|
||||
* primary pool of temporal in-memory keys and persistent keys read from disk.
|
||||
* If no key exists, a temporal one is created.
|
||||
* If aPersist is true and key is temporal, the key is promoted to persistent.
|
||||
* Once persistent, a key cannot become temporal again.
|
||||
*
|
||||
* If aPrivateBrowsing is true, a different key for this origin is returned
|
||||
* from a secondary pool that is never persisted to disk, and aPersist is
|
||||
* ignored.
|
||||
*/
|
||||
GetOriginKey(uint32_t aRequestId, nsCString aOrigin, bool aPrivateBrowsing);
|
||||
GetOriginKey(uint32_t aRequestId, nsCString aOrigin, bool aPrivateBrowsing,
|
||||
bool aPersist);
|
||||
|
||||
/**
|
||||
* On clear cookies. Fire and forget.
|
||||
|
|
Загрузка…
Ссылка в новой задаче