Commit 5ffbf697 authored by jochen@chromium.org's avatar jochen@chromium.org

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
parent 55afeb52
...@@ -117,7 +117,7 @@ class TestPrerenderContents : public PrerenderContents { ...@@ -117,7 +117,7 @@ class TestPrerenderContents : public PrerenderContents {
PrerenderTracker* prerender_tracker, PrerenderTracker* prerender_tracker,
Profile* profile, Profile* profile,
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
int expected_number_of_loads, int expected_number_of_loads,
FinalStatus expected_final_status) FinalStatus expected_final_status)
: PrerenderContents(prerender_manager, prerender_tracker, : PrerenderContents(prerender_manager, prerender_tracker,
...@@ -202,7 +202,7 @@ class TestPrerenderContents : public PrerenderContents { ...@@ -202,7 +202,7 @@ class TestPrerenderContents : public PrerenderContents {
virtual void AddPendingPrerender(Origin origin, virtual void AddPendingPrerender(Origin origin,
const GURL& url, const GURL& url,
const GURL& referrer) { const content::Referrer& referrer) OVERRIDE {
PrerenderContents::AddPendingPrerender(origin, url, referrer); PrerenderContents::AddPendingPrerender(origin, url, referrer);
if (expected_pending_prerenders_ > 0 && if (expected_pending_prerenders_ > 0 &&
pending_prerender_list()->size() == expected_pending_prerenders_) { pending_prerender_list()->size() == expected_pending_prerenders_) {
...@@ -306,7 +306,7 @@ class WaitForLoadPrerenderContentsFactory : public PrerenderContents::Factory { ...@@ -306,7 +306,7 @@ class WaitForLoadPrerenderContentsFactory : public PrerenderContents::Factory {
PrerenderTracker* prerender_tracker, PrerenderTracker* prerender_tracker,
Profile* profile, Profile* profile,
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
Origin origin, Origin origin,
uint8 experiment_id) OVERRIDE { uint8 experiment_id) OVERRIDE {
FinalStatus expected_final_status = FINAL_STATUS_MATCH_COMPLETE_DUMMY; FinalStatus expected_final_status = FINAL_STATUS_MATCH_COMPLETE_DUMMY;
......
...@@ -63,7 +63,7 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { ...@@ -63,7 +63,7 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
public: public:
virtual PrerenderContents* CreatePrerenderContents( virtual PrerenderContents* CreatePrerenderContents(
PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker, 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 { Origin origin, uint8 experiment_id) OVERRIDE {
return new PrerenderContents(prerender_manager, prerender_tracker, profile, return new PrerenderContents(prerender_manager, prerender_tracker, profile,
url, referrer, origin, experiment_id); url, referrer, origin, experiment_id);
...@@ -73,7 +73,7 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { ...@@ -73,7 +73,7 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
PrerenderContents::PendingPrerenderData::PendingPrerenderData( PrerenderContents::PendingPrerenderData::PendingPrerenderData(
Origin origin, Origin origin,
const GURL& url, const GURL& url,
const GURL& referrer) const content::Referrer& referrer)
: origin(origin), : origin(origin),
url(url), url(url),
referrer(referrer) { referrer(referrer) {
...@@ -158,7 +158,7 @@ class PrerenderContents::TabContentsDelegateImpl ...@@ -158,7 +158,7 @@ class PrerenderContents::TabContentsDelegateImpl
void PrerenderContents::AddPendingPrerender(Origin origin, void PrerenderContents::AddPendingPrerender(Origin origin,
const GURL& url, const GURL& url,
const GURL& referrer) { const content::Referrer& referrer) {
pending_prerender_list_.push_back( pending_prerender_list_.push_back(
PendingPrerenderData(origin, url, referrer)); PendingPrerenderData(origin, url, referrer));
} }
...@@ -193,7 +193,7 @@ PrerenderContents::PrerenderContents( ...@@ -193,7 +193,7 @@ PrerenderContents::PrerenderContents(
PrerenderTracker* prerender_tracker, PrerenderTracker* prerender_tracker,
Profile* profile, Profile* profile,
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
Origin origin, Origin origin,
uint8 experiment_id) uint8 experiment_id)
: prerender_manager_(prerender_manager), : prerender_manager_(prerender_manager),
...@@ -340,7 +340,7 @@ void PrerenderContents::StartPrerendering( ...@@ -340,7 +340,7 @@ void PrerenderContents::StartPrerendering(
transition = content::PAGE_TRANSITION_TYPED; transition = content::PAGE_TRANSITION_TYPED;
new_contents->controller().LoadURL( new_contents->controller().LoadURL(
prerender_url_, prerender_url_,
content::Referrer(referrer_, WebKit::WebReferrerPolicyDefault), referrer_,
transition, std::string()); transition, std::string());
} }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "chrome/browser/prerender/prerender_final_status.h" #include "chrome/browser/prerender/prerender_final_status.h"
#include "content/browser/tab_contents/tab_contents_observer.h" #include "content/browser/tab_contents/tab_contents_observer.h"
#include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_registrar.h"
#include "content/public/common/referrer.h"
class Profile; class Profile;
class RenderViewHost; class RenderViewHost;
...@@ -57,7 +58,7 @@ class PrerenderContents : public content::NotificationObserver, ...@@ -57,7 +58,7 @@ class PrerenderContents : public content::NotificationObserver,
PrerenderTracker* prerender_tracker, PrerenderTracker* prerender_tracker,
Profile* profile, Profile* profile,
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
Origin origin, Origin origin,
uint8 experiment_id) = 0; uint8 experiment_id) = 0;
...@@ -67,11 +68,13 @@ class PrerenderContents : public content::NotificationObserver, ...@@ -67,11 +68,13 @@ class PrerenderContents : public content::NotificationObserver,
// Information on pages that the prerendered page has tried to prerender. // Information on pages that the prerendered page has tried to prerender.
struct PendingPrerenderData { struct PendingPrerenderData {
PendingPrerenderData(Origin origin, const GURL& url, const GURL& referrer); PendingPrerenderData(Origin origin,
const GURL& url,
const content::Referrer& referrer);
Origin origin; Origin origin;
GURL url; GURL url;
GURL referrer; content::Referrer referrer;
}; };
typedef std::list<PendingPrerenderData> PendingPrerenderList; typedef std::list<PendingPrerenderData> PendingPrerenderList;
...@@ -97,7 +100,7 @@ class PrerenderContents : public content::NotificationObserver, ...@@ -97,7 +100,7 @@ class PrerenderContents : public content::NotificationObserver,
int32 page_id() const { return page_id_; } int32 page_id() const { return page_id_; }
GURL icon_url() const { return icon_url_; } GURL icon_url() const { return icon_url_; }
const GURL& prerender_url() const { return prerender_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 has_stopped_loading() const { return has_stopped_loading_; }
bool prerendering_has_started() const { return prerendering_has_started_; } bool prerendering_has_started() const { return prerendering_has_started_; }
...@@ -179,7 +182,7 @@ class PrerenderContents : public content::NotificationObserver, ...@@ -179,7 +182,7 @@ class PrerenderContents : public content::NotificationObserver,
// Adds a pending prerender to the list. // Adds a pending prerender to the list.
virtual void AddPendingPrerender(Origin origin, virtual void AddPendingPrerender(Origin origin,
const GURL& url, const GURL& url,
const GURL& referrer); const content::Referrer& referrer);
// Returns true if |url| corresponds to a pending prerender. // Returns true if |url| corresponds to a pending prerender.
bool IsPendingEntry(const GURL& url) const; bool IsPendingEntry(const GURL& url) const;
...@@ -193,7 +196,7 @@ class PrerenderContents : public content::NotificationObserver, ...@@ -193,7 +196,7 @@ class PrerenderContents : public content::NotificationObserver,
PrerenderTracker* prerender_tracker, PrerenderTracker* prerender_tracker,
Profile* profile, Profile* profile,
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
Origin origin, Origin origin,
uint8 experiment_id); uint8 experiment_id);
...@@ -236,7 +239,7 @@ class PrerenderContents : public content::NotificationObserver, ...@@ -236,7 +239,7 @@ class PrerenderContents : public content::NotificationObserver,
GURL prerender_url_; GURL prerender_url_;
// The referrer. // The referrer.
GURL referrer_; content::Referrer referrer_;
// The profile being used // The profile being used
Profile* profile_; Profile* profile_;
......
...@@ -317,10 +317,11 @@ void PrerenderManager::SetPrerenderContentsFactory( ...@@ -317,10 +317,11 @@ void PrerenderManager::SetPrerenderContentsFactory(
prerender_contents_factory_.reset(prerender_contents_factory); prerender_contents_factory_.reset(prerender_contents_factory);
} }
bool PrerenderManager::AddPrerenderFromLinkRelPrerender(int process_id, bool PrerenderManager::AddPrerenderFromLinkRelPrerender(
int route_id, int process_id,
const GURL& url, int route_id,
const GURL& referrer) { const GURL& url,
const content::Referrer& referrer) {
std::pair<int, int> child_route_id_pair = std::make_pair(process_id, std::pair<int, int> child_route_id_pair = std::make_pair(process_id,
route_id); route_id);
...@@ -349,7 +350,7 @@ bool PrerenderManager::AddPrerenderFromOmnibox( ...@@ -349,7 +350,7 @@ bool PrerenderManager::AddPrerenderFromOmnibox(
NOTREACHED(); NOTREACHED();
break; 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); session_storage_namespace);
} }
...@@ -357,12 +358,14 @@ bool PrerenderManager::AddPrerender( ...@@ -357,12 +358,14 @@ bool PrerenderManager::AddPrerender(
Origin origin, Origin origin,
const std::pair<int, int>& child_route_id_pair, const std::pair<int, int>& child_route_id_pair,
const GURL& url_arg, const GURL& url_arg,
const GURL& referrer, const content::Referrer& referrer,
SessionStorageNamespace* session_storage_namespace) { SessionStorageNamespace* session_storage_namespace) {
DCHECK(CalledOnValidThread()); DCHECK(CalledOnValidThread());
if (origin == ORIGIN_LINK_REL_PRERENDER && IsGoogleSearchResultURL(referrer)) if (origin == ORIGIN_LINK_REL_PRERENDER &&
IsGoogleSearchResultURL(referrer.url)) {
origin = ORIGIN_GWS_PRERENDER; origin = ORIGIN_GWS_PRERENDER;
}
// If the referring page is prerendering, defer the prerender. // If the referring page is prerendering, defer the prerender.
std::list<PrerenderContentsData>::iterator source_prerender = std::list<PrerenderContentsData>::iterator source_prerender =
...@@ -770,7 +773,7 @@ bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const { ...@@ -770,7 +773,7 @@ bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const {
PrerenderContents* PrerenderManager::CreatePrerenderContents( PrerenderContents* PrerenderManager::CreatePrerenderContents(
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
Origin origin, Origin origin,
uint8 experiment_id) { uint8 experiment_id) {
DCHECK(CalledOnValidThread()); DCHECK(CalledOnValidThread());
......
...@@ -98,7 +98,8 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, ...@@ -98,7 +98,8 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// If the RenderViewHost source is itself prerendering, the prerender is added // If the RenderViewHost source is itself prerendering, the prerender is added
// as a pending prerender. // as a pending prerender.
bool AddPrerenderFromLinkRelPrerender(int process_id, int route_id, 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 // 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 // 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>, ...@@ -260,7 +261,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
Origin origin, Origin origin,
const std::pair<int, int>& child_route_id_pair, const std::pair<int, int>& child_route_id_pair,
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
SessionStorageNamespace* session_storage_namespace); SessionStorageNamespace* session_storage_namespace);
// Adds a pending preload issued by the prerendering RenderView identified by // Adds a pending preload issued by the prerendering RenderView identified by
...@@ -269,7 +270,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, ...@@ -269,7 +270,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
void AddPendingPrerender(Origin origin, void AddPendingPrerender(Origin origin,
const std::pair<int, int>& child_route_id_pair, const std::pair<int, int>& child_route_id_pair,
const GURL& url, const GURL& url,
const GURL& referrer); const content::Referrer& referrer);
// Retrieves the PrerenderContents object for the specified URL, if it // Retrieves the PrerenderContents object for the specified URL, if it
// has been prerendered. The caller will then have ownership of the // has been prerendered. The caller will then have ownership of the
...@@ -306,7 +307,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, ...@@ -306,7 +307,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
virtual base::TimeTicks GetCurrentTimeTicks() const; virtual base::TimeTicks GetCurrentTimeTicks() const;
virtual PrerenderContents* CreatePrerenderContents( virtual PrerenderContents* CreatePrerenderContents(
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
Origin origin, Origin origin,
uint8 experiment_id); uint8 experiment_id);
......
...@@ -27,7 +27,8 @@ class DummyPrerenderContents : public PrerenderContents { ...@@ -27,7 +27,8 @@ class DummyPrerenderContents : public PrerenderContents {
const GURL& url, const GURL& url,
FinalStatus expected_final_status) FinalStatus expected_final_status)
: PrerenderContents(prerender_manager, prerender_tracker, : PrerenderContents(prerender_manager, prerender_tracker,
NULL, url, GURL(), ORIGIN_LINK_REL_PRERENDER, NULL, url, content::Referrer(),
ORIGIN_LINK_REL_PRERENDER,
PrerenderManager::kNoExperiment), PrerenderManager::kNoExperiment),
has_started_(false), has_started_(false),
expected_final_status_(expected_final_status) { expected_final_status_(expected_final_status) {
...@@ -128,7 +129,7 @@ class TestPrerenderManager : public PrerenderManager { ...@@ -128,7 +129,7 @@ class TestPrerenderManager : public PrerenderManager {
bool AddSimplePrerender(const GURL& url) { bool AddSimplePrerender(const GURL& url) {
return AddPrerenderFromLinkRelPrerender(-1, -1, return AddPrerenderFromLinkRelPrerender(-1, -1,
url, url,
GURL()); content::Referrer());
} }
void set_rate_limit_enabled(bool enabled) { void set_rate_limit_enabled(bool enabled) {
...@@ -157,7 +158,7 @@ class TestPrerenderManager : public PrerenderManager { ...@@ -157,7 +158,7 @@ class TestPrerenderManager : public PrerenderManager {
virtual PrerenderContents* CreatePrerenderContents( virtual PrerenderContents* CreatePrerenderContents(
const GURL& url, const GURL& url,
const GURL& referrer, const content::Referrer& referrer,
Origin origin, Origin origin,
uint8 experiment_id) OVERRIDE { uint8 experiment_id) OVERRIDE {
DCHECK(next_prerender_contents_.get()); DCHECK(next_prerender_contents_.get());
...@@ -437,7 +438,7 @@ TEST_F(PrerenderManagerTest, PendingPrerenderTest) { ...@@ -437,7 +438,7 @@ TEST_F(PrerenderManagerTest, PendingPrerenderTest) {
EXPECT_TRUE(prerender_manager()->AddPrerenderFromLinkRelPrerender( EXPECT_TRUE(prerender_manager()->AddPrerenderFromLinkRelPrerender(
child_id, route_id, child_id, route_id,
pending_url, url)); pending_url, content::Referrer(url, WebKit::WebReferrerPolicyDefault)));
EXPECT_TRUE(prerender_manager()->IsPendingEntry(pending_url)); EXPECT_TRUE(prerender_manager()->IsPendingEntry(pending_url));
EXPECT_TRUE(prerender_contents->has_started()); EXPECT_TRUE(prerender_contents->has_started());
...@@ -468,7 +469,7 @@ TEST_F(PrerenderManagerTest, SourceRenderViewClosed) { ...@@ -468,7 +469,7 @@ TEST_F(PrerenderManagerTest, SourceRenderViewClosed) {
url, url,
FINAL_STATUS_MANAGER_SHUTDOWN); FINAL_STATUS_MANAGER_SHUTDOWN);
EXPECT_FALSE(prerender_manager()->AddPrerenderFromLinkRelPrerender( EXPECT_FALSE(prerender_manager()->AddPrerenderFromLinkRelPrerender(
100, 100, url, GURL())); 100, 100, url, content::Referrer()));
} }
// Tests that the prerender manager ignores fragment references when matching // Tests that the prerender manager ignores fragment references when matching
......
...@@ -63,7 +63,7 @@ class InstantResourceDispatcherHostLoginDelegate ...@@ -63,7 +63,7 @@ class InstantResourceDispatcherHostLoginDelegate
void AddPrerenderOnUI( void AddPrerenderOnUI(
int render_process_id, int render_view_id, 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)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
prerender::PrerenderManager* prerender_manager = prerender::PrerenderManager* prerender_manager =
prerender::FindPrerenderManagerUsingRenderProcessId(render_process_id); prerender::FindPrerenderManagerUsingRenderProcessId(render_process_id);
...@@ -109,7 +109,7 @@ bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest( ...@@ -109,7 +109,7 @@ bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest(
const GURL& url, const GURL& url,
ResourceType::Type resource_type, ResourceType::Type resource_type,
const content::ResourceContext& resource_context, const content::ResourceContext& resource_context,
const GURL& referrer) { const content::Referrer& referrer) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
// Handle a PREFETCH resource type. If prefetch is disabled, squelch the // Handle a PREFETCH resource type. If prefetch is disabled, squelch the
......
...@@ -40,7 +40,7 @@ class ChromeResourceDispatcherHostDelegate ...@@ -40,7 +40,7 @@ class ChromeResourceDispatcherHostDelegate
const GURL& url, const GURL& url,
ResourceType::Type resource_type, ResourceType::Type resource_type,
const content::ResourceContext& resource_context, const content::ResourceContext& resource_context,
const GURL& referrer) OVERRIDE; const content::Referrer& referrer) OVERRIDE;
virtual ResourceHandler* RequestBeginning( virtual ResourceHandler* RequestBeginning(
ResourceHandler* handler, ResourceHandler* handler,
net::URLRequest* request, net::URLRequest* request,
......
...@@ -495,7 +495,8 @@ void ResourceDispatcherHost::BeginRequest( ...@@ -495,7 +495,8 @@ void ResourceDispatcherHost::BeginRequest(
return; 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. // Allow the observer to block/handle the request.
if (delegate_ && !delegate_->ShouldBeginRequest(child_id, if (delegate_ && !delegate_->ShouldBeginRequest(child_id,
...@@ -538,7 +539,7 @@ void ResourceDispatcherHost::BeginRequest( ...@@ -538,7 +539,7 @@ void ResourceDispatcherHost::BeginRequest(
request = new net::URLRequest(request_data.url, this); request = new net::URLRequest(request_data.url, this);
request->set_method(request_data.method); request->set_method(request_data.method);
request->set_first_party_for_cookies(request_data.first_party_for_cookies); 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; net::HttpRequestHeaders headers;
headers.AddHeadersFromString(request_data.headers); headers.AddHeadersFromString(request_data.headers);
request->SetExtraRequestHeaders(headers); request->SetExtraRequestHeaders(headers);
......
...@@ -17,6 +17,7 @@ class ResourceHandler; ...@@ -17,6 +17,7 @@ class ResourceHandler;
class ResourceMessageFilter; class ResourceMessageFilter;
namespace content { namespace content {
struct Referrer;
class ResourceContext; class ResourceContext;
struct ResourceResponse; struct ResourceResponse;
} }
...@@ -41,7 +42,7 @@ class ResourceDispatcherHostDelegate { ...@@ -41,7 +42,7 @@ class ResourceDispatcherHostDelegate {
const GURL& url, const GURL& url,
ResourceType::Type resource_type, ResourceType::Type resource_type,
const content::ResourceContext& resource_context, const content::ResourceContext& resource_context,
const GURL& referrer) = 0; const content::Referrer& referrer) = 0;
// Called after ShouldBeginRequest when all the resource handlers from the // Called after ShouldBeginRequest when all the resource handlers from the
// content layer have been added. To add new handlers to the front, return // content layer have been added. To add new handlers to the front, return
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment