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_contents.h" | 5 #include "chrome/browser/prerender/prerender_contents.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
12 #include "chrome/browser/history/history_tab_helper.h" | 12 #include "chrome/browser/history/history_tab_helper.h" |
13 #include "chrome/browser/history/history_types.h" | 13 #include "chrome/browser/history/history_types.h" |
14 #include "chrome/browser/prerender/prerender_final_status.h" | 14 #include "chrome/browser/prerender/prerender_final_status.h" |
15 #include "chrome/browser/prerender/prerender_manager.h" | 15 #include "chrome/browser/prerender/prerender_manager.h" |
16 #include "chrome/browser/prerender/prerender_render_view_host_observer.h" | 16 #include "chrome/browser/prerender/prerender_render_view_host_observer.h" |
17 #include "chrome/browser/prerender/prerender_tracker.h" | 17 #include "chrome/browser/prerender/prerender_render_view_tracker.h" |
18 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
19 #include "chrome/browser/ui/browser.h" | 19 #include "chrome/browser/ui/browser.h" |
20 #include "chrome/browser/ui/browser_finder.h" | 20 #include "chrome/browser/ui/browser_finder.h" |
21 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 21 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
22 #include "chrome/common/chrome_notification_types.h" | 22 #include "chrome/common/chrome_notification_types.h" |
23 #include "chrome/common/icon_messages.h" | 23 #include "chrome/common/icon_messages.h" |
24 #include "chrome/common/prerender_messages.h" | 24 #include "chrome/common/prerender_messages.h" |
25 #include "chrome/common/url_constants.h" | 25 #include "chrome/common/url_constants.h" |
26 #include "content/public/browser/resource_request_details.h" | 26 #include "content/public/browser/resource_request_details.h" |
27 #include "content/public/browser/browser_child_process_host.h" | 27 #include "content/public/browser/browser_child_process_host.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 else | 81 else |
82 message = new PrerenderMsg_RemovePrerenderURL(url); | 82 message = new PrerenderMsg_RemovePrerenderURL(url); |
83 render_process_host->Send(message); | 83 render_process_host->Send(message); |
84 } | 84 } |
85 | 85 |
86 } // namespace | 86 } // namespace |
87 | 87 |
88 class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { | 88 class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { |
89 public: | 89 public: |
90 virtual PrerenderContents* CreatePrerenderContents( | 90 virtual PrerenderContents* CreatePrerenderContents( |
91 PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker, | 91 PrerenderManager* prerender_manager, |
| 92 PrerenderRenderViewTracker* prerender_render_view_tracker, |
92 Profile* profile, const GURL& url, const content::Referrer& referrer, | 93 Profile* profile, const GURL& url, const content::Referrer& referrer, |
93 Origin origin, uint8 experiment_id) OVERRIDE { | 94 Origin origin, uint8 experiment_id) OVERRIDE { |
94 return new PrerenderContents(prerender_manager, prerender_tracker, profile, | 95 return new PrerenderContents(prerender_manager, |
| 96 prerender_render_view_tracker, profile, |
95 url, referrer, origin, experiment_id); | 97 url, referrer, origin, experiment_id); |
96 } | 98 } |
97 }; | 99 }; |
98 | 100 |
99 struct PrerenderContents::PendingPrerenderInfo { | 101 struct PrerenderContents::PendingPrerenderInfo { |
100 PendingPrerenderInfo(const GURL& url, | 102 PendingPrerenderInfo(const GURL& url, |
101 const content::Referrer& referrer, | 103 const content::Referrer& referrer, |
102 const gfx::Size& size); | 104 const gfx::Size& size); |
103 const GURL url; | 105 const GURL url; |
104 const content::Referrer referrer; | 106 const content::Referrer referrer; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 for (PendingPrerenderList::iterator it = pending_prerender_list.begin(); | 231 for (PendingPrerenderList::iterator it = pending_prerender_list.begin(); |
230 it != pending_prerender_list.end(); | 232 it != pending_prerender_list.end(); |
231 ++it) { | 233 ++it) { |
232 prerender_manager_->AddPrerenderFromLinkRelPrerender( | 234 prerender_manager_->AddPrerenderFromLinkRelPrerender( |
233 child_id_, route_id_, it->url, it->referrer, it->size); | 235 child_id_, route_id_, it->url, it->referrer, it->size); |
234 } | 236 } |
235 } | 237 } |
236 | 238 |
237 PrerenderContents::PrerenderContents( | 239 PrerenderContents::PrerenderContents( |
238 PrerenderManager* prerender_manager, | 240 PrerenderManager* prerender_manager, |
239 PrerenderTracker* prerender_tracker, | 241 PrerenderRenderViewTracker* prerender_render_view_tracker, |
240 Profile* profile, | 242 Profile* profile, |
241 const GURL& url, | 243 const GURL& url, |
242 const content::Referrer& referrer, | 244 const content::Referrer& referrer, |
243 Origin origin, | 245 Origin origin, |
244 uint8 experiment_id) | 246 uint8 experiment_id) |
245 : prerendering_has_started_(false), | 247 : prerendering_has_started_(false), |
246 prerender_manager_(prerender_manager), | 248 prerender_manager_(prerender_manager), |
247 prerender_tracker_(prerender_tracker), | 249 prerender_render_view_tracker_(prerender_render_view_tracker), |
248 prerender_url_(url), | 250 prerender_url_(url), |
249 referrer_(referrer), | 251 referrer_(referrer), |
250 profile_(profile), | 252 profile_(profile), |
251 page_id_(0), | 253 page_id_(0), |
252 has_stopped_loading_(false), | 254 has_stopped_loading_(false), |
253 has_finished_loading_(false), | 255 has_finished_loading_(false), |
254 final_status_(FINAL_STATUS_MAX), | 256 final_status_(FINAL_STATUS_MAX), |
255 match_complete_status_(MATCH_COMPLETE_DEFAULT), | 257 match_complete_status_(MATCH_COMPLETE_DEFAULT), |
256 prerendering_has_been_cancelled_(false), | 258 prerendering_has_been_cancelled_(false), |
257 child_id_(-1), | 259 child_id_(-1), |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 render_view_host_observer_.reset( | 327 render_view_host_observer_.reset( |
326 new PrerenderRenderViewHostObserver(this, GetRenderViewHostMutable())); | 328 new PrerenderRenderViewHostObserver(this, GetRenderViewHostMutable())); |
327 | 329 |
328 child_id_ = GetRenderViewHost()->GetProcess()->GetID(); | 330 child_id_ = GetRenderViewHost()->GetProcess()->GetID(); |
329 route_id_ = GetRenderViewHost()->GetRoutingID(); | 331 route_id_ = GetRenderViewHost()->GetRoutingID(); |
330 | 332 |
331 // Register this with the ResourceDispatcherHost as a prerender | 333 // Register this with the ResourceDispatcherHost as a prerender |
332 // RenderViewHost. This must be done before the Navigate message to catch all | 334 // RenderViewHost. This must be done before the Navigate message to catch all |
333 // resource requests, but as it is on the same thread as the Navigate message | 335 // resource requests, but as it is on the same thread as the Navigate message |
334 // (IO) there is no race condition. | 336 // (IO) there is no race condition. |
335 prerender_tracker_->OnPrerenderingStarted( | 337 prerender_render_view_tracker_->OnPrerenderingStarted( |
336 child_id_, | 338 child_id_, |
337 route_id_, | 339 route_id_, |
338 prerender_manager_); | 340 prerender_manager_); |
339 | 341 |
340 // Close ourselves when the application is shutting down. | 342 // Close ourselves when the application is shutting down. |
341 notification_registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, | 343 notification_registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, |
342 content::NotificationService::AllSources()); | 344 content::NotificationService::AllSources()); |
343 | 345 |
344 // Register for our parent profile to shutdown, so we can shut ourselves down | 346 // Register for our parent profile to shutdown, so we can shut ourselves down |
345 // as well (should only be called for OTR profiles, as we should receive | 347 // as well (should only be called for OTR profiles, as we should receive |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 final_status_ == FINAL_STATUS_USED); | 398 final_status_ == FINAL_STATUS_USED); |
397 DCHECK(origin_ != ORIGIN_MAX); | 399 DCHECK(origin_ != ORIGIN_MAX); |
398 | 400 |
399 prerender_manager_->RecordFinalStatusWithMatchCompleteStatus( | 401 prerender_manager_->RecordFinalStatusWithMatchCompleteStatus( |
400 origin_, | 402 origin_, |
401 experiment_id_, | 403 experiment_id_, |
402 match_complete_status_, | 404 match_complete_status_, |
403 final_status_); | 405 final_status_); |
404 | 406 |
405 if (child_id_ != -1 && route_id_ != -1) { | 407 if (child_id_ != -1 && route_id_ != -1) { |
406 prerender_tracker_->OnPrerenderingFinished(child_id_, route_id_); | 408 prerender_render_view_tracker_->OnPrerenderingFinished(child_id_, |
| 409 route_id_); |
407 for (std::vector<GURL>::const_iterator it = alias_urls_.begin(); | 410 for (std::vector<GURL>::const_iterator it = alias_urls_.begin(); |
408 it != alias_urls_.end(); | 411 it != alias_urls_.end(); |
409 ++it) { | 412 ++it) { |
410 InformRenderProcessAboutPrerender(*it, false, creator_child_id_); | 413 InformRenderProcessAboutPrerender(*it, false, creator_child_id_); |
411 } | 414 } |
412 } | 415 } |
413 | 416 |
414 // If we still have a WebContents, clean up anything we need to and then | 417 // If we still have a WebContents, clean up anything we need to and then |
415 // destroy it. | 418 // destroy it. |
416 if (prerender_contents_.get()) | 419 if (prerender_contents_.get()) |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 // page, so cancel this prerender. | 601 // page, so cancel this prerender. |
599 Destroy(FINAL_STATUS_JAVASCRIPT_ALERT); | 602 Destroy(FINAL_STATUS_JAVASCRIPT_ALERT); |
600 return true; | 603 return true; |
601 } | 604 } |
602 | 605 |
603 void PrerenderContents::Destroy(FinalStatus final_status) { | 606 void PrerenderContents::Destroy(FinalStatus final_status) { |
604 if (prerendering_has_been_cancelled_) | 607 if (prerendering_has_been_cancelled_) |
605 return; | 608 return; |
606 | 609 |
607 if (child_id_ != -1 && route_id_ != -1) { | 610 if (child_id_ != -1 && route_id_ != -1) { |
608 // Cancel the prerender in the PrerenderTracker. This is needed | 611 // Cancel the prerender in the PrerenderRenderViewTracker. This is needed |
609 // because destroy may be called directly from the UI thread without calling | 612 // because destroy may be called directly from the UI thread without calling |
610 // TryCancel(). This is difficult to completely avoid, since prerendering | 613 // TryCancel(). This is difficult to completely avoid, since prerendering |
611 // can be cancelled before a RenderView is created. | 614 // can be cancelled before a RenderView is created. |
612 bool is_cancelled = prerender_tracker_->TryCancel( | 615 bool is_cancelled = prerender_render_view_tracker_->TryCancel( |
613 child_id_, route_id_, final_status); | 616 child_id_, route_id_, final_status); |
614 CHECK(is_cancelled); | 617 CHECK(is_cancelled); |
615 | 618 |
616 // A different final status may have been set already from another thread. | 619 // A different final status may have been set already from another thread. |
617 // If so, use it instead. | 620 // If so, use it instead. |
618 if (!prerender_tracker_->GetFinalStatus(child_id_, route_id_, | 621 if (!prerender_render_view_tracker_->GetFinalStatus(child_id_, route_id_, |
619 &final_status)) { | 622 &final_status)) { |
620 NOTREACHED(); | 623 NOTREACHED(); |
621 } | 624 } |
622 } | 625 } |
623 set_final_status(final_status); | 626 set_final_status(final_status); |
624 | 627 |
625 prerendering_has_been_cancelled_ = true; | 628 prerendering_has_been_cancelled_ = true; |
626 // This has to be done after setting the final status, as it adds the | 629 // This has to be done after setting the final status, as it adds the |
627 // prerender to the history. | 630 // prerender to the history. |
628 prerender_manager_->MoveEntryToPendingDelete(this, final_status); | 631 prerender_manager_->MoveEntryToPendingDelete(this, final_status); |
629 | 632 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 bool PrerenderContents::IsCrossSiteNavigationPending() const { | 711 bool PrerenderContents::IsCrossSiteNavigationPending() const { |
709 if (!prerender_contents_.get() || !prerender_contents_->web_contents()) | 712 if (!prerender_contents_.get() || !prerender_contents_->web_contents()) |
710 return false; | 713 return false; |
711 const WebContents* web_contents = prerender_contents_->web_contents(); | 714 const WebContents* web_contents = prerender_contents_->web_contents(); |
712 return (web_contents->GetSiteInstance() != | 715 return (web_contents->GetSiteInstance() != |
713 web_contents->GetPendingSiteInstance()); | 716 web_contents->GetPendingSiteInstance()); |
714 } | 717 } |
715 | 718 |
716 | 719 |
717 } // namespace prerender | 720 } // namespace prerender |
OLD | NEW |