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