diff -r 885cde564ff3 -r af9f937f9d19 content/base/test/Makefile.in --- a/content/base/test/Makefile.in Thu Feb 21 19:54:25 2013 +0000 +++ b/content/base/test/Makefile.in Tue Mar 05 13:20:13 2013 -0800 @@ -632,6 +632,7 @@ file_bothCSPheaders.html^headers^ \ badMessageEvent2.eventsource \ badMessageEvent2.eventsource^headers^ \ + test_bug704320.html \ $(NULL) # OOP tests don't work on Windows (bug 763081) or native-fennec diff -r 885cde564ff3 -r af9f937f9d19 content/base/test/test_bug704320.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/base/test/test_bug704320.html Tue Mar 05 13:20:13 2013 -0800 @@ -0,0 +1,56 @@ + + + + Test for Bug 704320 - Test referer stripping and add meta referrer. + + + + + + + Mozilla Bug 704320 +

+ +
+    
+  
+ + diff -r 885cde564ff3 -r af9f937f9d19 modules/libpref/src/init/all.js --- a/modules/libpref/src/init/all.js Thu Feb 21 19:54:25 2013 +0000 +++ b/modules/libpref/src/init/all.js Tue Mar 05 13:20:13 2013 -0800 @@ -895,6 +895,14 @@ // By default this is enabled for compatibility (see bug 141641) pref("network.http.sendSecureXSiteReferrer", true); +// Controls whether we send a full or partial referrer value +// By default we send full referrer value. +// 0: full +// 1: {scheme, host, port, path} +// 2: {scheme, host, port} +// 3: host +pref("network.http.referrerPolicy", 0); + // Maximum number of consecutive redirects before aborting. pref("network.http.redirection-limit", 20); diff -r 885cde564ff3 -r af9f937f9d19 netwerk/protocol/http/HttpBaseChannel.cpp --- a/netwerk/protocol/http/HttpBaseChannel.cpp Thu Feb 21 19:54:25 2013 +0000 +++ b/netwerk/protocol/http/HttpBaseChannel.cpp Tue Mar 05 13:20:13 2013 -0800 @@ -964,9 +964,43 @@ rv = clone->SetUserPass(EmptyCString()); if (NS_FAILED(rv)) return rv; + // check how much of the referrer to send + uint32_t referrerPolicy = gHttpHandler->GetReferrerPolicy(); nsAutoCString spec; - rv = clone->GetAsciiSpec(spec); - if (NS_FAILED(rv)) return rv; + + if (referrerPolicy == 0) { + // full referrer value + rv = clone->GetAsciiSpec(spec); + if (NS_FAILED(rv)) return rv; + } + else if (referrerPolicy == 1) { + // scheme, host, port, path + nsAutoCString prepath, path; + + rv = clone->GetPrePath(prepath); + if (NS_FAILED(rv)) return rv; + rv = clone->GetPath(path); + if (NS_FAILED(rv)) return rv; + + int32_t queryStart = path.FindChar('?'); + + if (queryStart != -1) { + int32_t queryLen = path.Length() - queryStart; + path.Cut(queryStart, queryLen); + } + + spec = prepath + path; + } + else if (referrerPolicy == 2) { + // scheme, host, port + rv = clone->GetPrePath(spec); + if (NS_FAILED(rv)) return rv; + } + else if (referrerPolicy == 3) { + // host + rv = clone->GetHost(spec); + if (NS_FAILED(rv)) return rv; + } // finally, remember the referrer URI and set the Referer header. mReferrer = clone; diff -r 885cde564ff3 -r af9f937f9d19 netwerk/protocol/http/nsHttpHandler.cpp --- a/netwerk/protocol/http/nsHttpHandler.cpp Thu Feb 21 19:54:25 2013 +0000 +++ b/netwerk/protocol/http/nsHttpHandler.cpp Tue Mar 05 13:20:13 2013 -0800 @@ -168,6 +168,7 @@ , mUseCache(true) , mPromptTempRedirect(true) , mSendSecureXSiteReferrer(true) + , mReferrerPolicy(0) , mEnablePersistentHttpsCaching(false) , mDoNotTrackEnabled(false) , mDoNotTrackValue(1) @@ -996,6 +997,12 @@ mSendSecureXSiteReferrer = cVar; } + if (PREF_CHANGED(HTTP_PREF("referrerPolicy"))) { + rv = prefs->GetIntPref(HTTP_PREF("referrerPolicy"), &val); + if (NS_SUCCEEDED(rv)) + mReferrerPolicy = val; + } + if (PREF_CHANGED(HTTP_PREF("accept.default"))) { nsXPIDLCString accept; rv = prefs->GetCharPref(HTTP_PREF("accept.default"), diff -r 885cde564ff3 -r af9f937f9d19 netwerk/protocol/http/nsHttpHandler.h --- a/netwerk/protocol/http/nsHttpHandler.h Thu Feb 21 19:54:25 2013 +0000 +++ b/netwerk/protocol/http/nsHttpHandler.h Tue Mar 05 13:20:13 2013 -0800 @@ -68,6 +68,7 @@ nsHttpVersion ProxyHttpVersion() { return mProxyHttpVersion; } uint8_t ReferrerLevel() { return mReferrerLevel; } bool SendSecureXSiteReferrer() { return mSendSecureXSiteReferrer; } + uint32_t GetReferrerPolicy() { return mReferrerPolicy; } uint8_t RedirectionLimit() { return mRedirectionLimit; } PRIntervalTime IdleTimeout() { return mIdleTimeout; } PRIntervalTime SpdyTimeout() { return mSpdyTimeout; } @@ -371,6 +372,10 @@ // if true allow referrer headers between secure non-matching hosts bool mSendSecureXSiteReferrer; + // mReferrerPolicy: default is 0, + // if 0, send full referrer value. + uint32_t mReferrerPolicy; + // Persistent HTTPS caching flag bool mEnablePersistentHttpsCaching;