| 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..27793ee3c1d36f7ec00329a0347c2bef9d2b087d 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->OnCancel();
|
| + delete prerender_handle;
|
| + }
|
| }
|
|
|
| bool PrerenderLinkManager::OnAddPrerender(int child_id,
|
| @@ -44,20 +52,28 @@ bool PrerenderLinkManager::OnAddPrerender(int child_id,
|
| << ", size = (" << size.width() << ", " << size.height() << ")"
|
| << ", render_view_route_id = " << render_view_route_id;
|
|
|
| + const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
|
| + DCHECK_EQ(0U, ids_to_handle_map_.count(child_and_prerender_id));
|
| +
|
| // TODO(gavinp): Add tests to ensure fragments work, then remove this fragment
|
| // clearing code.
|
| url_canon::Replacements<char> replacements;
|
| replacements.ClearRef();
|
| const GURL url = orig_url.ReplaceComponents(replacements);
|
|
|
| - if (!manager_->AddPrerenderFromLinkRelPrerender(
|
| - child_id, render_view_route_id, url, referrer, size)) {
|
| - return false;
|
| + scoped_ptr<PrerenderHandle> prerender_handle(
|
| + manager_->AddPrerenderFromLinkRelPrerender(
|
| + child_id, render_view_route_id, url, referrer, size));
|
| + if (prerender_handle.get()) {
|
| + std::pair<IdPairToPrerenderHandleMap::iterator, bool> insert_result =
|
| + ids_to_handle_map_.insert(IdPairToPrerenderHandleMap::value_type(
|
| + child_and_prerender_id, NULL));
|
| + DCHECK(insert_result.second);
|
| + delete insert_result.first->second;
|
| + insert_result.first->second = prerender_handle.release();
|
| + 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 +85,28 @@ 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_to_handle_iter =
|
| + ids_to_handle_map_.find(child_and_prerender_id);
|
| + if (id_to_handle_iter == ids_to_handle_map_.end()) {
|
| DVLOG(5) << "... canceling a prerender that doesn't exist.";
|
| return;
|
| }
|
| - const GURL url = id_url_iter->second;
|
| - ids_to_url_map_.erase(id_url_iter);
|
| - manager_->MaybeCancelPrerender(url);
|
| + PrerenderHandle* prerender_handle = id_to_handle_iter->second;
|
| + prerender_handle->OnCancel();
|
| + RemovePrerender(id_to_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_to_handle_iter =
|
| + ids_to_handle_map_.find(child_and_prerender_id);
|
| + if (id_to_handle_iter == ids_to_handle_map_.end())
|
| + return;
|
| + PrerenderHandle* prerender_handle = id_to_handle_iter->second;
|
| + prerender_handle->OnNavigateAway();
|
| + RemovePrerender(id_to_handle_iter);
|
| }
|
|
|
| void PrerenderLinkManager::OnChannelClosing(int child_id) {
|
| @@ -96,9 +116,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,8 +131,14 @@ void PrerenderLinkManager::OnChannelClosing(int child_id) {
|
| }
|
|
|
| bool PrerenderLinkManager::IsEmpty() const {
|
| - return ids_to_url_map_.empty();
|
| + return ids_to_handle_map_.empty();
|
| }
|
|
|
| -} // namespace prerender
|
| +void PrerenderLinkManager::RemovePrerender(
|
| + const IdPairToPrerenderHandleMap::iterator& id_to_handle_iter) {
|
| + PrerenderHandle* prerender_handle = id_to_handle_iter->second;
|
| + delete prerender_handle;
|
| + ids_to_handle_map_.erase(id_to_handle_iter);
|
| +}
|
|
|
| +} // namespace prerender
|
|
|