Bug 1294336 - Segregating shared workers by the originAttributes. r?baku
--- a/dom/workers/RuntimeService.cpp
+++ b/dom/workers/RuntimeService.cpp
@@ -226,39 +226,54 @@ GetWorkerPref(const nsACString& aPref,
else {
result = aDefault;
}
}
return result;
}
-// This function creates a key for a SharedWorker composed by "name|scriptSpec".
-// If the name contains a '|', this will be replaced by '||'.
+// This function creates a key for a SharedWorker composed by
+// "name|scriptSpec|originAttributes". If the name contains a '|',
+// this will be replaced by '||'.
void
GenerateSharedWorkerKey(const nsACString& aScriptSpec, const nsACString& aName,
- bool aPrivateBrowsing, nsCString& aKey)
+ bool aPrivateBrowsing, nsIPrincipal* aPrincipal,
+ nsCString& aKey)
{
+ MOZ_ASSERT(aPrincipal);
+
+ nsCString originSuffix;
+ nsresult rv;
+ rv = aPrincipal->GetOriginSuffix(originSuffix);
+
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Failed to get the origin suffix.");
+ }
+
aKey.Truncate();
- aKey.SetCapacity(aScriptSpec.Length() + aName.Length() + 3);
+ aKey.SetCapacity(aScriptSpec.Length() + aName.Length() + originSuffix.Length() + 4);
aKey.Append(aPrivateBrowsing ? "1|" : "0|");
nsACString::const_iterator start, end;
aName.BeginReading(start);
aName.EndReading(end);
for (; start != end; ++start) {
if (*start == '|') {
aKey.AppendASCII("||");
} else {
aKey.Append(*start);
}
}
aKey.Append('|');
aKey.Append(aScriptSpec);
+
+ aKey.Append('|');
+ aKey.Append(originSuffix);
}
void
LoadContextOptions(const char* aPrefName, void* /* aClosure */)
{
AssertIsOnMainThread();
RuntimeService* rts = RuntimeService::GetService();
@@ -1390,17 +1405,18 @@ RuntimeService::RegisterWorker(WorkerPri
else {
domainInfo->mWorkers.AppendElement(aWorkerPrivate);
}
if (isSharedWorker) {
const nsCString& sharedWorkerName = aWorkerPrivate->WorkerName();
nsAutoCString key;
GenerateSharedWorkerKey(sharedWorkerScriptSpec, sharedWorkerName,
- aWorkerPrivate->IsInPrivateBrowsing(), key);
+ aWorkerPrivate->IsInPrivateBrowsing(),
+ aWorkerPrivate->GetPrincipal(), key);
MOZ_ASSERT(!domainInfo->mSharedWorkerInfos.Get(key));
SharedWorkerInfo* sharedWorkerInfo =
new SharedWorkerInfo(aWorkerPrivate, sharedWorkerScriptSpec,
sharedWorkerName);
domainInfo->mSharedWorkerInfos.Put(key, sharedWorkerInfo);
}
}
@@ -1467,17 +1483,18 @@ RuntimeService::RemoveSharedWorker(Worke
for (auto iter = aDomainInfo->mSharedWorkerInfos.Iter();
!iter.Done();
iter.Next()) {
SharedWorkerInfo* data = iter.UserData();
if (data->mWorkerPrivate == aWorkerPrivate) {
#ifdef DEBUG
nsAutoCString key;
GenerateSharedWorkerKey(data->mScriptSpec, data->mName,
- aWorkerPrivate->IsInPrivateBrowsing(), key);
+ aWorkerPrivate->IsInPrivateBrowsing(),
+ aWorkerPrivate->GetPrincipal(), key);
MOZ_ASSERT(iter.Key() == key);
#endif
iter.Remove();
break;
}
}
}
@@ -2144,17 +2161,18 @@ RuntimeService::CreateSharedWorkerFromLo
SharedWorkerInfo* sharedWorkerInfo;
nsCString scriptSpec;
nsresult rv = aLoadInfo->mResolvedScriptURI->GetSpec(scriptSpec);
NS_ENSURE_SUCCESS(rv, rv);
nsAutoCString key;
GenerateSharedWorkerKey(scriptSpec, aName,
- aLoadInfo->mPrivateBrowsing, key);
+ aLoadInfo->mPrivateBrowsing,
+ aLoadInfo->mPrincipal,key);
if (mDomainMap.Get(aLoadInfo->mDomain, &domainInfo) &&
domainInfo->mSharedWorkerInfos.Get(key, &sharedWorkerInfo)) {
workerPrivate = sharedWorkerInfo->mWorkerPrivate;
}
}
// Keep a reference to the window before spawning the worker. If the worker is