summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender/prerender_manager.cc
diff options
context:
space:
mode:
authortburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-01 18:46:59 +0000
committertburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-01 18:46:59 +0000
commitdea5088b10d0ac627fda84821b617bea3ca261c8 (patch)
tree7dd49ec84c20b65241168742c2f111004417dcdb /chrome/browser/prerender/prerender_manager.cc
parentb2bcbfe9e2eb8f9f855b52eb48fcf0685a81fbe4 (diff)
downloadchromium_src-dea5088b10d0ac627fda84821b617bea3ca261c8.zip
chromium_src-dea5088b10d0ac627fda84821b617bea3ca261c8.tar.gz
chromium_src-dea5088b10d0ac627fda84821b617bea3ca261c8.tar.bz2
For histograms, add the target URL for prerendered redirects stored in
the query string parameter url= to the alias urls if we are in the control group. R=cbentzel Review URL: http://codereview.chromium.org/6780030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80194 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender/prerender_manager.cc')
-rw-r--r--chrome/browser/prerender/prerender_manager.cc44
1 files changed, 43 insertions, 1 deletions
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index 679591c..d468ea0 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -20,6 +20,9 @@
#include "content/browser/tab_contents/render_view_host_manager.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/common/notification_service.h"
+#include "googleurl/src/url_parse.h"
+#include "googleurl/src/url_canon.h"
+#include "googleurl/src/url_util.h"
namespace prerender {
@@ -56,6 +59,35 @@ bool PrerenderManager::IsControlGroup() {
return GetMode() == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP;
}
+// static
+bool PrerenderManager::MaybeGetQueryStringBasedAliasURL(
+ const GURL& url, GURL* alias_url) {
+ DCHECK(alias_url);
+ url_parse::Parsed parsed;
+ url_parse::ParseStandardURL(url.spec().c_str(), url.spec().length(),
+ &parsed);
+ url_parse::Component query = parsed.query;
+ url_parse::Component key, value;
+ while (url_parse::ExtractQueryKeyValue(url.spec().c_str(), &query, &key,
+ &value)) {
+ if (key.len != 3 || strncmp(url.spec().c_str() + key.begin, "url", key.len))
+ continue;
+ // We found a url= query string component.
+ if (value.len < 1)
+ continue;
+ url_canon::RawCanonOutputW<1024> decoded_url;
+ url_util::DecodeURLEscapeSequences(url.spec().c_str() + value.begin,
+ value.len, &decoded_url);
+ GURL new_url(string16(decoded_url.data(), decoded_url.length()));
+ if (!new_url.is_empty() && new_url.is_valid()) {
+ *alias_url = new_url;
+ return true;
+ }
+ return false;
+ }
+ return false;
+}
+
struct PrerenderManager::PrerenderContentsData {
PrerenderContents* contents_;
base::Time start_time_;
@@ -110,6 +142,15 @@ bool PrerenderManager::AddPreload(const GURL& url,
if (FindEntry(url))
return false;
+ // Local copy, since we may have to add an additional entry to it.
+ std::vector<GURL> all_alias_urls = alias_urls;
+
+ GURL additional_alias_url;
+ if (IsControlGroup() &&
+ PrerenderManager::MaybeGetQueryStringBasedAliasURL(
+ url, &additional_alias_url))
+ all_alias_urls.push_back(additional_alias_url);
+
// Do not prerender if there are too many render processes, and we would
// have to use an existing one. We do not want prerendering to happen in
// a shared process, so that we can always reliably lower the CPU
@@ -134,7 +175,8 @@ bool PrerenderManager::AddPreload(const GURL& url,
}
// TODO(cbentzel): Move invalid checks here instead of PrerenderContents?
- PrerenderContentsData data(CreatePrerenderContents(url, alias_urls, referrer),
+ PrerenderContentsData data(CreatePrerenderContents(url, all_alias_urls,
+ referrer),
GetCurrentTime());
prerender_list_.push_back(data);