Chromium Code Reviews| 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) { |