summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender/prerender_contents.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/prerender/prerender_contents.cc')
-rw-r--r--chrome/browser/prerender/prerender_contents.cc135
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) {