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

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: remediated, and cleaned up in prep for uploading for 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..d62ecfe4082f9693439a499c60a067fdb185734e 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -5,13 +5,16 @@
#include "chrome/browser/prerender/prerender_contents.h"
#include <algorithm>
+#include <functional>
#include <utility>
+#include "base/memory/linked_ptr.h"
dominich 2012/06/28 00:34:32 include no longer needed.
#include "base/process_util.h"
#include "base/utf_string_conversions.h"
#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"
dominich 2012/06/28 00:34:32 unnecessary include? included by .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 +38,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 +81,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 +92,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 +188,61 @@ 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));
+PrerenderHandle PrerenderContents::AddPendingPrerender(
+ const GURL& url,
+ const content::Referrer& referrer,
+ const gfx::Size& size) {
+ PrerenderHandleImpl* prerender_handle_impl = new PrerenderHandleImpl;
dominich 2012/06/28 00:34:32 () at the end of the 'new' call to ensure initiali
+ pending_prerender_list_.push_back(
+ PendingPrerenderInfo(prerender_handle_impl, url, referrer, size));
+ return prerender_handle_impl->AsWeakPtr();
}
-bool PrerenderContents::IsPendingEntry(const GURL& url) const {
+bool PrerenderContents::IsPendingEntry(
+ PrerenderHandle prerender_handle) const {
for (PendingPrerenderList::const_iterator it =
pending_prerender_list_.begin();
it != pending_prerender_list_.end();
++it) {
- if (it->url == url)
+ if (it->prerender_handle_impl == prerender_handle)
return true;
}
return false;
}
void PrerenderContents::StartPendingPrerenders() {
+ SessionStorageNamespace* my_session_storage_namespace = NULL;
dominich 2012/06/28 00:34:32 nit: Drop the my_. Just session_storage_namespace.
+ if (RenderViewHost* render_view_host = GetRenderViewHostMutable()) {
dominich 2012/06/28 00:34:32 why does getting the SessionStorageNamespace requi
+ my_session_storage_namespace =
+ render_view_host->GetSessionStorageNamespace();
+ } else {
+ DCHECK_NE(-1, child_id_)
+ << "No session storage namespace, and not in a test.";
+ }
+
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) {
- prerender_manager_->AddPrerenderFromLinkRelPrerender(
- child_id_, route_id_, it->url, it->referrer, it->size);
+ prerender_manager_->StartPendingPrerender(
+ it->prerender_handle_impl, ORIGIN_LINK_REL_PRERENDER,
dominich 2012/06/28 00:34:32 origin should be stored in the pending struct.
+ child_id_, it->url, it->referrer, it->size,
+ my_session_storage_namespace);
}
}
+PrerenderContents::PendingPrerenderInfo::PendingPrerenderInfo(
+ PrerenderHandleImpl* prerender_handle_impl,
dominich 2012/06/28 00:34:32 const PrerenderHandleImpl?
+ const GURL& url,
+ const content::Referrer& referrer,
+ const gfx::Size& size)
+ : prerender_handle_impl(prerender_handle_impl),
+ url(url),
+ referrer(referrer),
+ size(size) {
+}
+
PrerenderContents::PrerenderContents(
PrerenderManager* prerender_manager,
PrerenderTracker* prerender_tracker,
@@ -262,6 +258,8 @@ PrerenderContents::PrerenderContents(
referrer_(referrer),
profile_(profile),
page_id_(0),
+ session_storage_namespace_(NULL),
+ client_count_(1),
has_stopped_loading_(false),
has_finished_loading_(false),
final_status_(FINAL_STATUS_MAX),
@@ -275,6 +273,14 @@ PrerenderContents::PrerenderContents(
DCHECK(prerender_manager != NULL);
}
+void PrerenderContents::MakeIntoDummyReplacementOf(
dominich 2012/06/28 00:34:32 CloneAsDummy, maybe? Do any of the other members
+ const PrerenderContents* original_prerender_contents) {
+ load_start_time_ = original_prerender_contents->load_start_time_;
+ session_storage_namespace_ =
+ original_prerender_contents->session_storage_namespace_;
+ client_count_ = original_prerender_contents->client_count_;
+}
+
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());
dominich 2012/06/28 00:34:32 any reason why this moved earlier?
+ 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,24 @@ 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;
+void PrerenderContents::IncrementClientCount() {
+ DCHECK_LT(0, client_count_);
dominich 2012/06/28 00:34:32 this is very confusing. DCHECK_GT(client_count_, 0
+ ++client_count_;
+}
+
+void PrerenderContents::DecrementClientCount() {
+ if (--client_count_ == 0)
+ Destroy(FINAL_STATUS_CANCELLED);
+}
+
+bool PrerenderContents::Matches(
+ const GURL& url,
+ const SessionStorageNamespace* session_storage_namespace) {
+ if (session_storage_namespace_ != session_storage_namespace)
+ return false;
+ int match_count = std::count_if(alias_urls_.begin(), alias_urls_.end(),
+ std::bind2nd(std::equal_to<GURL>(), url));
+ return match_count > 0;
dominich 2012/06/28 00:34:32 nit: return std::count_if( alias_urls_.begin()
}
void PrerenderContents::RenderViewGone(base::TerminationStatus status) {

Powered by Google App Engine
This is Rietveld 408576698