| Index: chrome/browser/prerender/prerender_manager.cc
|
| ===================================================================
|
| --- chrome/browser/prerender/prerender_manager.cc (revision 269838)
|
| +++ chrome/browser/prerender/prerender_manager.cc (working copy)
|
| @@ -58,6 +58,7 @@
|
| #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/storage_partition.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/browser/web_contents_delegate.h"
|
| #include "content/public/common/url_constants.h"
|
| @@ -245,7 +246,8 @@
|
| prerender_history_(new PrerenderHistory(kHistoryLength)),
|
| histograms_(new PrerenderHistograms()),
|
| profile_network_bytes_(0),
|
| - last_recorded_profile_network_bytes_(0) {
|
| + last_recorded_profile_network_bytes_(0),
|
| + cookie_store_loaded_(false) {
|
| // There are some assumptions that the PrerenderManager is on the UI thread.
|
| // Any other checks simply make sure that the PrerenderManager is accessed on
|
| // the same thread that it was created on.
|
| @@ -303,6 +305,13 @@
|
| // emptied these vectors already.
|
| DCHECK(active_prerenders_.empty());
|
| DCHECK(to_delete_prerenders_.empty());
|
| +
|
| + for (PrerenderProcessSet::const_iterator it =
|
| + prerender_process_hosts_.begin();
|
| + it != prerender_process_hosts_.end();
|
| + ++it) {
|
| + (*it)->RemoveObserver(this);
|
| + }
|
| }
|
|
|
| void PrerenderManager::Shutdown() {
|
| @@ -577,6 +586,14 @@
|
| }
|
|
|
| // At this point, we've determined that we will use the prerender.
|
| + content::RenderProcessHost* process_host =
|
| + prerender_data->contents()->GetRenderViewHost()->GetProcess();
|
| + prerender_process_hosts_.erase(process_host);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&PrerenderTracker::RemovePrerenderCookieStoreOnIOThread,
|
| + base::Unretained(prerender_tracker()), process_host->GetID(),
|
| + true));
|
| if (!prerender_data->contents()->load_start_time().is_null()) {
|
| histograms_->RecordTimeUntilUsed(
|
| prerender_data->contents()->origin(),
|
| @@ -748,7 +765,7 @@
|
| default:
|
| NOTREACHED() << "Invalid PrerenderManager mode.";
|
| break;
|
| - };
|
| + }
|
| return "";
|
| }
|
|
|
| @@ -1216,6 +1233,12 @@
|
| SortActivePrerenders();
|
| }
|
|
|
| +net::URLRequestContextGetter* PrerenderManager::GetURLRequestContext() {
|
| + return content::BrowserContext::GetDefaultStoragePartition(profile_)->
|
| + GetURLRequestContext();
|
| +}
|
| +
|
| +
|
| // private
|
| PrerenderHandle* PrerenderManager::AddPrerender(
|
| Origin origin,
|
| @@ -1280,6 +1303,13 @@
|
| return NULL;
|
| }
|
|
|
| + if (!cookie_store_loaded()) {
|
| + // Only prerender if the cookie store for this profile has been loaded.
|
| + // This is required by PrerenderCookieMonster.
|
| + RecordFinalStatus(origin, experiment, FINAL_STATUS_COOKIE_STORE_NOT_LOADED);
|
| + return NULL;
|
| + }
|
| +
|
| PrerenderContents* prerender_contents = CreatePrerenderContents(
|
| url, referrer, origin, experiment);
|
| DCHECK(prerender_contents);
|
| @@ -1304,11 +1334,16 @@
|
| gfx::Size contents_size =
|
| size.IsEmpty() ? config_.default_tab_bounds.size() : size;
|
|
|
| + net::URLRequestContextGetter* request_context = GetURLRequestContext();
|
| +
|
| prerender_contents->StartPrerendering(process_id, contents_size,
|
| - session_storage_namespace);
|
| + session_storage_namespace,
|
| + request_context);
|
|
|
| DCHECK(IsControlGroup(experiment) ||
|
| - prerender_contents->prerendering_has_started());
|
| + prerender_contents->prerendering_has_started() ||
|
| + (origin == ORIGIN_LOCAL_PREDICTOR &&
|
| + IsLocalPredictorPrerenderAlwaysControlEnabled()));
|
|
|
| if (GetMode() == PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP)
|
| histograms_->RecordConcurrency(active_prerenders_.size());
|
| @@ -1826,4 +1861,36 @@
|
| profile_network_bytes_ += bytes;
|
| }
|
|
|
| +void PrerenderManager::OnCookieStoreLoaded() {
|
| + cookie_store_loaded_ = true;
|
| + if (!on_cookie_store_loaded_cb_for_testing_.is_null())
|
| + on_cookie_store_loaded_cb_for_testing_.Run();
|
| +}
|
| +
|
| +void PrerenderManager::AddPrerenderProcessHost(
|
| + content::RenderProcessHost* process_host) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(prerender_process_hosts_.find(process_host) ==
|
| + prerender_process_hosts_.end());
|
| + prerender_process_hosts_.insert(process_host);
|
| + process_host->AddObserver(this);
|
| +}
|
| +
|
| +bool PrerenderManager::IsProcessPrerendering(
|
| + content::RenderProcessHost* process_host) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return (prerender_process_hosts_.find(process_host) !=
|
| + prerender_process_hosts_.end());
|
| +}
|
| +
|
| +void PrerenderManager::RenderProcessHostDestroyed(
|
| + content::RenderProcessHost* host) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + prerender_process_hosts_.erase(host);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&PrerenderTracker::RemovePrerenderCookieStoreOnIOThread,
|
| + base::Unretained(prerender_tracker()), host->GetID(), false));
|
| +}
|
| +
|
| } // namespace prerender
|
|
|