diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-06 00:17:51 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-06 00:17:51 +0000 |
commit | 5ffbf69700a16a7a1c2086cb931589975b370e76 (patch) | |
tree | 52e59fbaccec3e046786c84db0a0b7b94b6fdced | |
parent | 55afeb52c9b10f58d9b0e5466ad0763aa59234f7 (diff) | |
download | chromium_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
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 |