Index: chrome/browser/prerender/prerender_manager.cc |
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
index f3d3e245b29da9dcfa6f700af950a025492f4dcf..670c2e80a5768e60a0038eea8521eb76ff2efe7f 100644 |
--- a/chrome/browser/prerender/prerender_manager.cc |
+++ b/chrome/browser/prerender/prerender_manager.cc |
@@ -92,12 +92,6 @@ const char* const kValidHttpMethods[] = { |
// Length of prerender history, for display in chrome://net-internals |
const int kHistoryLength = 100; |
-// Timeout, in ms, for a session storage namespace merge. |
-const int kSessionStorageNamespaceMergeTimeoutMs = 500; |
- |
-// If true, all session storage merges hang indefinitely. |
-bool g_hang_session_storage_merges_for_testing = false; |
- |
// Indicates whether a Prerender has been cancelled such that we need |
// a dummy replacement for the purpose of recording the correct PPLT for |
// the Match Complete case. |
@@ -424,60 +418,10 @@ bool PrerenderManager::MaybeUsePrerenderedPage(const GURL& url, |
PrerenderData* prerender_data = FindPrerenderData( |
url, |
web_contents->GetController().GetDefaultSessionStorageNamespace()); |
- |
- // If this failed, we may still find a prerender for the same URL, but a |
- // different session storage namespace. If we do, we might have to perform |
- // a merge. |
- if (!prerender_data) { |
- prerender_data = FindPrerenderData(url, NULL); |
- } else { |
- RecordEvent(prerender_data->contents(), |
- PRERENDER_EVENT_SWAPIN_CANDIDATE_NAMESPACE_MATCHES); |
- } |
- |
if (!prerender_data) |
return false; |
- RecordEvent(prerender_data->contents(), PRERENDER_EVENT_SWAPIN_CANDIDATE); |
- DCHECK(prerender_data->contents()); |
- |
- // If there is currently a merge pending for this prerender data, don't swap. |
- if (prerender_data->pending_swap()) |
- return false; |
- |
- // Abort any existing pending swap on the target contents. |
- PrerenderData* pending_swap = |
- FindPrerenderDataForTargetContents(web_contents); |
- if (pending_swap) { |
- pending_swap->ClearPendingSwap(); |
- DCHECK(FindPrerenderDataForTargetContents(web_contents) == NULL); |
- } |
- RecordEvent(prerender_data->contents(), |
- PRERENDER_EVENT_SWAPIN_NO_MERGE_PENDING); |
- SessionStorageNamespace* target_namespace = |
- web_contents->GetController().GetDefaultSessionStorageNamespace(); |
- SessionStorageNamespace* prerender_namespace = |
- prerender_data->contents()->GetSessionStorageNamespace(); |
- // Only when actually prerendering is session storage namespace merging an |
- // issue. For the control group, it will be assumed that the merge succeeded. |
- if (prerender_namespace && prerender_namespace != target_namespace && |
- !prerender_namespace->IsAliasOf(target_namespace)) { |
- if (!ShouldMergeSessionStorageNamespaces()) { |
- RecordEvent(prerender_data->contents(), |
- PRERENDER_EVENT_SWAPIN_MERGING_DISABLED); |
- return false; |
- } |
- RecordEvent(prerender_data->contents(), |
- PRERENDER_EVENT_SWAPIN_ISSUING_MERGE); |
- prerender_data->set_pending_swap(new PendingSwap( |
- this, web_contents, prerender_data, url, |
- params->should_replace_current_entry)); |
- prerender_data->pending_swap()->BeginSwap(); |
- // Although this returns false, creating a PendingSwap registers with |
- // PrerenderTracker to throttle MAIN_FRAME navigations while the swap is |
- // pending. |
- return false; |
- } |
+ DCHECK(prerender_data->contents()); |
// No need to merge; swap synchronously. |
mmenke
2014/12/12 16:04:48
Merge? What's that? :)
davidben
2014/12/12 20:41:19
Done.
|
WebContents* new_web_contents = SwapInternal( |
@@ -503,7 +447,6 @@ WebContents* PrerenderManager::SwapInternal( |
// out of it. For a normal WebContents, this is if it is in a TabStripModel. |
CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(web_contents); |
if (!core_tab_helper || !core_tab_helper->delegate()) { |
- RecordEvent(prerender_data->contents(), PRERENDER_EVENT_SWAPIN_NO_DELEGATE); |
return NULL; |
} |
mmenke
2014/12/12 16:04:48
nit: Remove braces
davidben
2014/12/12 20:41:19
Done.
|
@@ -616,8 +559,6 @@ WebContents* PrerenderManager::SwapInternal( |
++prerenders_per_session_count_); |
histograms_->RecordUsedPrerender(prerender_data->contents()->origin()); |
- if (prerender_data->pending_swap()) |
- prerender_data->pending_swap()->set_swap_successful(true); |
ScopedVector<PrerenderData>::iterator to_erase = |
FindIteratorForPrerenderContents(prerender_data->contents()); |
DCHECK(active_prerenders_.end() != to_erase); |
@@ -700,7 +641,6 @@ void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry, |
(*it)->MakeIntoMatchCompleteReplacement(); |
} else { |
to_delete_prerenders_.push_back(*it); |
- (*it)->ClearPendingSwap(); |
active_prerenders_.weak_erase(it); |
} |
@@ -1028,192 +968,10 @@ void PrerenderManager::PrerenderData::OnHandleCanceled( |
} |
} |
-void PrerenderManager::PrerenderData::ClearPendingSwap() { |
- pending_swap_.reset(NULL); |
-} |
- |
PrerenderContents* PrerenderManager::PrerenderData::ReleaseContents() { |
return contents_.release(); |
} |
-PrerenderManager::PendingSwap::PendingSwap( |
- PrerenderManager* manager, |
- content::WebContents* target_contents, |
- PrerenderData* prerender_data, |
- const GURL& url, |
- bool should_replace_current_entry) |
- : content::WebContentsObserver(target_contents), |
- manager_(manager), |
- prerender_data_(prerender_data), |
- url_(url), |
- should_replace_current_entry_(should_replace_current_entry), |
- start_time_(base::TimeTicks::Now()), |
- seen_target_route_id_(false), |
- swap_successful_(false), |
- weak_factory_(this) { |
-} |
- |
-PrerenderManager::PendingSwap::~PendingSwap() { |
- manager_->prerender_tracker()->RemovePrerenderPendingSwap( |
- target_route_id_, swap_successful_); |
-} |
- |
-void PrerenderManager::PendingSwap::BeginSwap() { |
- if (g_hang_session_storage_merges_for_testing) |
- return; |
- |
- SessionStorageNamespace* target_namespace = |
- web_contents()->GetController().GetDefaultSessionStorageNamespace(); |
- SessionStorageNamespace* prerender_namespace = |
- prerender_data_->contents()->GetSessionStorageNamespace(); |
- |
- prerender_namespace->Merge( |
- true, prerender_data_->contents()->child_id(), |
- target_namespace, |
- base::Bind(&PrerenderManager::PendingSwap::OnMergeCompleted, |
- weak_factory_.GetWeakPtr())); |
- |
- merge_timeout_.Start( |
- FROM_HERE, |
- base::TimeDelta::FromMilliseconds( |
- kSessionStorageNamespaceMergeTimeoutMs), |
- this, &PrerenderManager::PendingSwap::OnMergeTimeout); |
-} |
- |
-void PrerenderManager::PendingSwap::AboutToNavigateRenderFrame( |
- RenderFrameHost* render_frame_host) { |
- // TODO(davidben): Update prerendering for --site-per-process. |
- if (render_frame_host->GetParent()) |
- return; |
- |
- if (seen_target_route_id_) { |
- // A second navigation began browser-side. |
- prerender_data_->ClearPendingSwap(); |
- return; |
- } |
- |
- seen_target_route_id_ = true; |
- target_route_id_ = PrerenderTracker::ChildRouteIdPair( |
- render_frame_host->GetProcess()->GetID(), |
- render_frame_host->GetRoutingID()); |
- manager_->prerender_tracker()->AddPrerenderPendingSwap( |
- target_route_id_, url_); |
-} |
- |
-void PrerenderManager::PendingSwap::DidStartProvisionalLoadForFrame( |
- content::RenderFrameHost* render_frame_host, |
- const GURL& validated_url, |
- bool is_error_page, |
- bool is_iframe_srcdoc) { |
- if (render_frame_host->GetParent()) |
- return; |
- |
- // We must only cancel the pending swap if the url navigated to is not |
- // the URL being attempted to be swapped in. That's because in the normal |
- // flow, a ProvisionalChangeToMainFrameUrl will happen for the URL attempted |
- // to be swapped in immediately after the pending swap has issued its merge. |
- if (validated_url != url_) |
- prerender_data_->ClearPendingSwap(); |
-} |
- |
-void PrerenderManager::PendingSwap::DidCommitProvisionalLoadForFrame( |
- content::RenderFrameHost* render_frame_host, |
- const GURL& validated_url, |
- ui::PageTransition transition_type) { |
- if (render_frame_host->GetParent()) |
- return; |
- prerender_data_->ClearPendingSwap(); |
-} |
- |
-void PrerenderManager::PendingSwap::DidFailProvisionalLoad( |
- content::RenderFrameHost* render_frame_host, |
- const GURL& validated_url, |
- int error_code, |
- const base::string16& error_description) { |
- if (render_frame_host->GetParent()) |
- return; |
- prerender_data_->ClearPendingSwap(); |
-} |
- |
-void PrerenderManager::PendingSwap::WebContentsDestroyed() { |
- prerender_data_->ClearPendingSwap(); |
-} |
- |
-void PrerenderManager::PendingSwap::RecordEvent(PrerenderEvent event) const { |
- manager_->RecordEvent(prerender_data_->contents(), event); |
-} |
- |
-void PrerenderManager::PendingSwap::OnMergeCompleted( |
- SessionStorageNamespace::MergeResult result) { |
- UMA_HISTOGRAM_TIMES("Prerender.SessionStorageNamespaceMergeTime", |
- base::TimeTicks::Now() - start_time_); |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_MERGE_DONE); |
- |
- // Log the exact merge result in a histogram. |
- switch (result) { |
- case SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_FOUND: |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NAMESPACE_NOT_FOUND); |
- break; |
- case SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_ALIAS: |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NAMESPACE_NOT_ALIAS); |
- break; |
- case SessionStorageNamespace::MERGE_RESULT_NOT_LOGGING: |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NOT_LOGGING); |
- break; |
- case SessionStorageNamespace::MERGE_RESULT_NO_TRANSACTIONS: |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NO_TRANSACTIONS); |
- break; |
- case SessionStorageNamespace::MERGE_RESULT_TOO_MANY_TRANSACTIONS: |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_TOO_MANY_TRANSACTIONS); |
- break; |
- case SessionStorageNamespace::MERGE_RESULT_NOT_MERGEABLE: |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_NOT_MERGEABLE); |
- break; |
- case SessionStorageNamespace::MERGE_RESULT_MERGEABLE: |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_RESULT_MERGEABLE); |
- break; |
- default: |
- NOTREACHED(); |
- } |
- |
- if (result != SessionStorageNamespace::MERGE_RESULT_MERGEABLE && |
- result != SessionStorageNamespace::MERGE_RESULT_NO_TRANSACTIONS) { |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_MERGE_FAILED); |
- prerender_data_->ClearPendingSwap(); |
- return; |
- } |
- |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_SWAPPING_IN); |
- |
- // Note that SwapInternal will, on success, delete |prerender_data_| and |
- // |this|. It will also delete |this| in some failure cases. Pass in a new |
- // GURL object rather than a reference to |url_|. Also hold on to |manager_| |
- // and |prerender_data_|. |
- // |
- // TODO(davidben): Can we make this less fragile? |
- PrerenderManager* manager = manager_; |
- PrerenderData* prerender_data = prerender_data_; |
- WebContents* new_web_contents = |
- manager_->SwapInternal(GURL(url_), |
- web_contents(), |
- prerender_data_, |
- should_replace_current_entry_); |
- if (!new_web_contents) { |
- manager->RecordEvent(prerender_data->contents(), |
- PRERENDER_EVENT_MERGE_RESULT_SWAPIN_FAILED); |
- // Depending on whether SwapInternal called Destroy() or simply failed to |
- // swap, |this| may or may not be deleted. Either way, if the swap failed, |
- // |prerender_data| is deleted asynchronously, so this call is a no-op if |
- // |this| is already gone. |
- prerender_data->ClearPendingSwap(); |
- } |
-} |
- |
-void PrerenderManager::PendingSwap::OnMergeTimeout() { |
- RecordEvent(PRERENDER_EVENT_MERGE_RESULT_TIMED_OUT); |
- prerender_data_->ClearPendingSwap(); |
-} |
- |
void PrerenderManager::SetPrerenderContentsFactory( |
PrerenderContents::Factory* prerender_contents_factory) { |
DCHECK(CalledOnValidThread()); |
@@ -1492,18 +1250,6 @@ PrerenderManager::PrerenderData* PrerenderManager::FindPrerenderData( |
return NULL; |
} |
-PrerenderManager::PrerenderData* |
-PrerenderManager::FindPrerenderDataForTargetContents( |
- WebContents* target_contents) { |
- for (ScopedVector<PrerenderData>::iterator it = active_prerenders_.begin(); |
- it != active_prerenders_.end(); ++it) { |
- if ((*it)->pending_swap() && |
- (*it)->pending_swap()->web_contents() == target_contents) |
- return *it; |
- } |
- return NULL; |
-} |
- |
ScopedVector<PrerenderManager::PrerenderData>::iterator |
PrerenderManager::FindIteratorForPrerenderContents( |
PrerenderContents* prerender_contents) { |
@@ -1760,15 +1506,6 @@ void PrerenderManager::LoggedInPredictorDataReceived( |
logged_in_state_.swap(new_map); |
} |
-void PrerenderManager::RecordEvent(PrerenderContents* contents, |
- PrerenderEvent event) const { |
- if (!contents) |
- histograms_->RecordEvent(ORIGIN_NONE, kNoExperiment, event); |
- else |
- histograms_->RecordEvent(contents->origin(), contents->experiment_id(), |
- event); |
-} |
- |
// static |
void PrerenderManager::RecordCookieEvent(int process_id, |
int frame_id, |
@@ -1836,11 +1573,6 @@ void PrerenderManager::OnHistoryServiceDidQueryURL( |
histograms_->RecordPrerenderPageVisitedStatus(origin, experiment_id, success); |
} |
-// static |
-void PrerenderManager::HangSessionStorageMergesForTesting() { |
- g_hang_session_storage_merges_for_testing = true; |
-} |
- |
void PrerenderManager::RecordNetworkBytes(Origin origin, |
bool used, |
int64 prerender_bytes) { |