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