Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / prerender / prerender_handle.cc
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