Bug 1249351 part 1. When doing importScripts of multiple scripts in a service worker, make sure to track the cache streams per-loadinfo, instead of trying to make them all wait on the same stream. r=bkelly

This commit is contained in:
Boris Zbarsky
2016-02-22 17:13:38 -05:00
parent 81d94a46f5
commit c30f05e5b5

View File

@@ -240,6 +240,10 @@ struct ScriptLoadInfo
// resolution.
RefPtr<Promise> mCachePromise;
// The reader stream the cache entry should be filled from, for those cases
// when we're going to have an mCachePromise.
nsCOMPtr<nsIInputStream> mCacheReadStream;
nsCOMPtr<nsIChannel> mChannel;
char16_t* mScriptTextBuf;
size_t mScriptTextLength;
@@ -534,7 +538,6 @@ class ScriptLoaderRunnable final : public WorkerFeature
nsCOMPtr<nsIEventTarget> mSyncLoopTarget;
nsTArray<ScriptLoadInfo> mLoadInfos;
RefPtr<CacheCreator> mCacheCreator;
nsCOMPtr<nsIInputStream> mReader;
bool mIsMainScript;
WorkerScriptType mWorkerScriptType;
bool mCanceled;
@@ -641,7 +644,10 @@ private:
// We synthesize the result code, but its never exposed to content.
RefPtr<mozilla::dom::InternalResponse> ir =
new mozilla::dom::InternalResponse(200, NS_LITERAL_CSTRING("OK"));
ir->SetBody(mReader);
ir->SetBody(loadInfo.mCacheReadStream);
// Drop our reference to the stream now that we've passed it along, so it
// doesn't hang around once the cache is done with it and keep data alive.
loadInfo.mCacheReadStream = nullptr;
// Set the channel info of the channel on the response so that it's
// saved in the cache.
@@ -917,7 +923,8 @@ private:
// In case we return early.
loadInfo.mCacheStatus = ScriptLoadInfo::Cancel;
rv = NS_NewPipe(getter_AddRefs(mReader), getter_AddRefs(writer), 0,
rv = NS_NewPipe(getter_AddRefs(loadInfo.mCacheReadStream),
getter_AddRefs(writer), 0,
UINT32_MAX, // unlimited size to avoid writer WOULD_BLOCK case
true, false); // non-blocking reader, blocking writer
if (NS_WARN_IF(NS_FAILED(rv))) {