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 |