summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-15 09:50:10 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-15 09:50:10 +0000
commitf5b9c1b52f6e2f43215538a1c34ff363beaa4468 (patch)
treed7528ad0a80d0f852ba932a55e087918ebbdfb23
parentb71b8d04cf4a73cb3311671f7e76f2d28672d116 (diff)
downloadchromium_src-f5b9c1b52f6e2f43215538a1c34ff363beaa4468.zip
chromium_src-f5b9c1b52f6e2f43215538a1c34ff363beaa4468.tar.gz
chromium_src-f5b9c1b52f6e2f43215538a1c34ff363beaa4468.tar.bz2
Broadcast prerender URLs to all render processes.
Before this change, a render-initiated navigation could only swap to a prerender if the prerender was created via a <link rel="prerender"> element from a RenderView within the same render process. Now that we are experimenting with local-browsing based prerenders, this means that a lot of prerenders may never be used. The prerenders are created in the browser process, and need to be advertised to all render processes. There is a slight risk that an owned render process can spy on some navigations that a user does due to the broadcast. BUG=239180 Review URL: https://chromiumcodereview.appspot.com/15027009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@200223 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/prerender/prerender_contents.cc29
-rw-r--r--chrome/browser/prerender/prerender_contents.h6
-rw-r--r--chrome/browser/prerender/prerender_handle.cc9
-rw-r--r--chrome/browser/prerender/prerender_handle.h7
-rw-r--r--chrome/browser/prerender/prerender_link_manager.cc12
-rw-r--r--chrome/browser/prerender/prerender_link_manager.h2
-rw-r--r--chrome/common/prerender_messages.h7
-rw-r--r--chrome/renderer/prerender/prerender_dispatcher.cc31
-rw-r--r--chrome/renderer/prerender/prerender_dispatcher.h7
-rw-r--r--chrome/renderer/prerender/prerender_dispatcher_unittest.cc52
10 files changed, 89 insertions, 73 deletions
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 0302986..e8868ac 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -141,11 +141,6 @@ void PrerenderContents::Observer::OnPrerenderStopLoading(
PrerenderContents* contents) {
}
-void PrerenderContents::Observer::OnPrerenderAddAlias(
- PrerenderContents* contents,
- const GURL& alias_url) {
-}
-
void PrerenderContents::Observer::OnPrerenderCreatedMatchCompleteReplacement(
PrerenderContents* contents, PrerenderContents* replacement) {
}
@@ -370,6 +365,15 @@ PrerenderContents::~PrerenderContents() {
prerender_manager_->RecordFinalStatusWithMatchCompleteStatus(
origin(), experiment_id(), match_complete_status(), final_status());
+ // Broadcast the removal of aliases.
+ for (content::RenderProcessHost::iterator host_iterator =
+ content::RenderProcessHost::AllHostsIterator();
+ !host_iterator.IsAtEnd();
+ host_iterator.Advance()) {
+ content::RenderProcessHost* host = host_iterator.GetCurrentValue();
+ host->Send(new PrerenderMsg_OnPrerenderRemoveAliases(alias_urls_));
+ }
+
// If we still have a WebContents, clean up anything we need to and then
// destroy it.
if (prerender_contents_.get())
@@ -485,11 +489,6 @@ void PrerenderContents::NotifyPrerenderStop() {
observer_list_.Clear();
}
-void PrerenderContents::NotifyPrerenderAddAlias(const GURL& alias_url) {
- FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderAddAlias(this,
- alias_url));
-}
-
void PrerenderContents::NotifyPrerenderCreatedMatchCompleteReplacement(
PrerenderContents* replacement) {
FOR_EACH_OBSERVER(Observer, observer_list_,
@@ -531,7 +530,15 @@ bool PrerenderContents::AddAliasURL(const GURL& url) {
}
alias_urls_.push_back(url);
- NotifyPrerenderAddAlias(url);
+
+ for (content::RenderProcessHost::iterator host_iterator =
+ content::RenderProcessHost::AllHostsIterator();
+ !host_iterator.IsAtEnd();
+ host_iterator.Advance()) {
+ content::RenderProcessHost* host = host_iterator.GetCurrentValue();
+ host->Send(new PrerenderMsg_OnPrerenderAddAlias(url));
+ }
+
return true;
}
diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
index b7e8776..4b3422c 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/chrome/browser/prerender/prerender_contents.h
@@ -81,11 +81,6 @@ class PrerenderContents : public content::NotificationObserver,
// Signals that the prerender has stopped running.
virtual void OnPrerenderStop(PrerenderContents* contents) = 0;
- // Signals the discovery, through redirects, of a new alias for this
- // prerender.
- virtual void OnPrerenderAddAlias(PrerenderContents* contents,
- const GURL& alias_url);
-
// Signals that this prerender has just become a MatchComplete replacement.
virtual void OnPrerenderCreatedMatchCompleteReplacement(
PrerenderContents* contents, PrerenderContents* replacement);
@@ -298,7 +293,6 @@ class PrerenderContents : public content::NotificationObserver,
void NotifyPrerenderStart();
void NotifyPrerenderStopLoading();
void NotifyPrerenderStop();
- void NotifyPrerenderAddAlias(const GURL& alias_url);
void NotifyPrerenderCreatedMatchCompleteReplacement(
PrerenderContents* replacement);
diff --git a/chrome/browser/prerender/prerender_handle.cc b/chrome/browser/prerender/prerender_handle.cc
index b4ebcd8..877d202 100644
--- a/chrome/browser/prerender/prerender_handle.cc
+++ b/chrome/browser/prerender/prerender_handle.cc
@@ -115,15 +115,6 @@ void PrerenderHandle::OnPrerenderStop(PrerenderContents* prerender_contents) {
observer_->OnPrerenderStop(this);
}
-void PrerenderHandle::OnPrerenderAddAlias(PrerenderContents* prerender_contents,
- const GURL& alias_url) {
- DCHECK(CalledOnValidThread());
- DCHECK(prerender_data_);
- DCHECK_EQ(prerender_data_->contents(), prerender_contents);
- if (observer_)
- observer_->OnPrerenderAddAlias(this, alias_url);
-}
-
void PrerenderHandle::OnPrerenderCreatedMatchCompleteReplacement(
PrerenderContents* contents, PrerenderContents* replacement) {
DCHECK(CalledOnValidThread());
diff --git a/chrome/browser/prerender/prerender_handle.h b/chrome/browser/prerender/prerender_handle.h
index 67cae39..3e2e946 100644
--- a/chrome/browser/prerender/prerender_handle.h
+++ b/chrome/browser/prerender/prerender_handle.h
@@ -41,11 +41,6 @@ class PrerenderHandle : public base::NonThreadSafe,
// Signals that the prerender has stopped running.
virtual void OnPrerenderStop(PrerenderHandle* handle) = 0;
- // Signals the discovery, through redirects, of a new alias for this
- // prerender.
- virtual void OnPrerenderAddAlias(PrerenderHandle* handle,
- const GURL& alias_url) = 0;
-
protected:
Observer();
virtual ~Observer();
@@ -91,8 +86,6 @@ class PrerenderHandle : public base::NonThreadSafe,
virtual void OnPrerenderStopLoading(PrerenderContents* prerender_contents)
OVERRIDE;
virtual void OnPrerenderStop(PrerenderContents* prerender_contents) OVERRIDE;
- virtual void OnPrerenderAddAlias(PrerenderContents* prerender_contents,
- const GURL& alias_url) OVERRIDE;
virtual void OnPrerenderCreatedMatchCompleteReplacement(
PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE;
diff --git a/chrome/browser/prerender/prerender_link_manager.cc b/chrome/browser/prerender/prerender_link_manager.cc
index 8b099b9..14cdc6e 100644
--- a/chrome/browser/prerender/prerender_link_manager.cc
+++ b/chrome/browser/prerender/prerender_link_manager.cc
@@ -338,16 +338,4 @@ void PrerenderLinkManager::OnPrerenderStop(
StartPrerenders();
}
-void PrerenderLinkManager::OnPrerenderAddAlias(
- PrerenderHandle* prerender_handle,
- const GURL& alias_url) {
- LinkPrerender* prerender = FindByPrerenderHandle(prerender_handle);
- if (!prerender)
- return;
-
- Send(prerender->launcher_child_id,
- new PrerenderMsg_OnPrerenderAddAlias(prerender->prerender_id,
- alias_url));
-}
-
} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_link_manager.h b/chrome/browser/prerender/prerender_link_manager.h
index bb8ea07..97d0377 100644
--- a/chrome/browser/prerender/prerender_link_manager.h
+++ b/chrome/browser/prerender/prerender_link_manager.h
@@ -121,8 +121,6 @@ class PrerenderLinkManager : public ProfileKeyedService,
virtual void OnPrerenderStopLoading(PrerenderHandle* prerender_handle)
OVERRIDE;
virtual void OnPrerenderStop(PrerenderHandle* prerender_handle) OVERRIDE;
- virtual void OnPrerenderAddAlias(PrerenderHandle* prerender_handle,
- const GURL& alias_url) OVERRIDE;
bool has_shutdown_;
diff --git a/chrome/common/prerender_messages.h b/chrome/common/prerender_messages.h
index 83dae32..d35ec68 100644
--- a/chrome/common/prerender_messages.h
+++ b/chrome/common/prerender_messages.h
@@ -54,10 +54,13 @@ IPC_MESSAGE_CONTROL1(PrerenderMsg_OnPrerenderStopLoading,
int /* prerender_id */)
// Signals to a launcher that a new alias has been added to a prerender.
-IPC_MESSAGE_CONTROL2(PrerenderMsg_OnPrerenderAddAlias,
- int /* prerender_id */,
+IPC_MESSAGE_CONTROL1(PrerenderMsg_OnPrerenderAddAlias,
GURL /* url */)
+// Signals to a launcher that a new alias has been added to a prerender.
+IPC_MESSAGE_CONTROL1(PrerenderMsg_OnPrerenderRemoveAliases,
+ std::vector<GURL> /* urls */)
+
// Signals to a launcher that a prerender is no longer running.
IPC_MESSAGE_CONTROL1(PrerenderMsg_OnPrerenderStop,
int /* prerender_id */)
diff --git a/chrome/renderer/prerender/prerender_dispatcher.cc b/chrome/renderer/prerender/prerender_dispatcher.cc
index 7739fb5..c5d5c851 100644
--- a/chrome/renderer/prerender/prerender_dispatcher.cc
+++ b/chrome/renderer/prerender/prerender_dispatcher.cc
@@ -43,7 +43,6 @@ void PrerenderDispatcher::OnPrerenderStart(int prerender_id) {
return;
prerender.didStartPrerender();
- OnPrerenderAddAlias(prerender_id, prerender.url());
}
void PrerenderDispatcher::OnPrerenderStopLoading(int prerender_id) {
@@ -58,11 +57,18 @@ void PrerenderDispatcher::OnPrerenderStopLoading(int prerender_id) {
prerender.didSendLoadForPrerender();
}
-void PrerenderDispatcher::OnPrerenderAddAlias(int prerender_id,
- const GURL& url) {
- DCHECK_NE(0u, prerenders_.count(prerender_id));
- running_prerender_urls_.insert(
- std::multimap<GURL, int>::value_type(url, prerender_id));
+void PrerenderDispatcher::OnPrerenderAddAlias(const GURL& alias) {
+ running_prerender_urls_.insert(alias);
+}
+
+void PrerenderDispatcher::OnPrerenderRemoveAliases(
+ const std::vector<GURL>& aliases) {
+ for (size_t i = 0; i < aliases.size(); ++i) {
+ std::multiset<GURL>::iterator it = running_prerender_urls_.find(aliases[i]);
+ if (it != running_prerender_urls_.end()) {
+ running_prerender_urls_.erase(it);
+ }
+ }
}
void PrerenderDispatcher::OnPrerenderStop(int prerender_id) {
@@ -78,17 +84,6 @@ void PrerenderDispatcher::OnPrerenderStop(int prerender_id) {
// This may not be that big of a deal in practice, since the newly created tab
// is unlikely to go to the prerendered page.
prerenders_.erase(prerender_id);
-
- std::multimap<GURL, int>::iterator it = running_prerender_urls_.begin();
- while (it != running_prerender_urls_.end()) {
- std::multimap<GURL, int>::iterator next = it;
- ++next;
-
- if (it->second == prerender_id)
- running_prerender_urls_.erase(it);
-
- it = next;
- }
}
bool PrerenderDispatcher::OnControlMessageReceived(
@@ -99,6 +94,8 @@ bool PrerenderDispatcher::OnControlMessageReceived(
IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderStopLoading,
OnPrerenderStopLoading)
IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderAddAlias, OnPrerenderAddAlias)
+ IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderRemoveAliases,
+ OnPrerenderRemoveAliases)
IPC_MESSAGE_HANDLER(PrerenderMsg_OnPrerenderStop, OnPrerenderStop)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
diff --git a/chrome/renderer/prerender/prerender_dispatcher.h b/chrome/renderer/prerender/prerender_dispatcher.h
index fa011c3..88544a1 100644
--- a/chrome/renderer/prerender/prerender_dispatcher.h
+++ b/chrome/renderer/prerender/prerender_dispatcher.h
@@ -6,6 +6,8 @@
#define CHROME_RENDERER_PRERENDER_PRERENDER_DISPATCHER_H_
#include <map>
+#include <set>
+#include <vector>
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
@@ -35,7 +37,8 @@ class PrerenderDispatcher : public content::RenderProcessObserver,
// Message handlers for messages from the browser process.
void OnPrerenderStart(int prerender_id);
void OnPrerenderStopLoading(int prerender_id);
- void OnPrerenderAddAlias(int prerender_id, const GURL& url);
+ void OnPrerenderAddAlias(const GURL& alias);
+ void OnPrerenderRemoveAliases(const std::vector<GURL>& aliases);
void OnPrerenderStop(int prerender_id);
// From RenderProcessObserver:
@@ -51,7 +54,7 @@ class PrerenderDispatcher : public content::RenderProcessObserver,
// From the browser process, which prerenders are running, indexed by URL.
// Updated by the browser processes as aliases are discovered.
- std::multimap<GURL, int> running_prerender_urls_;
+ std::multiset<GURL> running_prerender_urls_;
};
} // namespace prerender
diff --git a/chrome/renderer/prerender/prerender_dispatcher_unittest.cc b/chrome/renderer/prerender/prerender_dispatcher_unittest.cc
index e46cc94..0f6ca14 100644
--- a/chrome/renderer/prerender/prerender_dispatcher_unittest.cc
+++ b/chrome/renderer/prerender/prerender_dispatcher_unittest.cc
@@ -45,12 +45,18 @@ class PrerenderDispatcherTest : public testing::Test {
prerender_dispatcher_.prerenders_[g_next_prerender_id] = WebPrerender();
prerender_dispatcher_.OnPrerenderStart(g_next_prerender_id);
- prerender_dispatcher_.OnPrerenderAddAlias(g_next_prerender_id, url);
+ prerender_dispatcher_.OnPrerenderAddAlias(url);
return g_next_prerender_id++;
}
- void AddAliasToPrerender(int prerender_id, const GURL& url) {
- prerender_dispatcher_.OnPrerenderAddAlias(prerender_id, url);
+ void AddAliasToPrerender(const GURL& url) {
+ prerender_dispatcher_.OnPrerenderAddAlias(url);
+ }
+
+ void RemoveAliasFromPrerender(const GURL& url) {
+ std::vector<GURL> urls;
+ urls.push_back(url);
+ prerender_dispatcher_.OnPrerenderRemoveAliases(urls);
}
void StopPrerender(int prerender_id) {
@@ -84,11 +90,11 @@ TEST_F(PrerenderDispatcherTest, PrerenderDispatcherMultipleAdd) {
EXPECT_FALSE(IsPrerenderURL(foo_url));
EXPECT_FALSE(IsPrerenderURL(bar_url));
- int foo_id = StartPrerender(foo_url);
+ StartPrerender(foo_url);
EXPECT_TRUE(IsPrerenderURL(foo_url));
EXPECT_FALSE(IsPrerenderURL(bar_url));
- AddAliasToPrerender(foo_id, foo_url);
+ AddAliasToPrerender(foo_url);
EXPECT_TRUE(IsPrerenderURL(foo_url));
EXPECT_FALSE(IsPrerenderURL(bar_url));
EXPECT_EQ(2, GetCountForURL(foo_url));
@@ -106,6 +112,42 @@ TEST_F(PrerenderDispatcherTest, PrerenderDispatcherSingleRemove) {
int foo_id = StartPrerender(foo_url);
EXPECT_TRUE(IsPrerenderURL(foo_url));
StopPrerender(foo_id);
+ EXPECT_TRUE(IsPrerenderURL(foo_url));
+ EXPECT_EQ(1, GetCountForURL(foo_url));
+ RemoveAliasFromPrerender(foo_url);
+ EXPECT_FALSE(IsPrerenderURL(foo_url));
+ EXPECT_EQ(0, GetCountForURL(foo_url));
+}
+
+TEST_F(PrerenderDispatcherTest, PrerenderDispatcherTooManyRemoves) {
+ GURL foo_url = GURL("http://foo.com");
+ EXPECT_FALSE(IsPrerenderURL(foo_url));
+ int foo_id = StartPrerender(foo_url);
+ EXPECT_TRUE(IsPrerenderURL(foo_url));
+ StopPrerender(foo_id);
+ EXPECT_TRUE(IsPrerenderURL(foo_url));
+ EXPECT_EQ(1, GetCountForURL(foo_url));
+ RemoveAliasFromPrerender(foo_url);
+ EXPECT_FALSE(IsPrerenderURL(foo_url));
+ EXPECT_EQ(0, GetCountForURL(foo_url));
+ RemoveAliasFromPrerender(foo_url);
+ EXPECT_FALSE(IsPrerenderURL(foo_url));
+ EXPECT_EQ(0, GetCountForURL(foo_url));
+}
+
+TEST_F(PrerenderDispatcherTest, PrerenderDispatcherMultipleRemoves) {
+ GURL foo_url = GURL("http://foo.com");
+ EXPECT_FALSE(IsPrerenderURL(foo_url));
+ int foo_id = StartPrerender(foo_url);
+ EXPECT_TRUE(IsPrerenderURL(foo_url));
+ AddAliasToPrerender(foo_url);
+ StopPrerender(foo_id);
+ EXPECT_TRUE(IsPrerenderURL(foo_url));
+ EXPECT_EQ(2, GetCountForURL(foo_url));
+ RemoveAliasFromPrerender(foo_url);
+ EXPECT_TRUE(IsPrerenderURL(foo_url));
+ EXPECT_EQ(1, GetCountForURL(foo_url));
+ RemoveAliasFromPrerender(foo_url);
EXPECT_FALSE(IsPrerenderURL(foo_url));
EXPECT_EQ(0, GetCountForURL(foo_url));
}