diff options
Diffstat (limited to 'chrome/browser/prerender/prerender_contents.cc')
-rw-r--r-- | chrome/browser/prerender/prerender_contents.cc | 135 |
1 files changed, 66 insertions, 69 deletions
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc index 0b3e1b9..6267ec2 100644 --- a/chrome/browser/prerender/prerender_contents.cc +++ b/chrome/browser/prerender/prerender_contents.cc @@ -5,7 +5,6 @@ #include "chrome/browser/prerender/prerender_contents.h" #include <algorithm> -#include <functional> #include <utility> #include "base/process_util.h" @@ -13,7 +12,6 @@ #include "chrome/browser/history/history_tab_helper.h" #include "chrome/browser/history/history_types.h" #include "chrome/browser/prerender/prerender_final_status.h" -#include "chrome/browser/prerender/prerender_handle.h" #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/browser/prerender/prerender_render_view_host_observer.h" #include "chrome/browser/prerender/prerender_tracker.h" @@ -28,7 +26,6 @@ #include "content/public/browser/notification_service.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" -#include "content/public/browser/session_storage_namespace.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_view.h" @@ -38,13 +35,29 @@ using content::DownloadItem; using content::OpenURLParams; using content::RenderViewHost; using content::ResourceRedirectDetails; -using content::SessionStorageNamespace; using content::WebContents; namespace prerender { namespace { +// Compares URLs ignoring any ref for the purposes of matching URLs when +// prerendering. +struct PrerenderURLPredicate { + explicit PrerenderURLPredicate(const GURL& url) + : url_(url) { + } + + bool operator()(const GURL& url) const { + return url.scheme() == url_.scheme() && + url.host() == url_.host() && + url.port() == url_.port() && + url.path() == url_.path() && + url.query() == url_.query(); + } + GURL url_; +}; + // Tells the render process at |child_id| whether |url| is a new prerendered // page, or whether |url| is being removed as a prerendered page. Currently // this will only inform the render process that created the prerendered page @@ -81,6 +94,24 @@ class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { } }; +struct PrerenderContents::PendingPrerenderInfo { + PendingPrerenderInfo(const GURL& url, + const content::Referrer& referrer, + const gfx::Size& size); + const GURL url; + const content::Referrer referrer; + const gfx::Size size; +}; + +PrerenderContents::PendingPrerenderInfo::PendingPrerenderInfo( + const GURL& url, + const content::Referrer& referrer, + const gfx::Size& size) + : url(url), + referrer(referrer), + size(size) { +} + // TabContentsDelegateImpl ----------------------------------------------------- class PrerenderContents::TabContentsDelegateImpl @@ -92,7 +123,7 @@ class PrerenderContents::TabContentsDelegateImpl // content::WebContentsDelegate implementation: virtual WebContents* OpenURLFromTab(WebContents* source, - const OpenURLParams& params) OVERRIDE { + const OpenURLParams& params) OVERRIDE { // |OpenURLFromTab| is typically called when a frame performs a navigation // that requires the browser to perform the transition instead of WebKit. // Examples include prerendering a site that redirects to an app URL, @@ -188,61 +219,34 @@ class PrerenderContents::TabContentsDelegateImpl PrerenderContents* prerender_contents_; }; -void PrerenderContents::AddPendingPrerender( - const base::WeakPtr<PrerenderHandle> weak_prerender_handle, - const GURL& url, - const content::Referrer& referrer, - const gfx::Size& size) { - pending_prerenders_.push_back( - PendingPrerenderInfo(weak_prerender_handle, url, referrer, size)); +void PrerenderContents::AddPendingPrerender(const GURL& url, + const content::Referrer& referrer, + const gfx::Size& size) { + pending_prerender_list_.push_back(PendingPrerenderInfo(url, referrer, size)); } -bool PrerenderContents::IsPendingEntry( - const PrerenderHandle& prerender_handle) const { - for (std::vector<PendingPrerenderInfo>::const_iterator it = - pending_prerenders_.begin(); - it != pending_prerenders_.end(); +bool PrerenderContents::IsPendingEntry(const GURL& url) const { + for (PendingPrerenderList::const_iterator it = + pending_prerender_list_.begin(); + it != pending_prerender_list_.end(); ++it) { - if (it->weak_prerender_handle.get() == &prerender_handle) + if (it->url == url) return true; } return false; } void PrerenderContents::StartPendingPrerenders() { - SessionStorageNamespace* session_storage_namespace = NULL; - if (RenderViewHost* render_view_host = GetRenderViewHostMutable()) - session_storage_namespace = render_view_host->GetSessionStorageNamespace(); - DCHECK(child_id_ == -1 || session_storage_namespace); - - std::vector<PendingPrerenderInfo> pending_prerender_list; - pending_prerender_list.swap(pending_prerenders_); - for (std::vector<PendingPrerenderInfo>::iterator it = - pending_prerender_list.begin(); + PendingPrerenderList pending_prerender_list; + pending_prerender_list.swap(pending_prerender_list_); + for (PendingPrerenderList::iterator it = pending_prerender_list.begin(); it != pending_prerender_list.end(); ++it) { - if (it->weak_prerender_handle && it->weak_prerender_handle->IsValid()) { - prerender_manager_->StartPendingPrerender( - it->weak_prerender_handle.get(), ORIGIN_LINK_REL_PRERENDER, child_id_, - it->url, it->referrer, it->size, session_storage_namespace); - } + prerender_manager_->AddPrerenderFromLinkRelPrerender( + child_id_, route_id_, it->url, it->referrer, it->size); } } -PrerenderContents::PendingPrerenderInfo::PendingPrerenderInfo( - const base::WeakPtr<PrerenderHandle> weak_prerender_handle, - const GURL& url, - const content::Referrer& referrer, - const gfx::Size& size) - : weak_prerender_handle(weak_prerender_handle), - url(url), - referrer(referrer), - size(size) { -} - -PrerenderContents::PendingPrerenderInfo::~PendingPrerenderInfo() { -} - PrerenderContents::PrerenderContents( PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker, @@ -258,7 +262,6 @@ PrerenderContents::PrerenderContents( referrer_(referrer), profile_(profile), page_id_(0), - session_storage_namespace_id_(-1), has_stopped_loading_(false), has_finished_loading_(false), final_status_(FINAL_STATUS_MAX), @@ -272,13 +275,6 @@ PrerenderContents::PrerenderContents( DCHECK(prerender_manager != NULL); } -void PrerenderContents::MakeIntoDummyReplacementOf( - const PrerenderContents* original_prerender_contents) { - load_start_time_ = original_prerender_contents->load_start_time_; - session_storage_namespace_id_ = - original_prerender_contents->session_storage_namespace_id_; -} - bool PrerenderContents::Init() { return AddAliasURL(prerender_url_); } @@ -291,7 +287,7 @@ PrerenderContents::Factory* PrerenderContents::CreateFactory() { void PrerenderContents::StartPrerendering( int creator_child_id, const gfx::Size& size, - SessionStorageNamespace* session_storage_namespace, + content::SessionStorageNamespace* session_storage_namespace, bool is_control_group) { DCHECK(profile_ != NULL); DCHECK(!size.IsEmpty()); @@ -302,15 +298,11 @@ void PrerenderContents::StartPrerendering( DCHECK_EQ(1U, alias_urls_.size()); creator_child_id_ = creator_child_id; - session_storage_namespace_id_ = session_storage_namespace->id(); size_ = size; InformRenderProcessAboutPrerender(prerender_url_, true, creator_child_id_); - DCHECK(load_start_time_.is_null()); - load_start_time_ = base::TimeTicks::Now(); - // Everything after this point sets up the WebContents object and associated // RenderView for the prerender page. Don't do this for members of the // control group. @@ -366,6 +358,9 @@ void PrerenderContents::StartPrerendering( this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, content::Source<WebContents>(GetWebContents())); + DCHECK(load_start_time_.is_null()); + load_start_time_ = base::TimeTicks::Now(); + // Transfer over the user agent override. new_contents->SetUserAgentOverride( prerender_manager_->config().user_agent_override); @@ -499,7 +494,7 @@ void PrerenderContents::OnRenderViewHostCreated( } WebContents* PrerenderContents::CreateWebContents( - SessionStorageNamespace* session_storage_namespace) { + content::SessionStorageNamespace* session_storage_namespace) { return WebContents::Create(profile_, NULL, MSG_ROUTING_NONE, NULL, session_storage_namespace); } @@ -551,15 +546,17 @@ void PrerenderContents::AddAliasURLsFromOtherPrerenderContents( } } -bool PrerenderContents::Matches( - const GURL& url, - const SessionStorageNamespace* session_storage_namespace) const { - DCHECK(child_id_ == -1 || session_storage_namespace); - if (session_storage_namespace && - session_storage_namespace_id_ != session_storage_namespace->id()) - return false; - return std::count_if(alias_urls_.begin(), alias_urls_.end(), - std::bind2nd(std::equal_to<GURL>(), url)) != 0; +bool PrerenderContents::MatchesURL(const GURL& url, GURL* matching_url) const { + std::vector<GURL>::const_iterator matching_url_iterator = + std::find_if(alias_urls_.begin(), + alias_urls_.end(), + PrerenderURLPredicate(url)); + if (matching_url_iterator != alias_urls_.end()) { + if (matching_url) + *matching_url = *matching_url_iterator; + return true; + } + return false; } void PrerenderContents::RenderViewGone(base::TerminationStatus status) { |