summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-06 00:17:51 +0000
committerjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-06 00:17:51 +0000
commit5ffbf69700a16a7a1c2086cb931589975b370e76 (patch)
tree52e59fbaccec3e046786c84db0a0b7b94b6fdced
parent55afeb52c9b10f58d9b0e5466ad0763aa59234f7 (diff)
downloadchromium_src-5ffbf69700a16a7a1c2086cb931589975b370e76.zip
chromium_src-5ffbf69700a16a7a1c2086cb931589975b370e76.tar.gz
chromium_src-5ffbf69700a16a7a1c2086cb931589975b370e76.tar.bz2
Add support for content::Referrer to prerender
BUG=105028 TEST=none Review URL: http://codereview.chromium.org/8801012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113070 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc6
-rw-r--r--chrome/browser/prerender/prerender_contents.cc10
-rw-r--r--chrome/browser/prerender/prerender_contents.h17
-rw-r--r--chrome/browser/prerender/prerender_manager.cc19
-rw-r--r--chrome/browser/prerender/prerender_manager.h9
-rw-r--r--chrome/browser/prerender/prerender_manager_unittest.cc11
-rw-r--r--chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc4
-rw-r--r--chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h2
-rw-r--r--content/browser/renderer_host/resource_dispatcher_host.cc5
-rw-r--r--content/public/browser/resource_dispatcher_host_delegate.h3
10 files changed, 48 insertions, 38 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 23c3541..b5990bb 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -117,7 +117,7 @@ class TestPrerenderContents : public PrerenderContents {
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
int expected_number_of_loads,
FinalStatus expected_final_status)
: PrerenderContents(prerender_manager, prerender_tracker,
@@ -202,7 +202,7 @@ class TestPrerenderContents : public PrerenderContents {
virtual void AddPendingPrerender(Origin origin,
const GURL& url,
- const GURL& referrer) {
+ const content::Referrer& referrer) OVERRIDE {
PrerenderContents::AddPendingPrerender(origin, url, referrer);
if (expected_pending_prerenders_ > 0 &&
pending_prerender_list()->size() == expected_pending_prerenders_) {
@@ -306,7 +306,7 @@ class WaitForLoadPrerenderContentsFactory : public PrerenderContents::Factory {
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
Origin origin,
uint8 experiment_id) OVERRIDE {
FinalStatus expected_final_status = FINAL_STATUS_MATCH_COMPLETE_DUMMY;
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index baba5b0..4cce935 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -63,7 +63,7 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
public:
virtual PrerenderContents* CreatePrerenderContents(
PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker,
- Profile* profile, const GURL& url, const GURL& referrer,
+ Profile* profile, const GURL& url, const content::Referrer& referrer,
Origin origin, uint8 experiment_id) OVERRIDE {
return new PrerenderContents(prerender_manager, prerender_tracker, profile,
url, referrer, origin, experiment_id);
@@ -73,7 +73,7 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
PrerenderContents::PendingPrerenderData::PendingPrerenderData(
Origin origin,
const GURL& url,
- const GURL& referrer)
+ const content::Referrer& referrer)
: origin(origin),
url(url),
referrer(referrer) {
@@ -158,7 +158,7 @@ class PrerenderContents::TabContentsDelegateImpl
void PrerenderContents::AddPendingPrerender(Origin origin,
const GURL& url,
- const GURL& referrer) {
+ const content::Referrer& referrer) {
pending_prerender_list_.push_back(
PendingPrerenderData(origin, url, referrer));
}
@@ -193,7 +193,7 @@ PrerenderContents::PrerenderContents(
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
Origin origin,
uint8 experiment_id)
: prerender_manager_(prerender_manager),
@@ -340,7 +340,7 @@ void PrerenderContents::StartPrerendering(
transition = content::PAGE_TRANSITION_TYPED;
new_contents->controller().LoadURL(
prerender_url_,
- content::Referrer(referrer_, WebKit::WebReferrerPolicyDefault),
+ referrer_,
transition, std::string());
}
diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
index e6b7c39..e22a154 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/chrome/browser/prerender/prerender_contents.h
@@ -16,6 +16,7 @@
#include "chrome/browser/prerender/prerender_final_status.h"
#include "content/browser/tab_contents/tab_contents_observer.h"
#include "content/public/browser/notification_registrar.h"
+#include "content/public/common/referrer.h"
class Profile;
class RenderViewHost;
@@ -57,7 +58,7 @@ class PrerenderContents : public content::NotificationObserver,
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
Origin origin,
uint8 experiment_id) = 0;
@@ -67,11 +68,13 @@ class PrerenderContents : public content::NotificationObserver,
// Information on pages that the prerendered page has tried to prerender.
struct PendingPrerenderData {
- PendingPrerenderData(Origin origin, const GURL& url, const GURL& referrer);
+ PendingPrerenderData(Origin origin,
+ const GURL& url,
+ const content::Referrer& referrer);
Origin origin;
GURL url;
- GURL referrer;
+ content::Referrer referrer;
};
typedef std::list<PendingPrerenderData> PendingPrerenderList;
@@ -97,7 +100,7 @@ class PrerenderContents : public content::NotificationObserver,
int32 page_id() const { return page_id_; }
GURL icon_url() const { return icon_url_; }
const GURL& prerender_url() const { return prerender_url_; }
- const GURL& referrer() const { return referrer_; }
+ const content::Referrer& referrer() const { return referrer_; }
bool has_stopped_loading() const { return has_stopped_loading_; }
bool prerendering_has_started() const { return prerendering_has_started_; }
@@ -179,7 +182,7 @@ class PrerenderContents : public content::NotificationObserver,
// Adds a pending prerender to the list.
virtual void AddPendingPrerender(Origin origin,
const GURL& url,
- const GURL& referrer);
+ const content::Referrer& referrer);
// Returns true if |url| corresponds to a pending prerender.
bool IsPendingEntry(const GURL& url) const;
@@ -193,7 +196,7 @@ class PrerenderContents : public content::NotificationObserver,
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
Origin origin,
uint8 experiment_id);
@@ -236,7 +239,7 @@ class PrerenderContents : public content::NotificationObserver,
GURL prerender_url_;
// The referrer.
- GURL referrer_;
+ content::Referrer referrer_;
// The profile being used
Profile* profile_;
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index a754e20..0e44e5c 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -317,10 +317,11 @@ void PrerenderManager::SetPrerenderContentsFactory(
prerender_contents_factory_.reset(prerender_contents_factory);
}
-bool PrerenderManager::AddPrerenderFromLinkRelPrerender(int process_id,
- int route_id,
- const GURL& url,
- const GURL& referrer) {
+bool PrerenderManager::AddPrerenderFromLinkRelPrerender(
+ int process_id,
+ int route_id,
+ const GURL& url,
+ const content::Referrer& referrer) {
std::pair<int, int> child_route_id_pair = std::make_pair(process_id,
route_id);
@@ -349,7 +350,7 @@ bool PrerenderManager::AddPrerenderFromOmnibox(
NOTREACHED();
break;
};
- return AddPrerender(origin, std::make_pair(-1, -1), url, GURL(),
+ return AddPrerender(origin, std::make_pair(-1, -1), url, content::Referrer(),
session_storage_namespace);
}
@@ -357,12 +358,14 @@ bool PrerenderManager::AddPrerender(
Origin origin,
const std::pair<int, int>& child_route_id_pair,
const GURL& url_arg,
- const GURL& referrer,
+ const content::Referrer& referrer,
SessionStorageNamespace* session_storage_namespace) {
DCHECK(CalledOnValidThread());
- if (origin == ORIGIN_LINK_REL_PRERENDER && IsGoogleSearchResultURL(referrer))
+ if (origin == ORIGIN_LINK_REL_PRERENDER &&
+ IsGoogleSearchResultURL(referrer.url)) {
origin = ORIGIN_GWS_PRERENDER;
+ }
// If the referring page is prerendering, defer the prerender.
std::list<PrerenderContentsData>::iterator source_prerender =
@@ -770,7 +773,7 @@ bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const {
PrerenderContents* PrerenderManager::CreatePrerenderContents(
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
Origin origin,
uint8 experiment_id) {
DCHECK(CalledOnValidThread());
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index 55e550c..c1a0904 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -98,7 +98,8 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// If the RenderViewHost source is itself prerendering, the prerender is added
// as a pending prerender.
bool AddPrerenderFromLinkRelPrerender(int process_id, int route_id,
- const GURL& url, const GURL& referrer);
+ const GURL& url,
+ const content::Referrer& referrer);
// Adds a prerender for |url| if valid. As the prerender request is coming
// from a source without a RenderViewHost (i.e., the omnibox) we don't have a
@@ -260,7 +261,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
Origin origin,
const std::pair<int, int>& child_route_id_pair,
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
SessionStorageNamespace* session_storage_namespace);
// Adds a pending preload issued by the prerendering RenderView identified by
@@ -269,7 +270,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
void AddPendingPrerender(Origin origin,
const std::pair<int, int>& child_route_id_pair,
const GURL& url,
- const GURL& referrer);
+ const content::Referrer& referrer);
// Retrieves the PrerenderContents object for the specified URL, if it
// has been prerendered. The caller will then have ownership of the
@@ -306,7 +307,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
virtual base::TimeTicks GetCurrentTimeTicks() const;
virtual PrerenderContents* CreatePrerenderContents(
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
Origin origin,
uint8 experiment_id);
diff --git a/chrome/browser/prerender/prerender_manager_unittest.cc b/chrome/browser/prerender/prerender_manager_unittest.cc
index d835e02..9a9b6be 100644
--- a/chrome/browser/prerender/prerender_manager_unittest.cc
+++ b/chrome/browser/prerender/prerender_manager_unittest.cc
@@ -27,7 +27,8 @@ class DummyPrerenderContents : public PrerenderContents {
const GURL& url,
FinalStatus expected_final_status)
: PrerenderContents(prerender_manager, prerender_tracker,
- NULL, url, GURL(), ORIGIN_LINK_REL_PRERENDER,
+ NULL, url, content::Referrer(),
+ ORIGIN_LINK_REL_PRERENDER,
PrerenderManager::kNoExperiment),
has_started_(false),
expected_final_status_(expected_final_status) {
@@ -128,7 +129,7 @@ class TestPrerenderManager : public PrerenderManager {
bool AddSimplePrerender(const GURL& url) {
return AddPrerenderFromLinkRelPrerender(-1, -1,
url,
- GURL());
+ content::Referrer());
}
void set_rate_limit_enabled(bool enabled) {
@@ -157,7 +158,7 @@ class TestPrerenderManager : public PrerenderManager {
virtual PrerenderContents* CreatePrerenderContents(
const GURL& url,
- const GURL& referrer,
+ const content::Referrer& referrer,
Origin origin,
uint8 experiment_id) OVERRIDE {
DCHECK(next_prerender_contents_.get());
@@ -437,7 +438,7 @@ TEST_F(PrerenderManagerTest, PendingPrerenderTest) {
EXPECT_TRUE(prerender_manager()->AddPrerenderFromLinkRelPrerender(
child_id, route_id,
- pending_url, url));
+ pending_url, content::Referrer(url, WebKit::WebReferrerPolicyDefault)));
EXPECT_TRUE(prerender_manager()->IsPendingEntry(pending_url));
EXPECT_TRUE(prerender_contents->has_started());
@@ -468,7 +469,7 @@ TEST_F(PrerenderManagerTest, SourceRenderViewClosed) {
url,
FINAL_STATUS_MANAGER_SHUTDOWN);
EXPECT_FALSE(prerender_manager()->AddPrerenderFromLinkRelPrerender(
- 100, 100, url, GURL()));
+ 100, 100, url, content::Referrer()));
}
// Tests that the prerender manager ignores fragment references when matching
diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
index b2f096e..58f8e1a 100644
--- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
+++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
@@ -63,7 +63,7 @@ class InstantResourceDispatcherHostLoginDelegate
void AddPrerenderOnUI(
int render_process_id, int render_view_id,
- const GURL& url, const GURL& referrer) {
+ const GURL& url, const content::Referrer& referrer) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
prerender::PrerenderManager* prerender_manager =
prerender::FindPrerenderManagerUsingRenderProcessId(render_process_id);
@@ -109,7 +109,7 @@ bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest(
const GURL& url,
ResourceType::Type resource_type,
const content::ResourceContext& resource_context,
- const GURL& referrer) {
+ const content::Referrer& referrer) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
// Handle a PREFETCH resource type. If prefetch is disabled, squelch the
diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h
index d8e4e28..d3a1052 100644
--- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h
+++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h
@@ -40,7 +40,7 @@ class ChromeResourceDispatcherHostDelegate
const GURL& url,
ResourceType::Type resource_type,
const content::ResourceContext& resource_context,
- const GURL& referrer) OVERRIDE;
+ const content::Referrer& referrer) OVERRIDE;
virtual ResourceHandler* RequestBeginning(
ResourceHandler* handler,
net::URLRequest* request,
diff --git a/content/browser/renderer_host/resource_dispatcher_host.cc b/content/browser/renderer_host/resource_dispatcher_host.cc
index 5b0fea7..ba8d686 100644
--- a/content/browser/renderer_host/resource_dispatcher_host.cc
+++ b/content/browser/renderer_host/resource_dispatcher_host.cc
@@ -495,7 +495,8 @@ void ResourceDispatcherHost::BeginRequest(
return;
}
- const GURL referrer = MaybeStripReferrer(request_data.referrer);
+ const content::Referrer referrer(MaybeStripReferrer(request_data.referrer),
+ request_data.referrer_policy);
// Allow the observer to block/handle the request.
if (delegate_ && !delegate_->ShouldBeginRequest(child_id,
@@ -538,7 +539,7 @@ void ResourceDispatcherHost::BeginRequest(
request = new net::URLRequest(request_data.url, this);
request->set_method(request_data.method);
request->set_first_party_for_cookies(request_data.first_party_for_cookies);
- request->set_referrer(referrer.spec());
+ request->set_referrer(referrer.url.spec());
net::HttpRequestHeaders headers;
headers.AddHeadersFromString(request_data.headers);
request->SetExtraRequestHeaders(headers);
diff --git a/content/public/browser/resource_dispatcher_host_delegate.h b/content/public/browser/resource_dispatcher_host_delegate.h
index 64fc497..4bfeb59 100644
--- a/content/public/browser/resource_dispatcher_host_delegate.h
+++ b/content/public/browser/resource_dispatcher_host_delegate.h
@@ -17,6 +17,7 @@ class ResourceHandler;
class ResourceMessageFilter;
namespace content {
+struct Referrer;
class ResourceContext;
struct ResourceResponse;
}
@@ -41,7 +42,7 @@ class ResourceDispatcherHostDelegate {
const GURL& url,
ResourceType::Type resource_type,
const content::ResourceContext& resource_context,
- const GURL& referrer) = 0;
+ const content::Referrer& referrer) = 0;
// Called after ShouldBeginRequest when all the resource handlers from the
// content layer have been added. To add new handlers to the front, return