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

Unified Diff: chrome/browser/prerender/prerender_link_manager.cc

Issue 9875026: **NOTFORLANDING** New link rel=prerender API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: wdyt? Created 8 years, 9 months 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 side-by-side diff with in-line comments
Download patch
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
new file mode 100644
index 0000000000000000000000000000000000000000..c5267b16127875961ade0527ab347bbda81af9ee
--- /dev/null
+++ b/chrome/browser/prerender/prerender_link_manager.cc
@@ -0,0 +1,134 @@
+// 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/browser/prerender/prerender_link_manager.h"
+
+#include <utility>
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
+#include "content/public/common/referrer.h"
+#include "googleurl/src/gurl.h"
+#include "googleurl/src/url_canon.h"
+#include "ui/gfx/size.h"
+
+namespace prerender {
+
+PrerenderLinkManager::PrerenderLinkManager(
+ PrerenderManager* manager)
+ : manager_(manager) {
+}
+
+PrerenderLinkManager::~PrerenderLinkManager() {
+}
+
+void PrerenderLinkManager::OnNewLinkPrerenderImpl(
+ int prerender_id,
+ int child_id,
+ int render_view_route_id,
+ const GURL& orig_url,
+ const content::Referrer& referrer,
+ const gfx::Size& ALLOW_UNUSED size) {
gavinp 2012/03/28 19:51:31 I carried this size all the way up for two reasons
+ // TODO(gavinp): Add tests to insure fragments work.
+ url_canon::Replacements<char> replacements;
+ replacements.ClearRef();
+ const GURL url = orig_url.ReplaceComponents(replacements);
gavinp 2012/03/28 19:51:31 In the spirit of not changing too much as I add t
+
+ manager_->AddPrerenderFromLinkRelPrerender(
+ child_id, render_view_route_id, url, referrer);
+ const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
cbentzel 2012/03/29 00:13:37 Why don't you need to include route_id as well? Do
gavinp 2012/04/20 17:54:14 The prerender_id should be unique across the WebKi
+ DCHECK(id_map_.find(child_and_prerender_id) == id_map_.end());
+ id_map_.insert(std::make_pair(child_and_prerender_id, url));
+ url_map_.insert(std::make_pair(url, child_and_prerender_id));
cbentzel 2012/03/29 00:13:37 I recommend adding a CheckInvariant() function whi
gavinp 2012/04/20 17:54:15 Done.
+}
+
+void PrerenderLinkManager::OnRemovedLinkPrerenderImpl(const int prerender_id,
+ const int child_id) {
+ const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
+
+ PrerenderIdToUrlMap::iterator id_url_iter =
+ id_map_.find(child_and_prerender_id);
+ if (id_url_iter == id_map_.end())
+ return;
+ const GURL url = id_url_iter->second;
+ id_map_.erase(id_url_iter);
+
+ // Are any other link elements prerendering this URL?
+ UrlToPrerenderIdMap::iterator url_id_iter = url_map_.find(url);
cbentzel 2012/03/29 00:13:37 This doesn't guarantee to find the first entry in
gavinp 2012/04/20 17:54:15 _The C++ Programming Language_ claims otherwise in
+ int remaining_prerender_link_count = 0;
+ while (url_id_iter != url_map_.end() && url_id_iter->first == url) {
+ if (url_id_iter->second == child_and_prerender_id) {
+ UrlToPrerenderIdMap::iterator to_erase = url_id_iter;
+ ++url_id_iter;
+ url_map_.erase(to_erase);
cbentzel 2012/03/29 00:13:37 I always get nervous about erasing while iterating
mmenke 2012/03/29 01:15:39 I suggest that you only delete entries in one plac
gavinp 2012/04/20 17:54:15 Done.
+ continue;
+ }
+ ++remaining_prerender_link_count;
+ ++url_id_iter;
+ }
+ if (remaining_prerender_link_count)
+ return;
+
+ // TODO(gavinp): Track down the correct prerender and stop it, rather than
cbentzel 2012/03/29 00:13:37 Please fix this. Also, it doesn't look like you ha
gavinp 2012/04/20 17:54:15 Done, in a basic way using the existing PrerenderM
+ // this nuclear option, which assumes that only one prerender at a time
+ // runs.
+ if (manager_->IsPrerendering(url))
+ manager_->CancelAllPrerenders();
+}
+
+void PrerenderLinkManager::OnUnloadedLinkPrerenderImpl(
+ int prerender_id,
+ int child_id) {
+ // TODO(gavinp,cbentzel): Implement reasonable behaviour for
+ // navigation away from launcher.
+ const ChildAndPrerenderIdPair child_and_prerender_id(child_id, prerender_id);
+ PrerenderIdToUrlMap::iterator id_url_iter =
+ id_map_.find(child_and_prerender_id);
+ if (id_url_iter == id_map_.end())
+ return;
+ const GURL& url = id_url_iter->second;
+ DCHECK(url_map_.find(url) != url_map_.end());
+ ignore_result(url_map_.erase(url));
+ id_map_.erase(id_url_iter);
+}
+
+// static
+void PrerenderLinkManager::OnNewLinkPrerender(
+ Profile* profile,
+ int prerender_id,
+ int child_id,
+ int render_view_route_id,
+ const GURL& url,
+ const content::Referrer& referrer,
+ const gfx::Size& size) {
+ if (prerender::PrerenderManager* prerender_manager =
+ prerender::PrerenderManagerFactory::GetForProfile(profile)) {
+ prerender_manager->link_manager()->OnNewLinkPrerenderImpl(
cbentzel 2012/03/29 00:13:37 Not sure I like that this goes "Get the prerender
gavinp 2012/04/20 17:54:15 Done.
+ prerender_id, child_id, render_view_route_id,
+ url, referrer, size);
+ }
+}
+
+// static
+void PrerenderLinkManager::OnRemovedLinkPrerender(Profile* profile,
+ int prerender_id,
+ int child_id) {
+ if (prerender::PrerenderManager* prerender_manager =
+ prerender::PrerenderManagerFactory::GetForProfile(profile))
+ prerender_manager->link_manager()->OnRemovedLinkPrerenderImpl(prerender_id,
+ child_id);
+}
+
+// static
+void PrerenderLinkManager::OnUnloadedLinkPrerender(Profile* profile,
+ int prerender_id,
+ int child_id) {
+ if (prerender::PrerenderManager* prerender_manager =
+ prerender::PrerenderManagerFactory::GetForProfile(profile))
+ prerender_manager->link_manager()->OnUnloadedLinkPrerenderImpl(prerender_id,
+ child_id);
+}
+
+} // namespace prerender

Powered by Google App Engine
This is Rietveld 408576698