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:
Jan-Ivar Bruaroey 2015-07-13 00:09:02 -04:00
Родитель 88f4606bfa
Коммит 5e4109ceda
6 изменённых файлов: 51 добавлений и 23 удалений

Просмотреть файл

@ -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.