Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(348)

Unified Diff: chrome/browser/prerender/prerender_contents.cc

Issue 10553029: Handle interface to prerenders. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remediate to review Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_contents.cc
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 6267ec20e5b385c22b9637c7757d585a4d9daccc..42017ff3bc80be8f4fd503853e8bdfaa2eb41131 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/prerender/prerender_contents.h"
#include <algorithm>
+#include <functional>
#include <utility>
#include "base/process_util.h"
@@ -12,6 +13,7 @@
#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"
@@ -35,29 +37,13 @@ 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
@@ -94,24 +80,6 @@ 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
@@ -123,7 +91,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,
@@ -219,34 +187,64 @@ class PrerenderContents::TabContentsDelegateImpl
PrerenderContents* prerender_contents_;
};
-void PrerenderContents::AddPendingPrerender(const GURL& url,
- const content::Referrer& referrer,
- const gfx::Size& size) {
- pending_prerender_list_.push_back(PendingPrerenderInfo(url, referrer, size));
+void PrerenderContents::AddPendingPrerender(
+ const base::WeakPtr<PrerenderHandle> weak_prerender_handle,
+ const GURL& url,
+ const content::Referrer& referrer,
+ const gfx::Size& size) {
+ pending_prerender_list_.push_back(
+ PendingPrerenderInfo(weak_prerender_handle, url, referrer, size));
}
-bool PrerenderContents::IsPendingEntry(const GURL& url) const {
- for (PendingPrerenderList::const_iterator it =
+bool PrerenderContents::IsPendingEntry(
+ const PrerenderHandle* prerender_handle) const {
+ for (std::vector<PendingPrerenderInfo>::const_iterator it =
dominich 2012/07/03 17:08:39 Another reason to not remove the typedef - you wou
pending_prerender_list_.begin();
it != pending_prerender_list_.end();
++it) {
- if (it->url == url)
+ if (it->weak_prerender_handle.get() == prerender_handle)
dominich 2012/07/03 17:08:39 i'm curious how this compiled before. it /should/
gavinp 2012/07/03 18:45:41 See base::WeakPtr<T>::operator T*() { return get()
dominich 2012/07/03 20:02:41 Aha! I do not like that one bit. However, it is n
gavinp 2012/07/04 03:01:17 I concur that it's out of scope. You might be surp
return true;
}
return false;
}
void PrerenderContents::StartPendingPrerenders() {
- PendingPrerenderList pending_prerender_list;
+ SessionStorageNamespace* session_storage_namespace = NULL;
+ if (RenderViewHost* render_view_host = GetRenderViewHostMutable()) {
+ session_storage_namespace = render_view_host->GetSessionStorageNamespace();
+ } else {
+ DCHECK_EQ(-1, child_id_)
+ << "session_storage_namespace != NULL, except in tests";
+ }
+
+ std::vector<PendingPrerenderInfo> pending_prerender_list;
pending_prerender_list.swap(pending_prerender_list_);
- for (PendingPrerenderList::iterator it = pending_prerender_list.begin();
+ for (std::vector<PendingPrerenderInfo>::iterator it =
+ pending_prerender_list.begin();
it != pending_prerender_list.end();
++it) {
- prerender_manager_->AddPrerenderFromLinkRelPrerender(
- child_id_, route_id_, it->url, it->referrer, it->size);
+ if (it->weak_prerender_handle && it->weak_prerender_handle->IsValid()) {
+ prerender_manager_->StartPendingPrerender(
+ it->weak_prerender_handle.get(), ORIGIN_LINK_REL_PRERENDER, child_id_,
dominich 2012/07/03 17:08:39 and again - how did this compile?
mmenke 2012/07/09 18:06:57 It's actually pretty common to rely on the weak po
+ it->url, it->referrer, it->size, session_storage_namespace);
+ }
}
}
+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,
@@ -262,6 +260,7 @@ PrerenderContents::PrerenderContents(
referrer_(referrer),
profile_(profile),
page_id_(0),
+ session_storage_namespace_(NULL),
has_stopped_loading_(false),
has_finished_loading_(false),
final_status_(FINAL_STATUS_MAX),
@@ -275,6 +274,13 @@ 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_ =
+ original_prerender_contents->session_storage_namespace_;
+}
+
bool PrerenderContents::Init() {
return AddAliasURL(prerender_url_);
}
@@ -287,7 +293,7 @@ PrerenderContents::Factory* PrerenderContents::CreateFactory() {
void PrerenderContents::StartPrerendering(
int creator_child_id,
const gfx::Size& size,
- content::SessionStorageNamespace* session_storage_namespace,
+ SessionStorageNamespace* session_storage_namespace,
bool is_control_group) {
DCHECK(profile_ != NULL);
DCHECK(!size.IsEmpty());
@@ -298,11 +304,15 @@ void PrerenderContents::StartPrerendering(
DCHECK_EQ(1U, alias_urls_.size());
creator_child_id_ = creator_child_id;
+ session_storage_namespace_ = session_storage_namespace;
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.
@@ -358,9 +368,6 @@ 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);
@@ -494,7 +501,7 @@ void PrerenderContents::OnRenderViewHostCreated(
}
WebContents* PrerenderContents::CreateWebContents(
- content::SessionStorageNamespace* session_storage_namespace) {
+ SessionStorageNamespace* session_storage_namespace) {
return WebContents::Create(profile_, NULL, MSG_ROUTING_NONE, NULL,
session_storage_namespace);
}
@@ -546,17 +553,13 @@ void PrerenderContents::AddAliasURLsFromOtherPrerenderContents(
}
}
-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;
+bool PrerenderContents::Matches(
+ const GURL& url,
+ const SessionStorageNamespace* session_storage_namespace) {
+ if (session_storage_namespace_ != session_storage_namespace)
+ return false;
+ return std::count_if(alias_urls_.begin(), alias_urls_.end(),
+ std::bind2nd(std::equal_to<GURL>(), url)) != 0;
}
void PrerenderContents::RenderViewGone(base::TerminationStatus status) {

Powered by Google App Engine
This is Rietveld 408576698