| Index: chrome/browser/prerender/prerender_local_predictor.cc
|
| diff --git a/chrome/browser/prerender/prerender_local_predictor.cc b/chrome/browser/prerender/prerender_local_predictor.cc
|
| index fea2cafb090a314d5f4edad011f8e296b1e7815a..afc1e20dafd5c4f8110111289b1ea20189a2029b 100644
|
| --- a/chrome/browser/prerender/prerender_local_predictor.cc
|
| +++ b/chrome/browser/prerender/prerender_local_predictor.cc
|
| @@ -455,24 +455,51 @@ class PrerenderLocalPredictor::PrefetchList {
|
| return_value = true;
|
| }
|
| // If the item has been seen in both the history and in tab contents,
|
| - // erase it from the map to make room for new prefetches.
|
| - if (it->second->seen_tabcontents_ && it->second->seen_history_)
|
| + // and the page load time has been recorded, erase it from the map to
|
| + // make room for new prefetches.
|
| + if (it->second->seen_tabcontents_ && it->second->seen_history_ &&
|
| + it->second->seen_plt_) {
|
| entries_.erase(url.spec().c_str());
|
| + }
|
| return return_value;
|
| }
|
|
|
| + // Marks the PLT for the provided UR as seen. Returns true
|
| + // iff the item is currently in the list and the PLT had not been seen
|
| + // before, i.e. the sighting was successful.
|
| + bool MarkPLTSeen(const GURL& url, base::TimeDelta plt) {
|
| + ExpireOldItems();
|
| + base::hash_map<string, ListEntry*>::iterator it =
|
| + entries_.find(url.spec().c_str());
|
| + if (it == entries_.end() || it->second->seen_plt_ ||
|
| + it->second->add_time_ > GetCurrentTime() - plt) {
|
| + return false;
|
| + }
|
| + it->second->seen_plt_ = true;
|
| + // If the item has been seen in both the history and in tab contents,
|
| + // and the page load time has been recorded, erase it from the map to
|
| + // make room for new prefetches.
|
| + if (it->second->seen_tabcontents_ && it->second->seen_history_ &&
|
| + it->second->seen_plt_) {
|
| + entries_.erase(url.spec().c_str());
|
| + }
|
| + return true;
|
| + }
|
| +
|
| private:
|
| struct ListEntry {
|
| explicit ListEntry(const string& url)
|
| : url_(url),
|
| add_time_(GetCurrentTime()),
|
| seen_tabcontents_(false),
|
| - seen_history_(false) {
|
| + seen_history_(false),
|
| + seen_plt_(false) {
|
| }
|
| std::string url_;
|
| base::Time add_time_;
|
| bool seen_tabcontents_;
|
| bool seen_history_;
|
| + bool seen_plt_;
|
| };
|
|
|
| void ExpireOldItems() {
|
| @@ -1119,6 +1146,14 @@ void PrerenderLocalPredictor::Init() {
|
|
|
| void PrerenderLocalPredictor::OnPLTEventForURL(const GURL& url,
|
| base::TimeDelta page_load_time) {
|
| + if (prefetch_list_->MarkPLTSeen(url, page_load_time)) {
|
| + UMA_HISTOGRAM_CUSTOM_TIMES("Prerender.LocalPredictorPrefetchMatchPLT",
|
| + page_load_time,
|
| + base::TimeDelta::FromMilliseconds(10),
|
| + base::TimeDelta::FromSeconds(60),
|
| + 100);
|
| + }
|
| +
|
| scoped_ptr<PrerenderProperties> prerender;
|
| if (DoesPrerenderMatchPLTRecord(last_swapped_in_prerender_.get(),
|
| url, page_load_time)) {
|
| @@ -1338,8 +1373,19 @@ void PrerenderLocalPredictor::IssuePrerender(
|
| CandidatePrerenderInfo* info,
|
| LocalPredictorURLInfo* url_info) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - if (prefetch_list_->AddURL(url_info->url))
|
| + if (prefetch_list_->AddURL(url_info->url)) {
|
| RecordEvent(EVENT_PREFETCH_LIST_ADDED);
|
| + // If we are prefetching rather than prerendering, now is the time to launch
|
| + // the prefetch.
|
| + if (IsLocalPredictorPrerenderPrefetchEnabled()) {
|
| + // Obtain the render frame host that caused this prefetch.
|
| + RenderFrameHost* rfh = RenderFrameHost::FromID(info->render_process_id_,
|
| + info->render_frame_id_);
|
| + // If it is still alive, launch the prefresh.
|
| + if (rfh)
|
| + rfh->Send(new PrefetchMsg_Prefetch(rfh->GetRoutingID(), url_info->url));
|
| + }
|
| + }
|
| PrerenderProperties* prerender_properties =
|
| GetIssuedPrerenderSlotForPriority(url_info->url, url_info->priority);
|
| if (!prerender_properties) {
|
| @@ -1395,16 +1441,6 @@ void PrerenderLocalPredictor::IssuePrerender(
|
| new_prerender_handle->OnCancel();
|
| RecordEvent(EVENT_ISSUE_PRERENDER_CANCELLED_OLD_PRERENDER);
|
| }
|
| - // If we are prefetching rather than prerendering, now is the time to launch
|
| - // the prefetch.
|
| - if (IsLocalPredictorPrerenderPrefetchEnabled()) {
|
| - // Obtain the render frame host that caused this prefetch.
|
| - RenderFrameHost* rfh = RenderFrameHost::FromID(info->render_process_id_,
|
| - info->render_frame_id_);
|
| - // If it is still alive, launch the prefresh.
|
| - if (rfh)
|
| - rfh->Send(new PrefetchMsg_Prefetch(rfh->GetRoutingID(), url));
|
| - }
|
| }
|
|
|
| RecordEvent(EVENT_ADD_VISIT_PRERENDERING);
|
|
|