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

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

Issue 10933065: Separate same domain and cross domain <link rel=...> prerenders for reporting. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: ... upload correct diff Created 8 years, 2 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
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698