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

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

Issue 757723002: [Tests not passing yet] Remove prerender sessionStorage namespace merging. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years 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_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.
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;
}
@@ -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) {
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/browser/prerender/prerender_pending_swap_throttle.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698