diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-15 09:50:10 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-15 09:50:10 +0000 |
commit | f5b9c1b52f6e2f43215538a1c34ff363beaa4468 (patch) | |
tree | d7528ad0a80d0f852ba932a55e087918ebbdfb23 | |
parent | b71b8d04cf4a73cb3311671f7e76f2d28672d116 (diff) | |
download | chromium_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.cc | 29 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.h | 6 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_handle.cc | 9 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_handle.h | 7 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_link_manager.cc | 12 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_link_manager.h | 2 | ||||
-rw-r--r-- | chrome/common/prerender_messages.h | 7 | ||||
-rw-r--r-- | chrome/renderer/prerender/prerender_dispatcher.cc | 31 | ||||
-rw-r--r-- | chrome/renderer/prerender/prerender_dispatcher.h | 7 | ||||
-rw-r--r-- | chrome/renderer/prerender/prerender_dispatcher_unittest.cc | 52 |
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)); } |