Bug 780269 - save SourceMap header in worker loader draft
authorTom Tromey <tom@tromey.com>
Tue, 30 May 2017 07:14:17 -0600
changeset 586464 897a481a484ada1773533b154bffc06a047e576d
parent 582676 fa0107fba5371fe1c7cab0ef09d3609eac5cc6a7
child 630993 ee6748132a24ae904db3c714d06849769d4aad30
push id61411
push userbmo:ttromey@mozilla.com
push dateTue, 30 May 2017 13:15:11 +0000
bugs780269
milestone55.0a1
Bug 780269 - save SourceMap header in worker loader MozReview-Commit-ID: 2QHHFlfzg0P
dom/workers/ScriptLoader.cpp
--- a/dom/workers/ScriptLoader.cpp
+++ b/dom/workers/ScriptLoader.cpp
@@ -226,16 +226,17 @@ struct ScriptLoadInfo
 {
   ScriptLoadInfo()
   : mScriptTextBuf(nullptr)
   , mScriptTextLength(0)
   , mLoadResult(NS_ERROR_NOT_INITIALIZED)
   , mLoadingFinished(false)
   , mExecutionScheduled(false)
   , mExecutionResult(false)
+  , mHasSourceMapURL(false)
   , mCacheStatus(Uncached)
   , mLoadFlags(nsIRequest::LOAD_NORMAL)
   { }
 
   ~ScriptLoadInfo()
   {
     if (mScriptTextBuf) {
       js_free(mScriptTextBuf);
@@ -268,16 +269,19 @@ struct ScriptLoadInfo
   char16_t* mScriptTextBuf;
   size_t mScriptTextLength;
 
   nsresult mLoadResult;
   bool mLoadingFinished;
   bool mExecutionScheduled;
   bool mExecutionResult;
 
+  bool mHasSourceMapURL;  // Does the HTTP header have a source map url?
+  nsString mSourceMapURL; // Holds source map url for loaded scripts
+
   enum CacheStatus {
     // By default a normal script is just loaded from the network. But for
     // ServiceWorkers, we have to check if the cache contains the script and
     // load it from the cache.
     Uncached,
 
     WritingToCache,
 
@@ -1084,16 +1088,26 @@ private:
 
       Unused << httpChannel->GetResponseHeader(
         NS_LITERAL_CSTRING("content-security-policy-report-only"),
         tCspROHeaderValue);
 
       Unused << httpChannel->GetResponseHeader(
         NS_LITERAL_CSTRING("referrer-policy"),
         tRPHeaderCValue);
+
+      nsAutoCString sourceMapURL;
+      rv = httpChannel->GetResponseHeader(NS_LITERAL_CSTRING("SourceMap"), sourceMapURL);
+      if (NS_FAILED(rv)) {
+        rv = httpChannel->GetResponseHeader(NS_LITERAL_CSTRING("X-SourceMap"), sourceMapURL);
+      }
+      if (NS_SUCCEEDED(rv)) {
+        aLoadInfo.mHasSourceMapURL = true;
+        aLoadInfo.mSourceMapURL = NS_ConvertUTF8toUTF16(sourceMapURL);
+      }
     }
 
     // May be null.
     nsIDocument* parentDoc = mWorkerPrivate->GetDocument();
 
     // Use the regular ScriptLoader for this grunt work! Should be just fine
     // because we're running on the main thread.
     // Unlike <script> tags, Worker scripts are always decoded as UTF-8,
@@ -1952,16 +1966,20 @@ ScriptExecutorRunnable::WorkerRun(JSCont
 
     if (mScriptLoader.mWorkerScriptType == DebuggerScript) {
       options.setVersion(JSVERSION_LATEST);
     }
 
     MOZ_ASSERT(loadInfo.mMutedErrorFlag.isSome());
     options.setMutedErrors(loadInfo.mMutedErrorFlag.valueOr(true));
 
+    if (loadInfo.mHasSourceMapURL) {
+      options.setSourceMapURL(loadInfo.mSourceMapURL.get());
+    }
+
     JS::SourceBufferHolder srcBuf(loadInfo.mScriptTextBuf,
                                   loadInfo.mScriptTextLength,
                                   JS::SourceBufferHolder::GiveOwnership);
     loadInfo.mScriptTextBuf = nullptr;
     loadInfo.mScriptTextLength = 0;
 
     // Our ErrorResult still shouldn't be a failure.
     MOZ_ASSERT(!mScriptLoader.mRv.Failed(), "Who failed it and why?");