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

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: rebase trunk & add upstream remediation 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 }
15 // This shouldn't occur, but we also shouldn't leak if it does. 21
16 if (IsValid()) 22 void PrerenderHandle::AddObserver(Observer* observer) {
17 OnCancel(); 23 observer_list_.AddObserver(observer);
24 }
25
26 void PrerenderHandle::RemoveObserver(Observer* observer) {
27 observer_list_.RemoveObserver(observer);
18 } 28 }
19 29
20 void PrerenderHandle::OnNavigateAway() { 30 void PrerenderHandle::OnNavigateAway() {
21 DCHECK(CalledOnValidThread()); 31 DCHECK(CalledOnValidThread());
22 if (!IsValid()) 32 if (prerender_data_)
23 return; 33 prerender_data_->OnNavigateAwayByHandle(this);
24 prerender_data_->OnNavigateAwayByHandle();
25 prerender_data_.reset();
26 } 34 }
27 35
28 void PrerenderHandle::OnCancel() { 36 void PrerenderHandle::OnCancel() {
29 DCHECK(CalledOnValidThread()); 37 DCHECK(CalledOnValidThread());
30 if (!IsValid()) 38 has_been_canceled_ = true;
31 return; 39 if (prerender_data_)
32 prerender_data_->OnCancelByHandle(); 40 prerender_data_->OnCancelByHandle(this);
33 prerender_data_.reset();
34 } 41 }
35 42
36 bool PrerenderHandle::IsValid() const { 43 bool PrerenderHandle::IsValid() const {
37 return prerender_data_ != NULL; 44 return prerender_data_ != NULL;
38 } 45 }
39 46
40 bool PrerenderHandle::IsPending() const {
41 DCHECK(CalledOnValidThread());
42 return prerender_data_ && !prerender_data_->contents();
43 }
44
45 bool PrerenderHandle::IsPrerendering() const { 47 bool PrerenderHandle::IsPrerendering() const {
46 DCHECK(CalledOnValidThread()); 48 DCHECK(CalledOnValidThread());
47 return prerender_data_ && prerender_data_->contents(); 49 return prerender_data_ && prerender_data_->contents();
48 } 50 }
49 51
50 bool PrerenderHandle::IsFinishedLoading() const { 52 bool PrerenderHandle::IsFinishedLoading() const {
51 DCHECK(CalledOnValidThread()); 53 DCHECK(CalledOnValidThread());
52 if (!prerender_data_ || IsPending()) 54 if (!prerender_data_)
53 return false; 55 return false;
54 return prerender_data_->contents()->has_finished_loading(); 56 return prerender_data_->contents()->has_finished_loading();
55 } 57 }
56 58
57 PrerenderHandle::PrerenderHandle( 59 PrerenderHandle::PrerenderHandle(
58 PrerenderManager::PrerenderData* prerender_data) 60 PrerenderManager::PrerenderData* prerender_data)
59 : prerender_data_(prerender_data->AsWeakPtr()), 61 : has_been_canceled_(false),
60 weak_ptr_factory_(this) { 62 weak_ptr_factory_(this) {
61 prerender_data->OnNewHandle(); 63 if (prerender_data) {
64 prerender_data_ = prerender_data->AsWeakPtr();
65 prerender_data->OnNewHandle(this);
66 }
62 } 67 }
63 68
64 void PrerenderHandle::SwapPrerenderDataWith( 69 void PrerenderHandle::AdoptPrerenderDataFrom(PrerenderHandle* other_handle) {
65 PrerenderHandle* other_prerender_handle) { 70 DCHECK(!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_ && prerender_data_->contents()) {
mmenke 2012/12/07 17:59:29 Since we had a DCHECK, and prerender_data_->conten
gavinp 2012/12/10 17:55:10 What if we're adopting from a prerender handle tha
80 prerender_data_->contents()->AddObserver(this);
81 // If we are joining a prerender that has already started, we fire off an
82 // extra start event at ourselves.
83 if (prerender_data_->contents()->prerendering_has_started())
mmenke 2012/12/07 17:59:29 Shouldn't this just use IsPrerendering(), just lik
gavinp 2012/12/10 17:55:10 Done, and it was redundant anyway.
84 OnPrerenderStart(prerender_data_->contents());
85 }
86 }
87
88 void PrerenderHandle::OnPrerenderStart(PrerenderContents* prerender_contents) {
66 DCHECK(CalledOnValidThread()); 89 DCHECK(CalledOnValidThread());
67 DCHECK(other_prerender_handle); 90 DCHECK_EQ(prerender_data_->contents(), prerender_contents);
68 std::swap(prerender_data_, other_prerender_handle->prerender_data_); 91 FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStart(this));
92 }
93
94 void PrerenderHandle::OnPrerenderAddAlias(PrerenderContents* prerender_contents,
95 const GURL& alias_url) {
96 DCHECK(CalledOnValidThread());
97 DCHECK_EQ(prerender_data_->contents(), prerender_contents);
98 FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderAddAlias(this,
99 alias_url));
100 }
101
102 void PrerenderHandle::OnPrerenderStop(PrerenderContents* prerender_contents) {
103 DCHECK(CalledOnValidThread());
104 // No DCHECKs on the underlying prerender_data, since prerenders are deleted
105 // asyncronously and so the handle may have no prerender data at the time it's
106 // notified of the prerender ending.
107 FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStop(this));
69 } 108 }
70 109
71 } // namespace prerender 110 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698