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.
5 #include "chrome/browser/prerender/prerender_handle.h"
9 #include "base/logging.h"
10 #include "chrome/browser/prerender/prerender_contents.h"
11 #include "content/public/browser/web_contents.h"
15 PrerenderHandle::Observer::Observer() {
18 PrerenderHandle::Observer::~Observer() {
21 PrerenderHandle::~PrerenderHandle() {
22 if (prerender_data_
.get()) {
23 prerender_data_
->contents()->RemoveObserver(this);
27 void PrerenderHandle::SetObserver(Observer
* observer
) {
28 DCHECK_NE(static_cast<Observer
*>(NULL
), observer
);
32 void PrerenderHandle::OnNavigateAway() {
33 DCHECK(CalledOnValidThread());
34 if (prerender_data_
.get())
35 prerender_data_
->OnHandleNavigatedAway(this);
38 void PrerenderHandle::OnCancel() {
39 DCHECK(CalledOnValidThread());
40 if (prerender_data_
.get())
41 prerender_data_
->OnHandleCanceled(this);
44 bool PrerenderHandle::IsPrerendering() const {
45 DCHECK(CalledOnValidThread());
46 return prerender_data_
.get() != NULL
;
49 bool PrerenderHandle::IsFinishedLoading() const {
50 DCHECK(CalledOnValidThread());
51 if (!prerender_data_
.get())
53 return prerender_data_
->contents()->has_finished_loading();
56 PrerenderContents
* PrerenderHandle::contents() const {
57 DCHECK(CalledOnValidThread());
58 return prerender_data_
? prerender_data_
->contents() : NULL
;
61 bool PrerenderHandle::Matches(
63 const content::SessionStorageNamespace
* session_storage_namespace
) const {
64 DCHECK(CalledOnValidThread());
65 if (!prerender_data_
.get())
67 return prerender_data_
->contents()->Matches(url
, session_storage_namespace
);
70 PrerenderHandle::PrerenderHandle(
71 PrerenderManager::PrerenderData
* prerender_data
)
73 weak_ptr_factory_(this) {
75 prerender_data_
= prerender_data
->AsWeakPtr();
76 prerender_data
->OnHandleCreated(this);
80 void PrerenderHandle::OnPrerenderStart(PrerenderContents
* prerender_contents
) {
81 DCHECK(CalledOnValidThread());
82 DCHECK(prerender_data_
.get());
83 DCHECK_EQ(prerender_data_
->contents(), prerender_contents
);
85 observer_
->OnPrerenderStart(this);
88 void PrerenderHandle::OnPrerenderStopLoading(
89 PrerenderContents
* prerender_contents
) {
90 DCHECK(CalledOnValidThread());
91 DCHECK(prerender_data_
.get());
92 DCHECK_EQ(prerender_data_
->contents(), prerender_contents
);
94 observer_
->OnPrerenderStopLoading(this);
97 void PrerenderHandle::OnPrerenderDomContentLoaded(
98 PrerenderContents
* prerender_contents
) {
99 DCHECK(CalledOnValidThread());
100 DCHECK(prerender_data_
.get());
101 DCHECK_EQ(prerender_data_
->contents(), prerender_contents
);
103 observer_
->OnPrerenderDomContentLoaded(this);
106 void PrerenderHandle::OnPrerenderStop(PrerenderContents
* prerender_contents
) {
107 DCHECK(CalledOnValidThread());
109 observer_
->OnPrerenderStop(this);
112 void PrerenderHandle::OnPrerenderCreatedMatchCompleteReplacement(
113 PrerenderContents
* contents
, PrerenderContents
* replacement
) {
114 DCHECK(CalledOnValidThread());
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
119 // PrerenderManager::PrerenderData::MakeIntoMatchCompleteReplacement, so
120 // this method only needs to switch observing.
122 contents
->RemoveObserver(this);
123 replacement
->AddObserver(this);
125 observer_
->OnPrerenderCreatedMatchCompleteReplacement(this);
128 bool PrerenderHandle::RepresentingSamePrerenderAs(
129 PrerenderHandle
* other
) const {
130 return other
&& other
->prerender_data_
.get() && prerender_data_
.get()
131 && prerender_data_
.get() == other
->prerender_data_
.get();
134 content::SessionStorageNamespace
*
135 PrerenderHandle::GetSessionStorageNamespace() const {
136 if (!prerender_data_
.get())
138 return prerender_data_
->contents()->GetSessionStorageNamespace();
141 int PrerenderHandle::GetChildId() const {
142 if (!prerender_data_
.get())
144 return prerender_data_
->contents()->child_id();
147 } // namespace prerender