Bug 1294336 - Segregating shared workers by the originAttributes. r?baku draft
authorTim Huang <tihuang@mozilla.com>
Mon, 15 Aug 2016 10:35:33 +0800
changeset 400632 0b60e64ce0622e4fcf3287d51f4cb09a09760db5
parent 400444 6e191a55c3d23e83e6a2e72e4e80c1dc21516493
child 528270 098ffcd5baef210eca1c8325fa93c3a0fc5f5bb7
push id26219
push userbmo:tihuang@mozilla.com
push dateMon, 15 Aug 2016 08:45:44 +0000
reviewersbaku
bugs1294336
milestone51.0a1
Bug 1294336 - Segregating shared workers by the originAttributes. r?baku
dom/workers/RuntimeService.cpp
--- 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