| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |