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