summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/prerender
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-09 14:06:50 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-09 14:06:50 +0000
commita0358d77904f3c4959f0411a53448e5944019689 (patch)
tree95336b076c8820c040853fdbece0456394f9e328 /chrome/renderer/prerender
parent874a8fc3c78909bf1db133e26ca38ed948b235ff (diff)
downloadchromium_src-a0358d77904f3c4959f0411a53448e5944019689.zip
chromium_src-a0358d77904f3c4959f0411a53448e5944019689.tar.gz
chromium_src-a0358d77904f3c4959f0411a53448e5944019689.tar.bz2
Prerendered pages are swapped in at browser::Navigate time.
They used to get swapped in by observing provisional loads. This is being changed to Navigate so renderer-issued navigations into a prerender can be handled with the same mechanism that is used to handle renderer-issued navigations which need to cross process boundaries, such as clicking into a hosted app. For browser issued navigations, this means that we will immediately swap in the prerender, instead of sending a Navigate message to the render view and swapping in on the provisional load statement. For renderer issued navigations, decidePolicyForNavigation will ultimately cancel the navigation in the renderer and send an OpenURL up to the browser process. In order to make the renderer know that a navigation could be prerendered, a set of prerendered URLs need to be sent to a render process. BUG=104493 TEST=Existing browser tests, manual tests that omnibox prerenders work. There should be no user-visible changes. Review URL: http://codereview.chromium.org/9623018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125836 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/prerender')
-rw-r--r--chrome/renderer/prerender/prerender_dispatcher.cc60
-rw-r--r--chrome/renderer/prerender/prerender_dispatcher.h41
-rw-r--r--chrome/renderer/prerender/prerender_helper.cc6
-rw-r--r--chrome/renderer/prerender/prerender_webmediaplayer.cc4
4 files changed, 106 insertions, 5 deletions
diff --git a/chrome/renderer/prerender/prerender_dispatcher.cc b/chrome/renderer/prerender/prerender_dispatcher.cc
new file mode 100644
index 0000000..500d4be
--- /dev/null
+++ b/chrome/renderer/prerender/prerender_dispatcher.cc
@@ -0,0 +1,60 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/renderer/prerender/prerender_dispatcher.h"
+
+#include "base/logging.h"
+#include "chrome/common/prerender_messages.h"
+#include "googleurl/src/gurl.h"
+
+namespace prerender {
+
+PrerenderDispatcher::PrerenderDispatcher() {
+}
+
+PrerenderDispatcher::~PrerenderDispatcher() {
+}
+
+bool PrerenderDispatcher::IsPrerenderURL(const GURL& url) const {
+ return prerender_urls_.find(url) != prerender_urls_.end();
+}
+
+bool PrerenderDispatcher::OnControlMessageReceived(
+ const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(PrerenderDispatcher, message)
+ IPC_MESSAGE_HANDLER(PrerenderMsg_AddPrerenderURL, OnAddPrerenderURL)
+ IPC_MESSAGE_HANDLER(PrerenderMsg_RemovePrerenderURL, OnRemovePrerenderURL)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+
+ return handled;
+}
+
+void PrerenderDispatcher::OnAddPrerenderURL(const GURL& url) {
+ PrerenderMap::iterator it = prerender_urls_.find(url);
+ if (it != prerender_urls_.end()) {
+ DCHECK(it->second > 0);
+ it->second += 1;
+ } else {
+ prerender_urls_[url] = 1;
+ }
+}
+
+void PrerenderDispatcher::OnRemovePrerenderURL(const GURL& url) {
+ PrerenderMap::iterator it = prerender_urls_.find(url);
+ // This is possible with a spurious remove.
+ // TODO(cbentzel): We'd also want to send the map of active prerenders when
+ // creating a new render process, so the Add/Remove go relative to that.
+ // This may not be that big of a deal in practice, since the newly created tab
+ // is unlikely to go to the prerendered page.
+ if (it == prerender_urls_.end())
+ return;
+ DCHECK(it->second > 0);
+ it->second -= 1;
+ if (it->second == 0)
+ prerender_urls_.erase(it);
+}
+
+} // namespace prerender
diff --git a/chrome/renderer/prerender/prerender_dispatcher.h b/chrome/renderer/prerender/prerender_dispatcher.h
new file mode 100644
index 0000000..5537401
--- /dev/null
+++ b/chrome/renderer/prerender/prerender_dispatcher.h
@@ -0,0 +1,41 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_RENDERER_PRERENDER_PRERENDER_DISPATCHER_H_
+#define CHROME_RENDERER_PRERENDER_PRERENDER_DISPATCHER_H_
+#pragma once
+
+#include <map>
+
+#include "base/compiler_specific.h"
+#include "content/public/renderer/render_process_observer.h"
+
+class GURL;
+
+namespace prerender {
+
+// PrerenderDispatcher keeps track of which URLs are being prerendered. There
+// is only one PrerenderDispatcher per render process, and it will only be
+// aware of prerenders that are triggered by this render process.
+class PrerenderDispatcher : public content::RenderProcessObserver {
+ public:
+ PrerenderDispatcher();
+ virtual ~PrerenderDispatcher();
+
+ bool IsPrerenderURL(const GURL & url) const;
+
+ private:
+ void OnAddPrerenderURL(const GURL& url);
+ void OnRemovePrerenderURL(const GURL& url);
+
+ // RenderProcessObserver:
+ virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
+
+ typedef std::map<GURL, int> PrerenderMap;
+ PrerenderMap prerender_urls_;
+};
+
+} // namespace prerender
+
+#endif // CHROME_RENDERER_PRERENDER_PRERENDER_DISPATCHER_H_
diff --git a/chrome/renderer/prerender/prerender_helper.cc b/chrome/renderer/prerender/prerender_helper.cc
index 84dc1d7..853a2f7 100644
--- a/chrome/renderer/prerender/prerender_helper.cc
+++ b/chrome/renderer/prerender/prerender_helper.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,7 +6,7 @@
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
-#include "chrome/common/render_messages.h"
+#include "chrome/common/prerender_messages.h"
#include "content/public/renderer/document_state.h"
#include "content/public/renderer/render_view.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
@@ -131,7 +131,7 @@ void PrerenderHelper::DidStartProvisionalLoad(WebKit::WebFrame* frame) {
bool PrerenderHelper::OnMessageReceived(
const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP(PrerenderHelper, message)
- IPC_MESSAGE_HANDLER(ChromeViewMsg_SetIsPrerendering, OnSetIsPrerendering)
+ IPC_MESSAGE_HANDLER(PrerenderMsg_SetIsPrerendering, OnSetIsPrerendering)
IPC_END_MESSAGE_MAP()
// Return false on ViewMsg_SetIsPrerendering so other observers can see the
// message.
diff --git a/chrome/renderer/prerender/prerender_webmediaplayer.cc b/chrome/renderer/prerender/prerender_webmediaplayer.cc
index 8189b4f..8fcc299 100644
--- a/chrome/renderer/prerender/prerender_webmediaplayer.cc
+++ b/chrome/renderer/prerender/prerender_webmediaplayer.cc
@@ -4,7 +4,7 @@
#include "chrome/renderer/prerender/prerender_webmediaplayer.h"
-#include "chrome/common/render_messages.h"
+#include "chrome/common/prerender_messages.h"
#include "content/public/renderer/render_view.h"
#include "media/base/filter_collection.h"
#include "media/base/media_log.h"
@@ -59,7 +59,7 @@ void PrerenderWebMediaPlayer::cancelLoad() {
bool PrerenderWebMediaPlayer::OnMessageReceived(const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP(PrerenderWebMediaPlayer, message)
- IPC_MESSAGE_HANDLER(ChromeViewMsg_SetIsPrerendering, OnSetIsPrerendering)
+ IPC_MESSAGE_HANDLER(PrerenderMsg_SetIsPrerendering, OnSetIsPrerendering)
IPC_END_MESSAGE_MAP()
return false;