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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/prerender/prerender_handle.h" 6 7 #include <algorithm> 8 9 #include "base/logging.h" 10 #include "chrome/browser/prerender/prerender_contents.h" 11 #include "content/public/browser/web_contents.h" 12 13 namespace prerender { 14 15 PrerenderHandle::Observer::Observer() { 16 } 17 18 PrerenderHandle::Observer::~Observer() { 19 } 20 21 PrerenderHandle::~PrerenderHandle() { 22 if (prerender_data_.get()) { 23 prerender_data_->contents()->RemoveObserver(this); 24 } 25 } 26 27 void PrerenderHandle::SetObserver(Observer* observer) { 28 DCHECK_NE(static_cast<Observer*>(NULL), observer); 29 observer_ = observer; 30 } 31 32 void PrerenderHandle::OnNavigateAway() { 33 DCHECK(CalledOnValidThread()); 34 if (prerender_data_.get()) 35 prerender_data_->OnHandleNavigatedAway(this); 36 } 37 38 void PrerenderHandle::OnCancel() { 39 DCHECK(CalledOnValidThread()); 40 if (prerender_data_.get()) 41 prerender_data_->OnHandleCanceled(this); 42 } 43 44 bool PrerenderHandle::IsPrerendering() const { 45 DCHECK(CalledOnValidThread()); 46 return prerender_data_.get() != NULL; 47 } 48 49 bool PrerenderHandle::IsFinishedLoading() const { 50 DCHECK(CalledOnValidThread()); 51 if (!prerender_data_.get()) 52 return false; 53 return prerender_data_->contents()->has_finished_loading(); 54 } 55 56 bool PrerenderHandle::IsAbandoned() const { 57 DCHECK(CalledOnValidThread()); 58 return prerender_data_ && !prerender_data_->abandon_time().is_null(); 59 } 60 61 PrerenderContents* PrerenderHandle::contents() const { 62 DCHECK(CalledOnValidThread()); 63 return prerender_data_ ? prerender_data_->contents() : NULL; 64 } 65 66 bool PrerenderHandle::Matches( 67 const GURL& url, 68 const content::SessionStorageNamespace* session_storage_namespace) const { 69 DCHECK(CalledOnValidThread()); 70 if (!prerender_data_.get()) 71 return false; 72 return prerender_data_->contents()->Matches(url, session_storage_namespace); 73 } 74 75 PrerenderHandle::PrerenderHandle( 76 PrerenderManager::PrerenderData* prerender_data) 77 : observer_(NULL), 78 weak_ptr_factory_(this) { 79 if (prerender_data) { 80 prerender_data_ = prerender_data->AsWeakPtr(); 81 prerender_data->OnHandleCreated(this); 82 } 83 } 84 85 void PrerenderHandle::OnPrerenderStart(PrerenderContents* prerender_contents) { 86 DCHECK(CalledOnValidThread()); 87 DCHECK(prerender_data_.get()); 88 DCHECK_EQ(prerender_data_->contents(), prerender_contents); 89 if (observer_) 90 observer_->OnPrerenderStart(this); 91 } 92 93 void PrerenderHandle::OnPrerenderStopLoading( 94 PrerenderContents* prerender_contents) { 95 DCHECK(CalledOnValidThread()); 96 DCHECK(prerender_data_.get()); 97 DCHECK_EQ(prerender_data_->contents(), prerender_contents); 98 if (observer_) 99 observer_->OnPrerenderStopLoading(this); 100 } 101 102 void PrerenderHandle::OnPrerenderDomContentLoaded( 103 PrerenderContents* prerender_contents) { 104 DCHECK(CalledOnValidThread()); 105 DCHECK(prerender_data_.get()); 106 DCHECK_EQ(prerender_data_->contents(), prerender_contents); 107 if (observer_) 108 observer_->OnPrerenderDomContentLoaded(this); 109 } 110 111 void PrerenderHandle::OnPrerenderStop(PrerenderContents* prerender_contents) { 112 DCHECK(CalledOnValidThread()); 113 if (observer_) 114 observer_->OnPrerenderStop(this); 115 } 116 117 void PrerenderHandle::OnPrerenderCreatedMatchCompleteReplacement( 118 PrerenderContents* contents, PrerenderContents* replacement) { 119 DCHECK(CalledOnValidThread()); 120 121 // This should occur in the middle of the surgery on the PrerenderData, and 122 // so we expect to not have our new contents in our PrerenderData yet. The 123 // switch occurs in 124 // PrerenderManager::PrerenderData::MakeIntoMatchCompleteReplacement, so 125 // this method only needs to switch observing. 126 127 contents->RemoveObserver(this); 128 replacement->AddObserver(this); 129 if (observer_) 130 observer_->OnPrerenderCreatedMatchCompleteReplacement(this); 131 } 132 133 bool PrerenderHandle::RepresentingSamePrerenderAs( 134 PrerenderHandle* other) const { 135 return other && other->prerender_data_.get() && prerender_data_.get() 136 && prerender_data_.get() == other->prerender_data_.get(); 137 } 138 139 content::SessionStorageNamespace* 140 PrerenderHandle::GetSessionStorageNamespace() const { 141 if (!prerender_data_.get()) 142 return NULL; 143 return prerender_data_->contents()->GetSessionStorageNamespace(); 144 } 145 146 int PrerenderHandle::GetChildId() const { 147 if (!prerender_data_.get()) 148 return -1; 149 return prerender_data_->contents()->child_id(); 150 } 151 152 } // namespace prerender 153