diff options
author | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-01 18:46:59 +0000 |
---|---|---|
committer | tburkard@chromium.org <tburkard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-01 18:46:59 +0000 |
commit | dea5088b10d0ac627fda84821b617bea3ca261c8 (patch) | |
tree | 7dd49ec84c20b65241168742c2f111004417dcdb /chrome/browser/prerender/prerender_manager.cc | |
parent | b2bcbfe9e2eb8f9f855b52eb48fcf0685a81fbe4 (diff) | |
download | chromium_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.cc | 44 |
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); |