Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: chrome/browser/prerender/prerender_handle.cc

Issue 11316311: Make PrerenderHandle an observer of PrerenderContents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: prerender tracker test fix Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/prerender/prerender_handle.h" 5 #include "chrome/browser/prerender/prerender_handle.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "chrome/browser/prerender/prerender_contents.h" 9 #include "chrome/browser/prerender/prerender_contents.h"
10 10
11 namespace prerender { 11 namespace prerender {
12 12
13 PrerenderHandle::Observer::~Observer() {
14 }
15
16 PrerenderHandle::Observer::Observer() {
17 }
18
13 PrerenderHandle::~PrerenderHandle() { 19 PrerenderHandle::~PrerenderHandle() {
14 DCHECK(!IsValid()); 20 if (prerender_data_)
15 // This shouldn't occur, but we also shouldn't leak if it does. 21 prerender_data_->contents()->RemoveObserver(this);
16 if (IsValid()) 22 }
17 OnCancel(); 23
24 void PrerenderHandle::AddObserver(Observer* observer) {
25 observer_list_.AddObserver(observer);
26 }
27
28 void PrerenderHandle::RemoveObserver(Observer* observer) {
29 observer_list_.RemoveObserver(observer);
18 } 30 }
19 31
20 void PrerenderHandle::OnNavigateAway() { 32 void PrerenderHandle::OnNavigateAway() {
21 DCHECK(CalledOnValidThread()); 33 DCHECK(CalledOnValidThread());
22 if (!IsValid()) 34 if (prerender_data_)
23 return; 35 prerender_data_->OnHandleNavigatedAway(this);
24 prerender_data_->OnNavigateAwayByHandle();
25 prerender_data_.reset();
26 } 36 }
27 37
28 void PrerenderHandle::OnCancel() { 38 void PrerenderHandle::OnCancel() {
29 DCHECK(CalledOnValidThread()); 39 DCHECK(CalledOnValidThread());
30 if (!IsValid()) 40 DCHECK(!has_been_canceled_);
31 return; 41 has_been_canceled_ = true;
32 prerender_data_->OnCancelByHandle(); 42 if (prerender_data_)
33 prerender_data_.reset(); 43 prerender_data_->OnHandleCanceled(this);
34 }
35
36 bool PrerenderHandle::IsValid() const {
37 return prerender_data_ != NULL;
38 }
39
40 bool PrerenderHandle::IsPending() const {
41 DCHECK(CalledOnValidThread());
42 return prerender_data_ && !prerender_data_->contents();
43 } 44 }
44 45
45 bool PrerenderHandle::IsPrerendering() const { 46 bool PrerenderHandle::IsPrerendering() const {
46 DCHECK(CalledOnValidThread()); 47 DCHECK(CalledOnValidThread());
47 return prerender_data_ && prerender_data_->contents(); 48 return prerender_data_ != NULL;
48 } 49 }
49 50
50 bool PrerenderHandle::IsFinishedLoading() const { 51 bool PrerenderHandle::IsFinishedLoading() const {
51 DCHECK(CalledOnValidThread()); 52 DCHECK(CalledOnValidThread());
52 if (!prerender_data_ || IsPending()) 53 if (!prerender_data_)
53 return false; 54 return false;
54 return prerender_data_->contents()->has_finished_loading(); 55 return prerender_data_->contents()->has_finished_loading();
55 } 56 }
56 57
57 PrerenderHandle::PrerenderHandle( 58 PrerenderHandle::PrerenderHandle(
58 PrerenderManager::PrerenderData* prerender_data) 59 PrerenderManager::PrerenderData* prerender_data)
59 : prerender_data_(prerender_data->AsWeakPtr()), 60 : has_been_canceled_(false),
60 weak_ptr_factory_(this) { 61 weak_ptr_factory_(this) {
61 prerender_data->OnNewHandle(); 62 if (prerender_data) {
63 prerender_data_ = prerender_data->AsWeakPtr();
64 prerender_data->OnHandleCreated(this);
65 }
62 } 66 }
63 67
64 void PrerenderHandle::SwapPrerenderDataWith( 68 void PrerenderHandle::AdoptPrerenderDataFrom(PrerenderHandle* other_handle) {
65 PrerenderHandle* other_prerender_handle) { 69 DCHECK_EQ(static_cast<PrerenderManager::PrerenderData*>(NULL),
70 prerender_data_);
71 if (other_handle->prerender_data_ &&
72 other_handle->prerender_data_->contents()) {
73 other_handle->prerender_data_->contents()->RemoveObserver(other_handle);
74 }
75
76 prerender_data_ = other_handle->prerender_data_;
77 other_handle->prerender_data_.reset();
78
79 if (prerender_data_) {
80 DCHECK_NE(static_cast<PrerenderContents*>(NULL),
81 prerender_data_->contents());
82 prerender_data_->contents()->AddObserver(this);
83 // We are joining a prerender that has already started so we fire off an
84 // extra start event at ourselves.
85 OnPrerenderStart(prerender_data_->contents());
86 }
87 }
88
89 void PrerenderHandle::OnPrerenderStart(PrerenderContents* prerender_contents) {
66 DCHECK(CalledOnValidThread()); 90 DCHECK(CalledOnValidThread());
67 DCHECK(other_prerender_handle); 91 DCHECK_EQ(prerender_data_->contents(), prerender_contents);
68 std::swap(prerender_data_, other_prerender_handle->prerender_data_); 92 FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStart(this));
93 }
94
95 void PrerenderHandle::OnPrerenderAddAlias(PrerenderContents* prerender_contents,
96 const GURL& alias_url) {
97 DCHECK(CalledOnValidThread());
98 DCHECK_EQ(prerender_data_->contents(), prerender_contents);
99 FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderAddAlias(this,
100 alias_url));
101 }
102
103 void PrerenderHandle::OnPrerenderStop(PrerenderContents* prerender_contents) {
104 DCHECK(CalledOnValidThread());
105 // No DCHECKs on the underlying prerender_data, since prerenders are deleted
106 // asyncronously and so the handle may have no prerender data at the time it's
107 // notified of the prerender ending.
mmenke 2012/12/12 16:54:12 This comment isn't correct. OnPrerenderStop is ca
gavinp 2012/12/13 13:38:03 Done.
108 FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStop(this));
109 }
110
111 void PrerenderHandle::OnPrerenderCreatedMatchCompleteReplacement(
112 PrerenderContents* contents, PrerenderContents* replacement) {
113 DCHECK(CalledOnValidThread());
114
115 // This should occur in the middle of the surgery on the PrerenderData, and
116 // so we expect to not have our new contents in our PrerenderData yet. The
117 // switch occurs in
118 // PrerenderManager::PrerenderData::MakeIntoMatchCompleteReplacement, so
119 // this method only needs to switch observing.
120
121 contents->RemoveObserver(this);
122 replacement->AddObserver(this);
mmenke 2012/12/11 19:53:45 The replacement won't send the stop message, since
gavinp 2012/12/13 13:38:03 Fixed, now sent. Overall, your comment elsewhere a
69 } 123 }
70 124
71 } // namespace prerender 125 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698