Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 220 int route_id, | 220 int route_id, |
| 221 const GURL& url, | 221 const GURL& url, |
| 222 const content::Referrer& referrer, | 222 const content::Referrer& referrer, |
| 223 const gfx::Size& size) { | 223 const gfx::Size& size) { |
| 224 #if defined(OS_ANDROID) | 224 #if defined(OS_ANDROID) |
| 225 // TODO(jcivelli): http://crbug.com/113322 We should have an option to disable | 225 // TODO(jcivelli): http://crbug.com/113322 We should have an option to disable |
| 226 // link-prerender and enable omnibox-prerender only. | 226 // link-prerender and enable omnibox-prerender only. |
| 227 return NULL; | 227 return NULL; |
| 228 #else | 228 #else |
| 229 DCHECK(!size.IsEmpty()); | 229 DCHECK(!size.IsEmpty()); |
| 230 if (PrerenderData* parent_prerender_data = | 230 bool is_same_domain = false; |
| 231 FindPrerenderDataForChildAndRoute(process_id, route_id)) { | 231 SessionStorageNamespace* session_storage_namespace = NULL; |
| 232 // Instead of prerendering from inside of a running prerender, we will defer | |
| 233 // this request until its launcher is made visible. | |
| 234 if (PrerenderContents* contents = parent_prerender_data->contents_) { | |
| 235 pending_prerender_list_.push_back( | |
| 236 linked_ptr<PrerenderData>(new PrerenderData(this))); | |
| 237 PrerenderHandle* prerender_handle = | |
| 238 new PrerenderHandle(pending_prerender_list_.back().get()); | |
| 239 contents->AddPendingPrerender( | |
| 240 prerender_handle->weak_ptr_factory_.GetWeakPtr(), | |
| 241 ORIGIN_LINK_REL_PRERENDER, url, referrer, size); | |
| 242 return prerender_handle; | |
| 243 } | |
| 244 } | |
| 245 | |
| 246 // Unit tests pass in a process_id == -1. | 232 // Unit tests pass in a process_id == -1. |
| 247 SessionStorageNamespace* session_storage_namespace = NULL; | |
| 248 if (process_id != -1) { | 233 if (process_id != -1) { |
| 249 RenderViewHost* source_render_view_host = | 234 RenderViewHost* source_render_view_host = |
| 250 RenderViewHost::FromID(process_id, route_id); | 235 RenderViewHost::FromID(process_id, route_id); |
| 251 if (!source_render_view_host) | 236 if (!source_render_view_host) |
| 252 return NULL; | 237 return NULL; |
| 253 WebContents* source_web_contents = | 238 WebContents* source_web_contents = |
| 254 WebContents::FromRenderViewHost(source_render_view_host); | 239 WebContents::FromRenderViewHost(source_render_view_host); |
| 255 if (!source_web_contents) | 240 if (!source_web_contents) |
| 256 return NULL; | 241 return NULL; |
| 242 is_same_domain = (source_web_contents->GetURL().host() == url.host()); | |
|
dominich
2012/10/08 17:03:04
does this return true if you have https://google.c
| |
| 257 // TODO(ajwong): This does not correctly handle storage for isolated apps. | 243 // TODO(ajwong): This does not correctly handle storage for isolated apps. |
| 258 session_storage_namespace = | 244 session_storage_namespace = |
| 259 source_web_contents->GetController() | 245 source_web_contents->GetController() |
| 260 .GetDefaultSessionStorageNamespace(); | 246 .GetDefaultSessionStorageNamespace(); |
| 261 } | 247 } |
| 262 | 248 |
| 263 return AddPrerender(ORIGIN_LINK_REL_PRERENDER, | 249 if (PrerenderData* parent_prerender_data = |
| 250 FindPrerenderDataForChildAndRoute(process_id, route_id)) { | |
| 251 // Instead of prerendering from inside of a running prerender, we will defer | |
| 252 // this request until its launcher is made visible. | |
| 253 if (PrerenderContents* contents = parent_prerender_data->contents_) { | |
| 254 pending_prerender_list_.push_back( | |
| 255 linked_ptr<PrerenderData>(new PrerenderData(this))); | |
| 256 PrerenderHandle* prerender_handle = | |
| 257 new PrerenderHandle(pending_prerender_list_.back().get()); | |
| 258 contents->AddPendingPrerender( | |
| 259 prerender_handle->weak_ptr_factory_.GetWeakPtr(), | |
| 260 is_same_domain ? ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN | |
| 261 : ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN, | |
| 262 url, referrer, size); | |
| 263 return prerender_handle; | |
| 264 } | |
| 265 } | |
| 266 | |
| 267 return AddPrerender(is_same_domain ? ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN | |
| 268 : ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN, | |
| 264 process_id, url, referrer, size, | 269 process_id, url, referrer, size, |
| 265 session_storage_namespace); | 270 session_storage_namespace); |
| 266 #endif | 271 #endif |
| 267 } | 272 } |
| 268 | 273 |
| 269 PrerenderHandle* PrerenderManager::AddPrerenderFromOmnibox( | 274 PrerenderHandle* PrerenderManager::AddPrerenderFromOmnibox( |
| 270 const GURL& url, | 275 const GURL& url, |
| 271 SessionStorageNamespace* session_storage_namespace, | 276 SessionStorageNamespace* session_storage_namespace, |
| 272 const gfx::Size& size) { | 277 const gfx::Size& size) { |
| 273 if (!IsOmniboxEnabled(profile_)) | 278 if (!IsOmniboxEnabled(profile_)) |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 WebContents* web_contents, | 518 WebContents* web_contents, |
| 514 const GURL& url) { | 519 const GURL& url) { |
| 515 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 520 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 516 PrerenderManager* prerender_manager = | 521 PrerenderManager* prerender_manager = |
| 517 PrerenderManagerFactory::GetForProfile( | 522 PrerenderManagerFactory::GetForProfile( |
| 518 Profile::FromBrowserContext(web_contents->GetBrowserContext())); | 523 Profile::FromBrowserContext(web_contents->GetBrowserContext())); |
| 519 if (!prerender_manager) | 524 if (!prerender_manager) |
| 520 return; | 525 return; |
| 521 if (!prerender_manager->IsEnabled()) | 526 if (!prerender_manager->IsEnabled()) |
| 522 return; | 527 return; |
| 523 Origin prerender_origin = ORIGIN_NONE; | 528 const Origin* prerender_origin = NULL; |
| 524 bool was_prerender = | 529 bool was_prerender = |
| 525 prerender_manager->IsWebContentsPrerendered(web_contents, | 530 prerender_manager->IsWebContentsPrerendered(web_contents, |
| 526 &prerender_origin); | 531 &prerender_origin); |
| 527 bool was_complete_prerender = was_prerender || | 532 bool was_complete_prerender = was_prerender || |
| 528 prerender_manager->WouldWebContentsBePrerendered(web_contents); | 533 prerender_manager->WouldWebContentsBePrerendered(web_contents); |
| 529 if (prerender_manager->IsWebContentsPrerendering(web_contents)) { | 534 if (prerender_manager->IsWebContentsPrerendering(web_contents)) { |
| 530 prerender_manager->histograms_->RecordPageLoadTimeNotSwappedIn( | 535 prerender_manager->histograms_->RecordPageLoadTimeNotSwappedIn( |
| 531 prerender_origin, perceived_page_load_time, url); | 536 was_prerender ? *prerender_origin : ORIGIN_NONE, |
| 537 perceived_page_load_time, url); | |
| 532 } else { | 538 } else { |
| 533 prerender_manager->histograms_->RecordPerceivedPageLoadTime( | 539 prerender_manager->histograms_->RecordPerceivedPageLoadTime( |
| 534 prerender_origin, perceived_page_load_time, was_prerender, | 540 was_prerender ? *prerender_origin : ORIGIN_NONE, |
| 535 was_complete_prerender, url); | 541 perceived_page_load_time, was_prerender, was_complete_prerender, url); |
| 536 if (was_prerender) { | 542 prerender_manager->histograms_->RecordPercentLoadDoneAtSwapin( |
| 537 prerender_manager->histograms_->RecordPercentLoadDoneAtSwapin( | 543 was_prerender ? *prerender_origin : ORIGIN_NONE, |
| 538 prerender_origin, fraction_plt_elapsed_at_swap_in); | 544 fraction_plt_elapsed_at_swap_in); |
| 539 } | |
| 540 if (prerender_manager->local_predictor_.get()) { | 545 if (prerender_manager->local_predictor_.get()) { |
| 541 prerender_manager->local_predictor_-> | 546 prerender_manager->local_predictor_-> |
| 542 OnPLTEventForURL(url, perceived_page_load_time); | 547 OnPLTEventForURL(url, perceived_page_load_time); |
| 543 } | 548 } |
| 544 } | 549 } |
| 545 } | 550 } |
| 546 | 551 |
| 547 void PrerenderManager::RecordFractionPixelsFinalAtSwapin( | 552 void PrerenderManager::RecordFractionPixelsFinalAtSwapin( |
| 548 content::WebContents* web_contents, | 553 content::WebContents* web_contents, |
| 549 double fraction) { | 554 double fraction) { |
| 550 Origin origin = ORIGIN_NONE; | 555 const Origin* origin = NULL; |
| 551 IsWebContentsPrerendered(web_contents, &origin); | 556 IsWebContentsPrerendered(web_contents, &origin); |
| 552 histograms_->RecordFractionPixelsFinalAtSwapin(origin, fraction); | 557 histograms_->RecordFractionPixelsFinalAtSwapin( |
| 558 origin ? *origin : ORIGIN_NONE, fraction); | |
| 553 } | 559 } |
| 554 | 560 |
| 555 void PrerenderManager::set_enabled(bool enabled) { | 561 void PrerenderManager::set_enabled(bool enabled) { |
| 556 DCHECK(CalledOnValidThread()); | 562 DCHECK(CalledOnValidThread()); |
| 557 enabled_ = enabled; | 563 enabled_ = enabled; |
| 558 } | 564 } |
| 559 | 565 |
| 560 // static | 566 // static |
| 561 bool PrerenderManager::IsPrefetchEnabled() { | 567 bool PrerenderManager::IsPrefetchEnabled() { |
| 562 return is_prefetch_enabled_; | 568 return is_prefetch_enabled_; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 684 if (first_time) { | 690 if (first_time) { |
| 685 it->second = false; | 691 it->second = false; |
| 686 } else { | 692 } else { |
| 687 would_be_prerendered_map_.erase(it); | 693 would_be_prerendered_map_.erase(it); |
| 688 } | 694 } |
| 689 } | 695 } |
| 690 } | 696 } |
| 691 | 697 |
| 692 bool PrerenderManager::IsWebContentsPrerendered( | 698 bool PrerenderManager::IsWebContentsPrerendered( |
| 693 content::WebContents* web_contents, | 699 content::WebContents* web_contents, |
| 694 Origin* origin) const { | 700 const Origin** origin) const { |
| 695 DCHECK(CalledOnValidThread()); | 701 DCHECK(CalledOnValidThread()); |
| 696 base::hash_map<content::WebContents*, PrerenderedWebContentsData>:: | 702 base::hash_map<content::WebContents*, PrerenderedWebContentsData>:: |
| 697 const_iterator it = prerendered_web_contents_data_.find(web_contents); | 703 const_iterator it = prerendered_web_contents_data_.find(web_contents); |
| 698 if (it == prerendered_web_contents_data_.end()) { | 704 if (it == prerendered_web_contents_data_.end()) { |
| 699 if (origin) | 705 if (origin) |
| 700 *origin = ORIGIN_NONE; | 706 *origin = NULL; |
|
dominich
2012/10/08 17:03:04
this could be ORIGIN_MAX. Or a new ORIGIN_INVALID
| |
| 701 return false; | 707 return false; |
| 702 } | 708 } |
| 703 if (origin) | 709 if (origin) |
| 704 *origin = it->second.origin; | 710 *origin = &it->second.origin; |
|
dominich
2012/10/08 17:03:04
this could lead to lifetime issues depending on wh
| |
| 705 return true; | 711 return true; |
| 706 } | 712 } |
| 707 | 713 |
| 708 bool PrerenderManager::WouldWebContentsBePrerendered( | 714 bool PrerenderManager::WouldWebContentsBePrerendered( |
| 709 WebContents* web_contents) const { | 715 WebContents* web_contents) const { |
| 710 DCHECK(CalledOnValidThread()); | 716 DCHECK(CalledOnValidThread()); |
| 711 return would_be_prerendered_map_.count(web_contents) > 0; | 717 return would_be_prerendered_map_.count(web_contents) > 0; |
| 712 } | 718 } |
| 713 | 719 |
| 714 bool PrerenderManager::HasRecentlyBeenNavigatedTo(Origin origin, | 720 bool PrerenderManager::HasRecentlyBeenNavigatedTo(Origin origin, |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 950 int process_id, | 956 int process_id, |
| 951 const GURL& url_arg, | 957 const GURL& url_arg, |
| 952 const content::Referrer& referrer, | 958 const content::Referrer& referrer, |
| 953 const gfx::Size& size, | 959 const gfx::Size& size, |
| 954 SessionStorageNamespace* session_storage_namespace) { | 960 SessionStorageNamespace* session_storage_namespace) { |
| 955 DCHECK(CalledOnValidThread()); | 961 DCHECK(CalledOnValidThread()); |
| 956 | 962 |
| 957 if (!IsEnabled()) | 963 if (!IsEnabled()) |
| 958 return NULL; | 964 return NULL; |
| 959 | 965 |
| 960 if (origin == ORIGIN_LINK_REL_PRERENDER && | 966 if ((origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN || |
| 967 origin == ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN) && | |
| 961 IsGoogleSearchResultURL(referrer.url)) { | 968 IsGoogleSearchResultURL(referrer.url)) { |
| 962 origin = ORIGIN_GWS_PRERENDER; | 969 origin = ORIGIN_GWS_PRERENDER; |
| 963 } | 970 } |
| 964 | 971 |
| 965 DeleteOldEntries(); | 972 DeleteOldEntries(); |
| 966 DeletePendingDeleteEntries(); | 973 DeletePendingDeleteEntries(); |
| 967 | 974 |
| 968 GURL url = url_arg; | 975 GURL url = url_arg; |
| 969 GURL alias_url; | 976 GURL alias_url; |
| 970 uint8 experiment = GetQueryStringBasedExperiment(url_arg); | 977 uint8 experiment = GetQueryStringBasedExperiment(url_arg); |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 if (!render_process_host || !render_process_host->GetBrowserContext()) | 1340 if (!render_process_host || !render_process_host->GetBrowserContext()) |
| 1334 return NULL; | 1341 return NULL; |
| 1335 Profile* profile = Profile::FromBrowserContext( | 1342 Profile* profile = Profile::FromBrowserContext( |
| 1336 render_process_host->GetBrowserContext()); | 1343 render_process_host->GetBrowserContext()); |
| 1337 if (!profile) | 1344 if (!profile) |
| 1338 return NULL; | 1345 return NULL; |
| 1339 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); | 1346 return PrerenderManagerFactory::GetInstance()->GetForProfile(profile); |
| 1340 } | 1347 } |
| 1341 | 1348 |
| 1342 } // namespace prerender | 1349 } // namespace prerender |
| OLD | NEW |