Bug 555514 - e10s HTTP: propagate SetReferrer to chrome process. a=jae-seong lee, r=jduell

This commit is contained in:
Jason Duell 2010-04-07 01:43:44 -07:00
parent 70617ee7a8
commit 16cf1c132a
6 changed files with 56 additions and 15 deletions

View File

@ -263,9 +263,17 @@ HttpChannelChild::AsyncOpen(nsIStreamListener *listener, nsISupports *aContext)
mDocumentURI->GetOriginCharset(docCharset); mDocumentURI->GetOriginCharset(docCharset);
} }
nsCAutoString referrerSpec;
nsCAutoString referrerCharset;
if (mReferrer) {
mReferrer->GetSpec(referrerSpec);
mReferrer->GetOriginCharset(referrerCharset);
}
if (!SendAsyncOpen(mSpec, charset, originalSpec, originalCharset, if (!SendAsyncOpen(mSpec, charset, originalSpec, originalCharset,
docSpec, docCharset, mLoadFlags, mRequestHeaders, docSpec, docCharset, referrerSpec, referrerCharset,
mRequestHead.Method(), mRedirectionLimit, mAllowPipelining, mLoadFlags, mRequestHeaders, mRequestHead.Method(),
mRedirectionLimit, mAllowPipelining,
mForceAllowThirdPartyCookie)) { mForceAllowThirdPartyCookie)) {
// IPDL error: our destructor will be called automatically // IPDL error: our destructor will be called automatically
// -- TODO: verify that that's the case :) // -- TODO: verify that that's the case :)

View File

@ -80,6 +80,8 @@ HttpChannelParent::RecvAsyncOpen(const nsCString& uriSpec,
const nsCString& originalCharset, const nsCString& originalCharset,
const nsCString& docUriSpec, const nsCString& docUriSpec,
const nsCString& docCharset, const nsCString& docCharset,
const nsCString& referrerSpec,
const nsCString& referrerCharset,
const PRUint32& loadFlags, const PRUint32& loadFlags,
const RequestHeaderTuples& requestHeaders, const RequestHeaderTuples& requestHeaders,
const nsHttpAtom& requestMethod, const nsHttpAtom& requestMethod,
@ -106,26 +108,33 @@ HttpChannelParent::RecvAsyncOpen(const nsCString& uriSpec,
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return false; // TODO: send fail msg to child, return true return false; // TODO: send fail msg to child, return true
nsCOMPtr<nsIHttpChannel> httpChan(do_QueryInterface(chan)); nsHttpChannel *httpChan = static_cast<nsHttpChannel *>(chan.get());
nsCOMPtr<nsIHttpChannelInternal> httpChanInt(do_QueryInterface(chan));
if (!originalUriSpec.IsEmpty()) { if (!originalUriSpec.IsEmpty()) {
nsCOMPtr<nsIURI> originalUri; nsCOMPtr<nsIURI> originalUri;
rv = NS_NewURI(getter_AddRefs(originalUri), originalUriSpec, rv = NS_NewURI(getter_AddRefs(originalUri), originalUriSpec,
originalCharset.get(), nsnull, ios); originalCharset.get(), nsnull, ios);
if (!NS_FAILED(rv)) if (!NS_FAILED(rv))
chan->SetOriginalURI(originalUri); httpChan->SetOriginalURI(originalUri);
} }
if (!docUriSpec.IsEmpty()) { if (!docUriSpec.IsEmpty()) {
nsCOMPtr<nsIURI> docUri; nsCOMPtr<nsIURI> docUri;
rv = NS_NewURI(getter_AddRefs(docUri), docUriSpec, rv = NS_NewURI(getter_AddRefs(docUri), docUriSpec,
docCharset.get(), nsnull, ios); docCharset.get(), nsnull, ios);
if (!NS_FAILED(rv)) { if (!NS_FAILED(rv)) {
httpChanInt->SetDocumentURI(docUri); httpChan->SetDocumentURI(docUri);
}
}
if (!referrerSpec.IsEmpty()) {
nsCOMPtr<nsIURI> referrerUri;
rv = NS_NewURI(getter_AddRefs(referrerUri), referrerSpec,
referrerCharset.get(), nsnull, ios);
if (!NS_FAILED(rv)) {
httpChan->SetReferrerInternal(referrerUri);
} }
} }
if (loadFlags != nsIRequest::LOAD_NORMAL) if (loadFlags != nsIRequest::LOAD_NORMAL)
chan->SetLoadFlags(loadFlags); httpChan->SetLoadFlags(loadFlags);
for (PRUint32 i = 0; i < requestHeaders.Length(); i++) for (PRUint32 i = 0; i < requestHeaders.Length(); i++)
httpChan->SetRequestHeader(requestHeaders[i].mHeader, httpChan->SetRequestHeader(requestHeaders[i].mHeader,
@ -134,14 +143,14 @@ HttpChannelParent::RecvAsyncOpen(const nsCString& uriSpec,
// TODO: implement needed interfaces, and either proxy calls back to child // TODO: implement needed interfaces, and either proxy calls back to child
// process, or rig up appropriate hacks. // process, or rig up appropriate hacks.
// chan->SetNotificationCallbacks(this); // httpChan->SetNotificationCallbacks(this);
httpChan->SetRequestMethod(nsDependentCString(requestMethod.get())); httpChan->SetRequestMethod(nsDependentCString(requestMethod.get()));
httpChan->SetRedirectionLimit(redirectionLimit); httpChan->SetRedirectionLimit(redirectionLimit);
httpChan->SetAllowPipelining(allowPipelining); httpChan->SetAllowPipelining(allowPipelining);
httpChanInt->SetForceAllowThirdPartyCookie(forceAllowThirdPartyCookie); httpChan->SetForceAllowThirdPartyCookie(forceAllowThirdPartyCookie);
rv = chan->AsyncOpen(this, nsnull); rv = httpChan->AsyncOpen(this, nsnull);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return false; // TODO: send fail msg to child, return true return false; // TODO: send fail msg to child, return true

View File

@ -71,6 +71,8 @@ protected:
const nsCString& originalCharset, const nsCString& originalCharset,
const nsCString& docUriSpec, const nsCString& docUriSpec,
const nsCString& docCharset, const nsCString& docCharset,
const nsCString& referrerSpec,
const nsCString& referrerCharset,
const PRUint32& loadFlags, const PRUint32& loadFlags,
const RequestHeaderTuples& requestHeaders, const RequestHeaderTuples& requestHeaders,
const nsHttpAtom& requestMethod, const nsHttpAtom& requestMethod,

View File

@ -67,6 +67,8 @@ parent:
nsCString originalCharset, nsCString originalCharset,
nsCString docUriSpec, nsCString docUriSpec,
nsCString docCharset, nsCString docCharset,
nsCString referrerSpec,
nsCString referrerCharset,
PRUint32 loadFlags, PRUint32 loadFlags,
RequestHeaderTuples requestHeaders, RequestHeaderTuples requestHeaders,
nsHttpAtom requestMethod, nsHttpAtom requestMethod,

View File

@ -129,13 +129,20 @@ public:
// nsIHttpChannelInternal // nsIHttpChannelInternal
NS_IMETHOD SetupFallbackChannel(const char *aFallbackKey); NS_IMETHOD SetupFallbackChannel(const char *aFallbackKey);
public: /* internal necko use only */ public: /* internal necko use only */
typedef void (nsHttpChannel:: *nsAsyncCallback)(void); typedef void (nsHttpChannel:: *nsAsyncCallback)(void);
nsHttpResponseHead * GetResponseHead() const { return mResponseHead; } nsHttpResponseHead * GetResponseHead() const { return mResponseHead; }
private:
nsresult SetReferrerInternal(nsIURI *referrer) {
nsCAutoString spec;
nsresult rv = referrer->GetAsciiSpec(spec);
if (NS_FAILED(rv)) return rv;
mReferrer = referrer;
mRequestHead.SetHeader(nsHttp::Referer, spec);
return NS_OK;
}
private:
// Helper function to simplify getting notification callbacks. // Helper function to simplify getting notification callbacks.
template <class T> template <class T>
void GetCallback(nsCOMPtr<T> &aResult) void GetCallback(nsCOMPtr<T> &aResult)

View File

@ -9,6 +9,7 @@ var httpserver = new nsHttpServer();
var testpath = "/simple"; var testpath = "/simple";
var httpbody = "0123456789"; var httpbody = "0123456789";
var channel; var channel;
var ios;
var dbg=0 var dbg=0
if (dbg) { print("============== START =========="); } if (dbg) { print("============== START =========="); }
@ -39,6 +40,17 @@ function setup_test() {
setOK = channel.getRequestHeader("MergeMe"); setOK = channel.getRequestHeader("MergeMe");
do_check_eq(setOK, "foo1, foo2, foo3"); do_check_eq(setOK, "foo1, foo2, foo3");
var uri = ios.newURI("http://foo1.invalid:80", null, null);
channel.referrer = uri;
do_check_true(channel.referrer.equals(uri));
setOK = channel.getRequestHeader("Referer");
do_check_eq(setOK, "http://foo1.invalid/");
uri = ios.newURI("http://foo2.invalid:90/bar", null, null);
channel.referrer = uri;
setOK = channel.getRequestHeader("Referer");
do_check_eq(setOK, "http://foo2.invalid:90/bar");
// ChannelListener defined in head_channels.js // ChannelListener defined in head_channels.js
channel.asyncOpen(new ChannelListener(checkRequestResponse, channel), null); channel.asyncOpen(new ChannelListener(checkRequestResponse, channel), null);
@ -46,8 +58,7 @@ function setup_test() {
} }
function setupChannel(path) { function setupChannel(path) {
var ios = Cc["@mozilla.org/network/io-service;1"]. ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
getService(Ci.nsIIOService);
var chan = ios.newChannel("http://localhost:4444" + path, "", null); var chan = ios.newChannel("http://localhost:4444" + path, "", null);
chan.QueryInterface(Ci.nsIHttpChannel); chan.QueryInterface(Ci.nsIHttpChannel);
chan.requestMethod = "GET"; chan.requestMethod = "GET";
@ -61,6 +72,8 @@ function serverHandler(metadata, response) {
do_check_eq(setOK, "replaced"); do_check_eq(setOK, "replaced");
setOK = metadata.getHeader("MergeMe"); setOK = metadata.getHeader("MergeMe");
do_check_eq(setOK, "foo1, foo2, foo3"); do_check_eq(setOK, "foo1, foo2, foo3");
setOK = metadata.getHeader("Referer");
do_check_eq(setOK, "http://foo2.invalid:90/bar");
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
response.setStatusLine("1.1", 200, "OK"); response.setStatusLine("1.1", 200, "OK");