OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 <string> | 5 #include <string> |
6 | 6 |
7 #include "chrome/browser/renderer_host/cross_site_resource_handler.h" | 7 #include "chrome/browser/renderer_host/cross_site_resource_handler.h" |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop.h" | 10 #include "chrome/browser/chrome_thread.h" |
11 #include "chrome/browser/renderer_host/render_view_host.h" | 11 #include "chrome/browser/renderer_host/render_view_host.h" |
12 #include "chrome/browser/renderer_host/render_view_host_delegate.h" | 12 #include "chrome/browser/renderer_host/render_view_host_delegate.h" |
13 #include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h" | 13 #include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h" |
14 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 // Task to notify the TabContents that a cross-site response has begun, so that | 18 // Task to notify the TabContents that a cross-site response has begun, so that |
19 // TabContents can tell the old page to run its onunload handler. | 19 // TabContents can tell the old page to run its onunload handler. |
20 class CrossSiteNotifyTask : public Task { | 20 class CrossSiteNotifyTask : public Task { |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 // We've already completed the transition, so just pass it through. | 154 // We've already completed the transition, so just pass it through. |
155 return next_handler_->OnResponseCompleted(request_id, status, | 155 return next_handler_->OnResponseCompleted(request_id, status, |
156 security_info); | 156 security_info); |
157 } else { | 157 } else { |
158 // Some types of failures will call OnResponseCompleted without calling | 158 // Some types of failures will call OnResponseCompleted without calling |
159 // CrossSiteResourceHandler::OnResponseStarted. | 159 // CrossSiteResourceHandler::OnResponseStarted. |
160 if (status.status() == URLRequestStatus::CANCELED) { | 160 if (status.status() == URLRequestStatus::CANCELED) { |
161 // Here the request was canceled, which happens when selecting "take me | 161 // Here the request was canceled, which happens when selecting "take me |
162 // back" from an interstitial. Nothing to do but cancel the pending | 162 // back" from an interstitial. Nothing to do but cancel the pending |
163 // render view host. | 163 // render view host. |
164 CancelPendingRenderViewTask* task = | 164 ChromeThread::PostTask( |
165 new CancelPendingRenderViewTask(render_process_host_id_, | 165 ChromeThread::UI, FROM_HERE, |
166 render_view_id_); | 166 new CancelPendingRenderViewTask( |
167 rdh_->ui_loop()->PostTask(FROM_HERE, task); | 167 render_process_host_id_, render_view_id_)); |
168 return next_handler_->OnResponseCompleted(request_id, status, | 168 return next_handler_->OnResponseCompleted(request_id, status, |
169 security_info); | 169 security_info); |
170 } else { | 170 } else { |
171 // An error occured, we should wait now for the cross-site transition, | 171 // An error occured, we should wait now for the cross-site transition, |
172 // so that the error message (e.g., 404) can be displayed to the user. | 172 // so that the error message (e.g., 404) can be displayed to the user. |
173 // Also continue with the logic below to remember that we completed | 173 // Also continue with the logic below to remember that we completed |
174 // during the cross-site transition. | 174 // during the cross-site transition. |
175 ResourceDispatcherHost::GlobalRequestID global_id( | 175 ResourceDispatcherHost::GlobalRequestID global_id( |
176 render_process_host_id_, request_id); | 176 render_process_host_id_, request_id); |
177 StartCrossSiteTransition(request_id, NULL, global_id); | 177 StartCrossSiteTransition(request_id, NULL, global_id); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 // renderer is ready. | 259 // renderer is ready. |
260 rdh_->PauseRequest(render_process_host_id_, request_id, true); | 260 rdh_->PauseRequest(render_process_host_id_, request_id, true); |
261 } | 261 } |
262 // If our OnResponseStarted wasn't called, then we're being called by | 262 // If our OnResponseStarted wasn't called, then we're being called by |
263 // OnResponseCompleted after a failure. We don't need to pause, because | 263 // OnResponseCompleted after a failure. We don't need to pause, because |
264 // there will be no reads. | 264 // there will be no reads. |
265 | 265 |
266 // Tell the tab responsible for this request that a cross-site response is | 266 // Tell the tab responsible for this request that a cross-site response is |
267 // starting, so that it can tell its old renderer to run its onunload | 267 // starting, so that it can tell its old renderer to run its onunload |
268 // handler now. We will wait to hear the corresponding ClosePage_ACK. | 268 // handler now. We will wait to hear the corresponding ClosePage_ACK. |
269 CrossSiteNotifyTask* task = | 269 ChromeThread::PostTask( |
270 new CrossSiteNotifyTask(render_process_host_id_, | 270 ChromeThread::UI, FROM_HERE, |
271 render_view_id_, | 271 new CrossSiteNotifyTask( |
272 request_id); | 272 render_process_host_id_, render_view_id_, request_id)); |
273 rdh_->ui_loop()->PostTask(FROM_HERE, task); | |
274 } | 273 } |
OLD | NEW |