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

Side by Side Diff: chrome/renderer/prerender/prerender_dispatcher.cc

Issue 11459003: Add Start/Stop event signalling on Prerenders. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: match up to webkit side of patch... Created 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/prerender/prerender_dispatcher.h" 5 #include "chrome/renderer/prerender/prerender_dispatcher.h"
6 6
7 #include <stack> 7 #include <stack>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "chrome/common/prerender_messages.h" 10 #include "chrome/common/prerender_messages.h"
(...skipping 17 matching lines...) Expand all
28 28
29 PrerenderDispatcher::~PrerenderDispatcher() { 29 PrerenderDispatcher::~PrerenderDispatcher() {
30 WebPrerenderingSupport::shutdown(); 30 WebPrerenderingSupport::shutdown();
31 } 31 }
32 32
33 bool PrerenderDispatcher::IsPrerenderURL(const GURL& url) const { 33 bool PrerenderDispatcher::IsPrerenderURL(const GURL& url) const {
34 return running_prerender_urls_.count(url) >= 1; 34 return running_prerender_urls_.count(url) >= 1;
35 } 35 }
36 36
37 void PrerenderDispatcher::OnPrerenderStart(int prerender_id) { 37 void PrerenderDispatcher::OnPrerenderStart(int prerender_id) {
38 std::map<int, GURL>::iterator it = prerenders_.find(prerender_id); 38 std::map<int, WebPrerender>::iterator it = prerenders_.find(prerender_id);
39 if (it == prerenders_.end()) 39 if (it == prerenders_.end())
40 return; 40 return;
41 const GURL& url = it->second; 41
42 WebPrerender& prerender = it->second;
43
44 // The prerender should only be null in unit tests.
45 if (prerender.isNull())
46 return;
47
48 prerender.didStartPrerender();
42 running_prerender_urls_.insert( 49 running_prerender_urls_.insert(
43 std::multimap<GURL, int>::value_type(url, prerender_id)); 50 std::multimap<GURL, int>::value_type(prerender.url(), prerender_id));
44 } 51 }
45 52
46 void PrerenderDispatcher::OnPrerenderAddAlias(int prerender_id, 53 void PrerenderDispatcher::OnPrerenderAddAlias(int prerender_id,
47 const GURL& url) { 54 const GURL& url) {
48 DCHECK_LT(0u, prerenders_.count(prerender_id)); 55 DCHECK_LT(0u, prerenders_.count(prerender_id));
49 running_prerender_urls_.insert( 56 running_prerender_urls_.insert(
50 std::multimap<GURL, int>::value_type(url, prerender_id)); 57 std::multimap<GURL, int>::value_type(url, prerender_id));
51 } 58 }
52 59
53 void PrerenderDispatcher::OnPrerenderStop(int prerender_id) { 60 void PrerenderDispatcher::OnPrerenderStop(int prerender_id) {
54 // It's possible we will receive a spurious remove, so we don't crash in that 61 // It's possible we will receive a spurious remove, so we don't crash in that
55 // situation. 62 // situation.
56 if (prerenders_.count(prerender_id) == 0) 63 std::map<int, WebPrerender>::iterator it = prerenders_.find(prerender_id);
64 if (it == prerenders_.end())
57 return; 65 return;
66 WebPrerender& prerender = it->second;
67
68 // The prerender should only be null in unit tests.
69 if (!prerender.isNull())
70 prerender.didStopPrerender();
58 71
59 // TODO(cbentzel): We'd also want to send the map of active prerenders when 72 // TODO(cbentzel): We'd also want to send the map of active prerenders when
60 // creating a new render process, so the Add/Remove go relative to that. 73 // creating a new render process, so the Add/Remove go relative to that.
61 // This may not be that big of a deal in practice, since the newly created tab 74 // This may not be that big of a deal in practice, since the newly created tab
62 // is unlikely to go to the prerendered page. 75 // is unlikely to go to the prerendered page.
63 prerenders_.erase(prerender_id); 76 prerenders_.erase(it);
64 77
65 std::stack<std::multimap<GURL, int>::iterator> to_delete; 78 std::stack<std::multimap<GURL, int>::iterator> to_delete;
66 for (std::multimap<GURL, int>::iterator it = running_prerender_urls_.begin(); 79 for (std::multimap<GURL, int>::iterator it = running_prerender_urls_.begin();
67 it != running_prerender_urls_.end(); ++it) { 80 it != running_prerender_urls_.end(); ++it) {
68 if (it->second == prerender_id) 81 if (it->second == prerender_id)
69 to_delete.push(it); 82 to_delete.push(it);
70 } 83 }
71 while (!to_delete.empty()) { 84 while (!to_delete.empty()) {
72 running_prerender_urls_.erase(to_delete.top()); 85 running_prerender_urls_.erase(to_delete.top());
73 to_delete.pop(); 86 to_delete.pop();
74 } 87 }
75 } 88 }
76 89
77 bool PrerenderDispatcher::OnControlMessageReceived( 90 bool PrerenderDispatcher::OnControlMessageReceived(
78 const IPC::Message& message) { 91 const IPC::Message& message) {
79 bool handled = true; 92 bool handled = true;
80 IPC_BEGIN_MESSAGE_MAP(PrerenderDispatcher, message) 93 IPC_BEGIN_MESSAGE_MAP(PrerenderDispatcher, message)
81 IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderStart, OnPrerenderStart) 94 IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderStart, OnPrerenderStart)
82 IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderAddAlias, OnPrerenderAddAlias) 95 IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderAddAlias, OnPrerenderAddAlias)
83 IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderStop, OnPrerenderStop) 96 IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderStop, OnPrerenderStop)
84 IPC_MESSAGE_UNHANDLED(handled = false) 97 IPC_MESSAGE_UNHANDLED(handled = false)
85 IPC_END_MESSAGE_MAP() 98 IPC_END_MESSAGE_MAP()
86 99
87 return handled; 100 return handled;
88 } 101 }
89 102
90 void PrerenderDispatcher::add(const WebKit::WebPrerender& prerender) { 103 void PrerenderDispatcher::add(const WebPrerender& prerender) {
91 const PrerenderExtraData& extra_data = 104 const PrerenderExtraData& extra_data =
92 PrerenderExtraData::FromPrerender(prerender); 105 PrerenderExtraData::FromPrerender(prerender);
93 prerenders_.insert(std::map<int, GURL>::value_type(extra_data.prerender_id(), 106 prerenders_.insert(
94 prerender.url())); 107 std::map<int, WebPrerender>::value_type(extra_data.prerender_id(),
108 prerender));
mmenke 2012/12/07 17:11:48 It looks like we currently eternally accumulate pr
gavinp 2012/12/14 21:48:52 No, nothing. But the new uploads should clean that
95 109
96 content::RenderThread::Get()->Send(new PrerenderHostMsg_AddLinkRelPrerender( 110 content::RenderThread::Get()->Send(new PrerenderHostMsg_AddLinkRelPrerender(
97 extra_data.prerender_id(), GURL(prerender.url()), 111 extra_data.prerender_id(), GURL(prerender.url()),
98 content::Referrer(GURL(prerender.referrer()), prerender.referrerPolicy()), 112 content::Referrer(GURL(prerender.referrer()),
113 prerender.referrerPolicy()),
99 extra_data.size(), extra_data.render_view_route_id())); 114 extra_data.size(), extra_data.render_view_route_id()));
100 } 115 }
101 116
102 void PrerenderDispatcher::cancel(const WebKit::WebPrerender& prerender) { 117 void PrerenderDispatcher::cancel(const WebPrerender& prerender) {
103 const PrerenderExtraData& extra_data = 118 const PrerenderExtraData& extra_data =
104 PrerenderExtraData::FromPrerender(prerender); 119 PrerenderExtraData::FromPrerender(prerender);
105 content::RenderThread::Get()->Send( 120 content::RenderThread::Get()->Send(
106 new PrerenderHostMsg_CancelLinkRelPrerender(extra_data.prerender_id())); 121 new PrerenderHostMsg_CancelLinkRelPrerender(extra_data.prerender_id()));
107 } 122 }
108 123
109 void PrerenderDispatcher::abandon(const WebKit::WebPrerender& prerender) { 124 void PrerenderDispatcher::abandon(const WebPrerender& prerender) {
110 const PrerenderExtraData& extra_data = 125 const PrerenderExtraData& extra_data =
111 PrerenderExtraData::FromPrerender(prerender); 126 PrerenderExtraData::FromPrerender(prerender);
112 content::RenderThread::Get()->Send( 127 content::RenderThread::Get()->Send(
113 new PrerenderHostMsg_AbandonLinkRelPrerender(extra_data.prerender_id())); 128 new PrerenderHostMsg_AbandonLinkRelPrerender(extra_data.prerender_id()));
114 } 129 }
115 130
116 } // namespace prerender 131 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698