Chromium Code Reviews| 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..76f6c19354c6384ecfa50650bdb7ac92c7db0823 100644 |
| --- a/chrome/browser/prerender/prerender_link_manager.cc |
| +++ b/chrome/browser/prerender/prerender_link_manager.cc |
| @@ -8,7 +8,9 @@ |
| #include <queue> |
| #include <utility> |
| +#include "base/basictypes.h" |
|
gavinp
2012/07/14 22:12:30
Whoops. I'll fix this shortly.
|
| #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 +31,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 +53,29 @@ 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()) { |
| + PrerenderHandle* null = NULL; |
| + std::pair<IdPairToPrerenderHandleMap::iterator, bool> insert_result = |
| + ids_to_handle_map_.insert(IdPairToPrerenderHandleMap::value_type( |
| + child_and_prerender_id, null)); |
|
gavinp
2012/07/14 21:15:33
The windows try bots were OK with this, but someth
Peter Kasting
2012/07/14 21:53:34
Did you try std::make_pair?
gavinp
2012/07/14 22:12:30
Yes, with that it won't compile in clang or gcc. I
Peter Kasting
2012/07/15 00:50:15
That seems slightly better to me. We have to stat
|
| + 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 +87,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 +118,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 +133,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 |