| 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 |