OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
130 : prerender_manager_(prerender_manager), | 130 : prerender_manager_(prerender_manager), |
131 render_view_host_(NULL), | 131 render_view_host_(NULL), |
132 prerender_url_(url), | 132 prerender_url_(url), |
133 referrer_(referrer), | 133 referrer_(referrer), |
134 profile_(profile), | 134 profile_(profile), |
135 page_id_(0), | 135 page_id_(0), |
136 ALLOW_THIS_IN_INITIALIZER_LIST(tab_contents_observer_registrar_(this)), | 136 ALLOW_THIS_IN_INITIALIZER_LIST(tab_contents_observer_registrar_(this)), |
137 has_stopped_loading_(false), | 137 has_stopped_loading_(false), |
138 final_status_(FINAL_STATUS_MAX), | 138 final_status_(FINAL_STATUS_MAX), |
139 prerendering_has_started_(false), | 139 prerendering_has_started_(false), |
140 prerendering_has_been_cancelled_(false), | |
140 child_id_(-1), | 141 child_id_(-1), |
141 route_id_(-1) { | 142 route_id_(-1) { |
142 DCHECK(prerender_manager != NULL); | 143 DCHECK(prerender_manager != NULL); |
143 } | 144 } |
144 | 145 |
145 bool PrerenderContents::Init() { | 146 bool PrerenderContents::Init() { |
146 if (!AddAliasURL(prerender_url_)) | 147 if (!AddAliasURL(prerender_url_)) |
147 return false; | 148 return false; |
148 return true; | 149 return true; |
149 } | 150 } |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
357 | 358 |
358 final_status_ = final_status; | 359 final_status_ = final_status; |
359 } | 360 } |
360 | 361 |
361 FinalStatus PrerenderContents::final_status() const { | 362 FinalStatus PrerenderContents::final_status() const { |
362 return final_status_; | 363 return final_status_; |
363 } | 364 } |
364 | 365 |
365 PrerenderContents::~PrerenderContents() { | 366 PrerenderContents::~PrerenderContents() { |
366 DCHECK(final_status_ != FINAL_STATUS_MAX); | 367 DCHECK(final_status_ != FINAL_STATUS_MAX); |
368 DCHECK(prerendering_has_been_cancelled_ || | |
369 final_status_ == FINAL_STATUS_USED || | |
370 final_status_ == FINAL_STATUS_CONTROL_GROUP); | |
367 | 371 |
368 // If we haven't even started prerendering, we were just in the control | 372 // If we haven't even started prerendering, we were just in the control |
369 // group, which means we do not want to record the status. | 373 // group, which means we do not want to record the status. |
370 if (prerendering_has_started()) | 374 if (prerendering_has_started()) |
371 RecordFinalStatus(final_status_); | 375 RecordFinalStatus(final_status_); |
372 | 376 |
373 // Only delete the RenderViewHost if we own it. | 377 // Only delete the RenderViewHost if we own it. |
374 if (render_view_host_) | 378 if (render_view_host_) |
375 render_view_host_->Shutdown(); | 379 render_view_host_->Shutdown(); |
376 | 380 |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
703 | 707 |
704 void PrerenderContents::OnRenderViewGone(int status, int exit_code) { | 708 void PrerenderContents::OnRenderViewGone(int status, int exit_code) { |
705 Destroy(FINAL_STATUS_RENDERER_CRASHED); | 709 Destroy(FINAL_STATUS_RENDERER_CRASHED); |
706 } | 710 } |
707 | 711 |
708 void PrerenderContents::DidStopLoading() { | 712 void PrerenderContents::DidStopLoading() { |
709 has_stopped_loading_ = true; | 713 has_stopped_loading_ = true; |
710 } | 714 } |
711 | 715 |
712 void PrerenderContents::Destroy(FinalStatus final_status) { | 716 void PrerenderContents::Destroy(FinalStatus final_status) { |
713 if (prerender_manager_->IsPendingDelete(this)) | 717 if (prerendering_has_been_cancelled_) |
714 return; | 718 return; |
715 | 719 |
720 prerendering_has_been_cancelled_ = true; | |
721 prerender_manager_->MoveEntryToPendingDelete(this); | |
cbentzel
2011/05/23 18:51:28
Is there a reason MoveEntryToPendingDelete moved u
mmenke
2011/05/23 18:55:36
Yes, it's just for style - prerender_has_been_canc
| |
722 | |
716 if (child_id_ != -1 && route_id_ != -1) { | 723 if (child_id_ != -1 && route_id_ != -1) { |
717 // Cancel the prerender in the PrerenderTracker. This is needed | 724 // Cancel the prerender in the PrerenderTracker. This is needed |
718 // because destroy may be called directly from the UI thread without calling | 725 // because destroy may be called directly from the UI thread without calling |
719 // TryCancel(). This is difficult to completely avoid, since prerendering | 726 // TryCancel(). This is difficult to completely avoid, since prerendering |
720 // can be cancelled before a RenderView is created. | 727 // can be cancelled before a RenderView is created. |
721 bool is_cancelled = | 728 bool is_cancelled = |
722 PrerenderTracker::GetInstance()->TryCancel(child_id_, route_id_, | 729 PrerenderTracker::GetInstance()->TryCancel(child_id_, route_id_, |
723 final_status); | 730 final_status); |
724 CHECK(is_cancelled); | 731 CHECK(is_cancelled); |
725 | 732 |
726 // A different final status may have been set already from another thread. | 733 // A different final status may have been set already from another thread. |
727 // If so, use it instead. | 734 // If so, use it instead. |
728 if (!PrerenderTracker::GetInstance()->GetFinalStatus(child_id_, route_id_, | 735 if (!PrerenderTracker::GetInstance()->GetFinalStatus(child_id_, route_id_, |
729 &final_status)) { | 736 &final_status)) { |
730 NOTREACHED(); | 737 NOTREACHED(); |
731 } | 738 } |
732 } | 739 } |
740 set_final_status(final_status); | |
733 | 741 |
734 prerender_manager_->MoveEntryToPendingDelete(this); | |
735 set_final_status(final_status); | |
736 // We may destroy the PrerenderContents before we have initialized the | 742 // We may destroy the PrerenderContents before we have initialized the |
737 // RenderViewHost. Otherwise set the Observer's PrerenderContents to NULL to | 743 // RenderViewHost. Otherwise set the Observer's PrerenderContents to NULL to |
738 // avoid any more messages being sent. | 744 // avoid any more messages being sent. |
739 if (render_view_host_observer_.get()) | 745 if (render_view_host_observer_.get()) |
740 render_view_host_observer_->set_prerender_contents(NULL); | 746 render_view_host_observer_->set_prerender_contents(NULL); |
741 } | 747 } |
742 | 748 |
743 void PrerenderContents::RendererUnresponsive(RenderViewHost* render_view_host, | 749 void PrerenderContents::RendererUnresponsive(RenderViewHost* render_view_host, |
744 bool is_during_unload) { | 750 bool is_during_unload) { |
745 DCHECK_EQ(render_view_host_, render_view_host); | 751 DCHECK_EQ(render_view_host_, render_view_host); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
822 } | 828 } |
823 return render_view_host_; | 829 return render_view_host_; |
824 } | 830 } |
825 | 831 |
826 void PrerenderContents::CommitHistory(TabContents* tc) { | 832 void PrerenderContents::CommitHistory(TabContents* tc) { |
827 if (tab_contents_delegate_.get()) | 833 if (tab_contents_delegate_.get()) |
828 tab_contents_delegate_->CommitHistory(tc); | 834 tab_contents_delegate_->CommitHistory(tc); |
829 } | 835 } |
830 | 836 |
831 } // namespace prerender | 837 } // namespace prerender |
OLD | NEW |