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

Side by Side Diff: chrome/browser/renderer_host/offline_resource_handler.cc

Issue 8662047: base::Bind: Implement a 1-arity CancelableCallback and use this to implement (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comment fixes. Created 9 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
« no previous file with comments | « chrome/browser/renderer_host/offline_resource_handler.h ('k') | net/base/completion_callback.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/renderer_host/offline_resource_handler.h" 5 #include "chrome/browser/renderer_host/offline_resource_handler.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 27 matching lines...) Expand all
38 render_view_id_(route_id), 38 render_view_id_(route_id),
39 rdh_(rdh), 39 rdh_(rdh),
40 request_(request), 40 request_(request),
41 appcache_service_(appcache_service), 41 appcache_service_(appcache_service),
42 deferred_request_id_(-1) { 42 deferred_request_id_(-1) {
43 DCHECK(appcache_service_); 43 DCHECK(appcache_service_);
44 } 44 }
45 45
46 OfflineResourceHandler::~OfflineResourceHandler() { 46 OfflineResourceHandler::~OfflineResourceHandler() {
47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
48 DCHECK(!appcache_completion_callback_.get()); 48 DCHECK(appcache_completion_callback_.IsCancelled());
49 } 49 }
50 50
51 bool OfflineResourceHandler::OnUploadProgress(int request_id, 51 bool OfflineResourceHandler::OnUploadProgress(int request_id,
52 uint64 position, 52 uint64 position,
53 uint64 size) { 53 uint64 size) {
54 return next_handler_->OnUploadProgress(request_id, position, size); 54 return next_handler_->OnUploadProgress(request_id, position, size);
55 } 55 }
56 56
57 bool OfflineResourceHandler::OnRequestRedirected( 57 bool OfflineResourceHandler::OnRequestRedirected(
58 int request_id, 58 int request_id,
(...skipping 11 matching lines...) Expand all
70 } 70 }
71 71
72 bool OfflineResourceHandler::OnResponseCompleted( 72 bool OfflineResourceHandler::OnResponseCompleted(
73 int request_id, 73 int request_id,
74 const net::URLRequestStatus& status, 74 const net::URLRequestStatus& status,
75 const std::string& security_info) { 75 const std::string& security_info) {
76 return next_handler_->OnResponseCompleted(request_id, status, security_info); 76 return next_handler_->OnResponseCompleted(request_id, status, security_info);
77 } 77 }
78 78
79 void OfflineResourceHandler::OnRequestClosed() { 79 void OfflineResourceHandler::OnRequestClosed() {
80 if (appcache_completion_callback_) { 80 if (!appcache_completion_callback_.IsCancelled())
81 appcache_completion_callback_->Cancel(); 81 appcache_completion_callback_.Cancel();
82 appcache_completion_callback_.release(); 82
83 Release(); // Balanced with OnWillStart
84 }
85 next_handler_->OnRequestClosed(); 83 next_handler_->OnRequestClosed();
86 } 84 }
87 85
88 void OfflineResourceHandler::OnCanHandleOfflineComplete(int rv) { 86 void OfflineResourceHandler::OnCanHandleOfflineComplete(int rv) {
89 CHECK(appcache_completion_callback_); 87 // Cancel() to break the circular reference cycle.
90 appcache_completion_callback_ = NULL; 88 appcache_completion_callback_.Cancel();
89
91 if (deferred_request_id_ == -1) { 90 if (deferred_request_id_ == -1) {
92 LOG(WARNING) << "OnCanHandleOfflineComplete called after completion: " 91 DLOG(FATAL) << "OnCanHandleOfflineComplete called after completion: "
93 << " this=" << this; 92 << " this=" << this;
94 NOTREACHED();
95 return; 93 return;
96 } 94 }
95
97 if (rv == net::OK) { 96 if (rv == net::OK) {
98 Resume(); 97 Resume();
99 Release(); // Balanced with OnWillStart
100 } else { 98 } else {
101 BrowserThread::PostTask( 99 BrowserThread::PostTask(
102 BrowserThread::UI, FROM_HERE, 100 BrowserThread::UI, FROM_HERE,
103 base::Bind(&OfflineResourceHandler::ShowOfflinePage, this)); 101 base::Bind(&OfflineResourceHandler::ShowOfflinePage, this));
104 } 102 }
105 } 103 }
106 104
107 bool OfflineResourceHandler::OnWillStart(int request_id, 105 bool OfflineResourceHandler::OnWillStart(int request_id,
108 const GURL& url, 106 const GURL& url,
109 bool* defer) { 107 bool* defer) {
110 if (ShouldShowOfflinePage(url)) { 108 if (!ShouldShowOfflinePage(url))
111 deferred_request_id_ = request_id; 109 return next_handler_->OnWillStart(request_id, url, defer);
112 deferred_url_ = url;
113 DVLOG(1) << "OnWillStart: this=" << this << ", request id=" << request_id
114 << ", url=" << url;
115 AddRef(); // Balanced with OnCanHandleOfflineComplete
116 DCHECK(!appcache_completion_callback_);
117 appcache_completion_callback_ =
118 new net::CancelableOldCompletionCallback<OfflineResourceHandler>(
119 this, &OfflineResourceHandler::OnCanHandleOfflineComplete);
120 appcache_service_->CanHandleMainResourceOffline(
121 url, request_->first_party_for_cookies(),
122 appcache_completion_callback_);
123 110
124 *defer = true; 111 deferred_request_id_ = request_id;
125 return true; 112 deferred_url_ = url;
126 } 113 DVLOG(1) << "OnWillStart: this=" << this << ", request id=" << request_id
127 return next_handler_->OnWillStart(request_id, url, defer); 114 << ", url=" << url;
115
116 DCHECK(appcache_completion_callback_.IsCancelled());
117
118 // |appcache_completion_callback_| holds a reference to |this|, so there is a
119 // circular reference; however, either
120 // OfflineResourceHandler::OnCanHandleOfflineComplete cancels the callback
121 // (thus dropping the reference), or CanHandleMainResourceOffline calls the
122 // callback which Resets it.
123 appcache_completion_callback_.Reset(
124 base::Bind(&OfflineResourceHandler::OnCanHandleOfflineComplete, this));
125 appcache_service_->CanHandleMainResourceOffline(
126 url, request_->first_party_for_cookies(),
127 appcache_completion_callback_.callback());
128
129 *defer = true;
130 return true;
128 } 131 }
129 132
130 // We'll let the original event handler provide a buffer, and reuse it for 133 // We'll let the original event handler provide a buffer, and reuse it for
131 // subsequent reads until we're done buffering. 134 // subsequent reads until we're done buffering.
132 bool OfflineResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf, 135 bool OfflineResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf,
133 int* buf_size, int min_size) { 136 int* buf_size, int min_size) {
134 return next_handler_->OnWillRead(request_id, buf, buf_size, min_size); 137 return next_handler_->OnWillRead(request_id, buf, buf_size, min_size);
135 } 138 }
136 139
137 bool OfflineResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { 140 bool OfflineResourceHandler::OnReadCompleted(int request_id, int* bytes_read) {
(...skipping 16 matching lines...) Expand all
154 NOTREACHED(); 157 NOTREACHED();
155 return; 158 return;
156 } 159 }
157 if (proceed) { 160 if (proceed) {
158 Resume(); 161 Resume();
159 } else { 162 } else {
160 int request_id = deferred_request_id_; 163 int request_id = deferred_request_id_;
161 ClearRequestInfo(); 164 ClearRequestInfo();
162 rdh_->CancelRequest(process_host_id_, request_id, false); 165 rdh_->CancelRequest(process_host_id_, request_id, false);
163 } 166 }
164 Release(); // Balanced with OnWillStart
165 } 167 }
166 168
167 void OfflineResourceHandler::ClearRequestInfo() { 169 void OfflineResourceHandler::ClearRequestInfo() {
168 deferred_url_ = GURL(); 170 deferred_url_ = GURL();
169 deferred_request_id_ = -1; 171 deferred_request_id_ = -1;
170 } 172 }
171 173
172 bool OfflineResourceHandler::IsRemote(const GURL& url) const { 174 bool OfflineResourceHandler::IsRemote(const GURL& url) const {
173 return url.SchemeIs(chrome::kFtpScheme) || 175 return url.SchemeIs(chrome::kFtpScheme) ||
174 url.SchemeIs(chrome::kHttpScheme) || 176 url.SchemeIs(chrome::kHttpScheme) ||
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 TabContents* tab_contents = render_view_host ? 209 TabContents* tab_contents = render_view_host ?
208 render_view_host->delegate()->GetAsTabContents() : NULL; 210 render_view_host->delegate()->GetAsTabContents() : NULL;
209 // There is a chance that the tab closed after we decided to show 211 // There is a chance that the tab closed after we decided to show
210 // the offline page on the IO thread and before we actually show the 212 // the offline page on the IO thread and before we actually show the
211 // offline page here on the UI thread. 213 // offline page here on the UI thread.
212 if (tab_contents) 214 if (tab_contents)
213 (new chromeos::OfflineLoadPage(tab_contents, deferred_url_, this))-> 215 (new chromeos::OfflineLoadPage(tab_contents, deferred_url_, this))->
214 Show(); 216 Show();
215 } 217 }
216 } 218 }
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/offline_resource_handler.h ('k') | net/base/completion_callback.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698