author | Nikhil Marathe <nsm.nikhil@gmail.com> |
Thu, 04 Jun 2015 15:50:03 -0700 | |
changeset 250203 | 7000726b44f88af4e75357079d849df0f98efd95 |
parent 250202 | 66ea7374c23d9e22d4eb9cc11f9631530f485d59 |
child 250204 | 08fe55879ba7494dc1a44784f7f3cad688f815ef |
push id | 61475 |
push user | nsm.nikhil@gmail.com |
push date | Thu, 25 Jun 2015 16:52:58 +0000 |
treeherder | mozilla-inbound@d44bc296a927 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jdm |
bugs | 1169044 |
milestone | 41.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
dom/tests/mochitest/fetch/reroute.js | file | annotate | diff | comparison | revisions | |
dom/workers/ServiceWorkerManager.cpp | file | annotate | diff | comparison | revisions |
--- a/dom/tests/mochitest/fetch/reroute.js +++ b/dom/tests/mochitest/fetch/reroute.js @@ -1,3 +1,19 @@ onfetch = function(e) { + if (e.request.url.indexOf("Referer") >= 0) { + // Silently rewrite the referrer so the referrer test passes since the + // document/worker isn't aware of this service worker. + var url = e.request.url.substring(0, e.request.url.indexOf('?')); + url += '?headers=' + ({ 'Referer': self.location.href }).toSource(); + + e.respondWith(fetch(url, { + method: e.request.method, + headers: e.request.headers, + body: e.request.body, + mode: e.request.mode, + credentials: e.request.credentials, + cache: e.request.cache, + })); + return; + } e.respondWith(fetch(e.request)); };
--- a/dom/workers/ServiceWorkerManager.cpp +++ b/dom/workers/ServiceWorkerManager.cpp @@ -3298,32 +3298,34 @@ class FetchEventRunnable : public Worker nsAutoPtr<ServiceWorkerClientInfo> mClientInfo; nsCString mSpec; nsCString mMethod; bool mIsReload; RequestMode mRequestMode; RequestCredentials mRequestCredentials; nsContentPolicyType mContentPolicyType; nsCOMPtr<nsIInputStream> mUploadStream; + nsCString mReferrer; public: FetchEventRunnable(WorkerPrivate* aWorkerPrivate, nsMainThreadPtrHandle<nsIInterceptedChannel>& aChannel, nsMainThreadPtrHandle<ServiceWorker>& aServiceWorker, nsAutoPtr<ServiceWorkerClientInfo>& aClientInfo, bool aIsReload) : WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount) , mInterceptedChannel(aChannel) , mServiceWorker(aServiceWorker) , mClientInfo(aClientInfo) , mIsReload(aIsReload) , mRequestMode(RequestMode::No_cors) // By default we set it to same-origin since normal HTTP fetches always // send credentials to same-origin websites unless explicitly forbidden. , mRequestCredentials(RequestCredentials::Same_origin) , mContentPolicyType(nsIContentPolicy::TYPE_INVALID) + , mReferrer(kFETCH_CLIENT_REFERRER_STR) { MOZ_ASSERT(aWorkerPrivate); } NS_DECL_ISUPPORTS_INHERITED NS_IMETHOD VisitHeader(const nsACString& aHeader, const nsACString& aValue) override @@ -3353,16 +3355,25 @@ public: NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsILoadInfo> loadInfo; rv = channel->GetLoadInfo(getter_AddRefs(loadInfo)); NS_ENSURE_SUCCESS(rv, rv); mContentPolicyType = loadInfo->InternalContentPolicyType(); + nsCOMPtr<nsIURI> referrerURI; + rv = NS_GetReferrerFromChannel(channel, getter_AddRefs(referrerURI)); + // We can't bail on failure since certain non-http channels like JAR + // channels are intercepted but don't have referrers. + if (NS_SUCCEEDED(rv) && referrerURI) { + rv = referrerURI->GetSpec(mReferrer); + NS_ENSURE_SUCCESS(rv, rv); + } + nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel); if (httpChannel) { rv = httpChannel->GetRequestMethod(mMethod); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIHttpChannelInternal> internalChannel = do_QueryInterface(httpChannel); NS_ENSURE_TRUE(internalChannel, NS_ERROR_NOT_AVAILABLE); @@ -3482,16 +3493,17 @@ private: return false; } // For Telemetry, note that this Request object was created by a Fetch event. nsRefPtr<InternalRequest> internalReq = request->GetInternalRequest(); MOZ_ASSERT(internalReq); internalReq->SetCreatedByFetchEvent(); internalReq->SetBody(mUploadStream); + internalReq->SetReferrer(NS_ConvertUTF8toUTF16(mReferrer)); request->SetContentPolicyType(mContentPolicyType); RootedDictionary<FetchEventInit> init(aCx); init.mRequest.Construct(); init.mRequest.Value() = request; init.mBubbles = false; init.mCancelable = true;