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

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

Issue 10553029: Handle interface to prerenders. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: some remediation, and deflaking browser tests. Created 8 years, 5 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_link_manager.cc
diff --git a/chrome/browser/prerender/prerender_link_manager.cc b/chrome/browser/prerender/prerender_link_manager.cc
index c12e6cce61b5123ad9fa5e93e3cbfcb75c6b9b3b..53bc98ebee8b80bba13bb303f3b2e26da6af0530 100644
--- a/chrome/browser/prerender/prerender_link_manager.cc
+++ b/chrome/browser/prerender/prerender_link_manager.cc
@@ -9,6 +9,7 @@
#include <utility>
#include "chrome/browser/prerender/prerender_contents.h"
+#include "chrome/browser/prerender/prerender_handle.h"
#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/prerender/prerender_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
@@ -29,6 +30,13 @@ PrerenderLinkManager::PrerenderLinkManager(PrerenderManager* manager)
}
PrerenderLinkManager::~PrerenderLinkManager() {
+ for (IdPairToPrerenderHandleMap::iterator it = ids_to_handle_map_.begin();
+ it != ids_to_handle_map_.end();
+ ++it) {
+ PrerenderHandle* prerender_handle = it->second;
+ prerender_handle->OnNavigateAway();
+ delete prerender_handle;
+ }
}
bool PrerenderLinkManager::OnAddPrerender(int child_id,
@@ -50,14 +58,16 @@ bool PrerenderLinkManager::OnAddPrerender(int child_id,
replacements.ClearRef();
const GURL url = orig_url.ReplaceComponents(replacements);
- if (!manager_->AddPrerenderFromLinkRelPrerender(
- child_id, render_view_route_id, url, referrer, size)) {
- return false;
+ if (PrerenderHandle* prerender_handle =
+ manager_->AddPrerenderFromLinkRelPrerender(
+ child_id, render_view_route_id, url, referrer, size)) {
+ ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
+ DCHECK_EQ(0U, ids_to_handle_map_.count(child_and_prerender_id));
mmenke 2012/07/09 18:06:57 Suggest putting this DCHECK at the top of the func
gavinp 2012/07/11 17:04:00 Done.
+ ids_to_handle_map_.insert(
+ std::make_pair(child_and_prerender_id, prerender_handle));
+ return true;
}
- const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
- DCHECK_EQ(0U, ids_to_url_map_.count(child_and_prerender_id));
- ids_to_url_map_.insert(std::make_pair(child_and_prerender_id, url));
- return true;
+ return false;
}
// TODO(gavinp): Once an observer interface is provided down to the WebKit
@@ -69,24 +79,30 @@ void PrerenderLinkManager::OnCancelPrerender(int child_id, int prerender_id) {
DVLOG(2) << "OnCancelPrerender, child_id = " << child_id
<< ", prerender_id = " << prerender_id;
const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
- IdPairToUrlMap::iterator id_url_iter =
- ids_to_url_map_.find(child_and_prerender_id);
- if (id_url_iter == ids_to_url_map_.end()) {
+ IdPairToPrerenderHandleMap::iterator id_handle_iter =
mmenke 2012/07/09 18:06:57 nit: Suggest id_to_handle_iter, just to be more c
gavinp 2012/07/11 17:04:00 Done.
+ ids_to_handle_map_.find(child_and_prerender_id);
+ if (id_handle_iter == ids_to_handle_map_.end()) {
DVLOG(5) << "... canceling a prerender that doesn't exist.";
return;
}
mmenke 2012/07/09 18:06:57 Might want to put the below 4 lines into a functio
gavinp 2012/07/11 17:04:00 Done.
- const GURL url = id_url_iter->second;
- ids_to_url_map_.erase(id_url_iter);
- manager_->MaybeCancelPrerender(url);
+ PrerenderHandle* prerender_handle = id_handle_iter->second;
+ DCHECK(prerender_handle);
+ delete prerender_handle;
+ ids_to_handle_map_.erase(id_handle_iter);
}
void PrerenderLinkManager::OnAbandonPrerender(int child_id, int prerender_id) {
DVLOG(2) << "OnAbandonPrerender, child_id = " << child_id
<< ", prerender_id = " << prerender_id;
- // TODO(gavinp,cbentzel): Implement reasonable behaviour for
- // navigation away from launcher.
const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
- ids_to_url_map_.erase(child_and_prerender_id);
+ IdPairToPrerenderHandleMap::iterator id_handle_iter =
+ ids_to_handle_map_.find(child_and_prerender_id);
+ if (id_handle_iter == ids_to_handle_map_.end())
+ return;
+ PrerenderHandle* prerender_handle = id_handle_iter->second;
+ prerender_handle->OnNavigateAway();
+ delete prerender_handle;
+ ids_to_handle_map_.erase(id_handle_iter);
}
void PrerenderLinkManager::OnChannelClosing(int child_id) {
@@ -96,9 +112,9 @@ void PrerenderLinkManager::OnChannelClosing(int child_id) {
const ChildAndPrerenderIdPair child_and_maximum_prerender_id(
child_id, std::numeric_limits<int>::max());
std::queue<int> prerender_ids_to_abandon;
- for (IdPairToUrlMap::iterator
- i = ids_to_url_map_.lower_bound(child_and_minimum_prerender_id),
- e = ids_to_url_map_.upper_bound(child_and_maximum_prerender_id);
+ for (IdPairToPrerenderHandleMap::iterator
+ i = ids_to_handle_map_.lower_bound(child_and_minimum_prerender_id),
+ e = ids_to_handle_map_.upper_bound(child_and_maximum_prerender_id);
i != e; ++i) {
prerender_ids_to_abandon.push(i->first.second);
}
@@ -111,7 +127,7 @@ void PrerenderLinkManager::OnChannelClosing(int child_id) {
}
bool PrerenderLinkManager::IsEmpty() const {
- return ids_to_url_map_.empty();
+ return ids_to_handle_map_.empty();
}
} // namespace prerender

Powered by Google App Engine
This is Rietveld 408576698