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

Side by Side Diff: chrome/browser/prerender/prerender_manager.cc

Issue 6966016: Handle <link rel=prerender> in chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tone down the over-aggressive search and replace... Created 9 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/renderer/page_load_histograms.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/prerender/prerender_manager.h" 5 #include "chrome/browser/prerender/prerender_manager.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 159
160 struct PrerenderManager::PendingContentsData { 160 struct PrerenderManager::PendingContentsData {
161 PendingContentsData(const GURL& url, 161 PendingContentsData(const GURL& url,
162 const GURL& referrer) 162 const GURL& referrer)
163 : url_(url), referrer_(referrer) { } 163 : url_(url), referrer_(referrer) { }
164 ~PendingContentsData() {} 164 ~PendingContentsData() {}
165 GURL url_; 165 GURL url_;
166 GURL referrer_; 166 GURL referrer_;
167 }; 167 };
168 168
169 void HandlePrefetchTag( 169 void HandleTag(
170 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr, 170 const base::WeakPtr<PrerenderManager>& prerender_manager_weak_ptr,
171 int render_process_id, 171 int render_process_id,
172 int render_view_id, 172 int render_view_id,
173 const GURL& url, 173 const GURL& url,
174 const GURL& referrer, 174 const GURL& referrer,
175 bool make_pending) { 175 bool make_pending) {
176 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 176 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
177 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get(); 177 PrerenderManager* prerender_manager = prerender_manager_weak_ptr.get();
178 if (!prerender_manager || !prerender_manager->is_enabled()) 178 if (!prerender_manager || !prerender_manager->is_enabled())
179 return; 179 return;
180 prerender_manager->RecordPrefetchTagObserved(); 180 prerender_manager->RecordTagObserved();
181 181
182 std::pair<int, int> child_route_id_pair = std::make_pair(render_process_id, 182 std::pair<int, int> child_route_id_pair = std::make_pair(render_process_id,
183 render_view_id); 183 render_view_id);
184 // TODO(cbentzel): Should the decision to make pending be done on the 184 // TODO(cbentzel): Should the decision to make pending be done on the
185 // UI thread rather than the IO thread? The page may have 185 // UI thread rather than the IO thread? The page may have
186 // become activated at this point. 186 // become activated at this point.
187 if (make_pending) 187 if (make_pending)
188 prerender_manager->AddPendingPreload(child_route_id_pair, url, referrer); 188 prerender_manager->AddPendingPreload(child_route_id_pair, url, referrer);
189 else 189 else
190 prerender_manager->AddPreload(child_route_id_pair, url, referrer); 190 prerender_manager->AddPreload(child_route_id_pair, url, referrer);
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 ++content_it) { 796 ++content_it) {
797 if (content_it->url_ == url) { 797 if (content_it->url_ == url) {
798 return &(*content_it); 798 return &(*content_it);
799 } 799 }
800 } 800 }
801 } 801 }
802 802
803 return NULL; 803 return NULL;
804 } 804 }
805 805
806 void PrerenderManager::RecordPrefetchTagObserved() { 806 void PrerenderManager::RecordTagObserved() {
807 DCHECK(CalledOnValidThread()); 807 DCHECK(CalledOnValidThread());
808 808
809 // If we observe multiple tags within the 30 second window, we will still 809 // If we observe multiple tags within the 30 second window, we will still
810 // reset the window to begin at the most recent occurrence, so that we will 810 // reset the window to begin at the most recent occurrence, so that we will
811 // always be in a window in the 30 seconds from each occurrence. 811 // always be in a window in the 30 seconds from each occurrence.
812 last_prefetch_seen_time_ = base::TimeTicks::Now(); 812 last_prerender_seen_time_ = base::TimeTicks::Now();
813 } 813 }
814 814
815 void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) { 815 void PrerenderManager::RemovePendingPreload(PrerenderContents* entry) {
816 DCHECK(CalledOnValidThread()); 816 DCHECK(CalledOnValidThread());
817 int child_id; 817 int child_id;
818 int route_id; 818 int route_id;
819 bool has_child_id = entry->GetChildId(&child_id); 819 bool has_child_id = entry->GetChildId(&child_id);
820 bool has_route_id = has_child_id && entry->GetRouteId(&route_id); 820 bool has_route_id = has_child_id && entry->GetRouteId(&route_id);
821 821
822 // If the entry doesn't have a RenderViewHost then it didn't start 822 // If the entry doesn't have a RenderViewHost then it didn't start
823 // prerendering and there shouldn't be any pending preloads to remove. 823 // prerendering and there shouldn't be any pending preloads to remove.
824 if (has_child_id && has_route_id) { 824 if (has_child_id && has_route_id) {
825 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id); 825 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id);
826 pending_prerender_list_.erase(child_route_pair); 826 pending_prerender_list_.erase(child_route_pair);
827 } 827 }
828 } 828 }
829 829
830 bool PrerenderManager::WithinWindow() const { 830 bool PrerenderManager::WithinWindow() const {
831 DCHECK(CalledOnValidThread()); 831 DCHECK(CalledOnValidThread());
832 if (last_prefetch_seen_time_.is_null()) 832 if (last_prerender_seen_time_.is_null())
833 return false; 833 return false;
834 base::TimeDelta elapsed_time = 834 base::TimeDelta elapsed_time =
835 base::TimeTicks::Now() - last_prefetch_seen_time_; 835 base::TimeTicks::Now() - last_prerender_seen_time_;
836 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowDurationSeconds); 836 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowDurationSeconds);
837 } 837 }
838 838
839 bool PrerenderManager::DoesRateLimitAllowPrerender() const { 839 bool PrerenderManager::DoesRateLimitAllowPrerender() const {
840 DCHECK(CalledOnValidThread()); 840 DCHECK(CalledOnValidThread());
841 base::TimeDelta elapsed_time = 841 base::TimeDelta elapsed_time =
842 GetCurrentTimeTicks() - last_prerender_start_time_; 842 GetCurrentTimeTicks() - last_prerender_start_time_;
843 UMA_HISTOGRAM_TIMES("Prerender.TimeBetweenPrerenderRequests", 843 UMA_HISTOGRAM_TIMES("Prerender.TimeBetweenPrerenderRequests",
844 elapsed_time); 844 elapsed_time);
845 if (!rate_limit_enabled_) 845 if (!rate_limit_enabled_)
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 base::TimeTicks cutoff = GetCurrentTimeTicks() - 994 base::TimeTicks cutoff = GetCurrentTimeTicks() -
995 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs); 995 base::TimeDelta::FromMilliseconds(kNavigationRecordWindowMs);
996 while (!navigations_.empty()) { 996 while (!navigations_.empty()) {
997 if (navigations_.front().time_ > cutoff) 997 if (navigations_.front().time_ > cutoff)
998 break; 998 break;
999 navigations_.pop_front(); 999 navigations_.pop_front();
1000 } 1000 }
1001 } 1001 }
1002 1002
1003 } // namespace prerender 1003 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/renderer/page_load_histograms.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698