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 "chrome/browser/browser_thread.h" | 10 #include "chrome/browser/browser_thread.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 ResourceResponse* response) { | 52 ResourceResponse* response) { |
53 // At this point, we know that the response is safe to send back to the | 53 // At this point, we know that the response is safe to send back to the |
54 // renderer: it is not a download, and it has passed the SSL and safe | 54 // renderer: it is not a download, and it has passed the SSL and safe |
55 // browsing checks. | 55 // browsing checks. |
56 // We should not have already started the transition before now. | 56 // We should not have already started the transition before now. |
57 DCHECK(!in_cross_site_transition_); | 57 DCHECK(!in_cross_site_transition_); |
58 has_started_response_ = true; | 58 has_started_response_ = true; |
59 | 59 |
60 // Look up the request and associated info. | 60 // Look up the request and associated info. |
61 GlobalRequestID global_id(render_process_host_id_, request_id); | 61 GlobalRequestID global_id(render_process_host_id_, request_id); |
62 URLRequest* request = rdh_->GetURLRequest(global_id); | 62 net::URLRequest* request = rdh_->GetURLRequest(global_id); |
63 if (!request) { | 63 if (!request) { |
64 DLOG(WARNING) << "Request wasn't found"; | 64 DLOG(WARNING) << "Request wasn't found"; |
65 return false; | 65 return false; |
66 } | 66 } |
67 ResourceDispatcherHostRequestInfo* info = | 67 ResourceDispatcherHostRequestInfo* info = |
68 ResourceDispatcherHost::InfoForRequest(request); | 68 ResourceDispatcherHost::InfoForRequest(request); |
69 | 69 |
70 // If this is a download, just pass the response through without doing a | 70 // If this is a download, just pass the response through without doing a |
71 // cross-site check. The renderer will see it is a download and abort the | 71 // cross-site check. The renderer will see it is a download and abort the |
72 // request. | 72 // request. |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 | 134 |
135 // We can now send the response to the new renderer, which will cause | 135 // We can now send the response to the new renderer, which will cause |
136 // TabContents to swap in the new renderer and destroy the old one. | 136 // TabContents to swap in the new renderer and destroy the old one. |
137 void CrossSiteResourceHandler::ResumeResponse() { | 137 void CrossSiteResourceHandler::ResumeResponse() { |
138 DCHECK(request_id_ != -1); | 138 DCHECK(request_id_ != -1); |
139 DCHECK(in_cross_site_transition_); | 139 DCHECK(in_cross_site_transition_); |
140 in_cross_site_transition_ = false; | 140 in_cross_site_transition_ = false; |
141 | 141 |
142 // Find the request for this response. | 142 // Find the request for this response. |
143 GlobalRequestID global_id(render_process_host_id_, request_id_); | 143 GlobalRequestID global_id(render_process_host_id_, request_id_); |
144 URLRequest* request = rdh_->GetURLRequest(global_id); | 144 net::URLRequest* request = rdh_->GetURLRequest(global_id); |
145 if (!request) { | 145 if (!request) { |
146 DLOG(WARNING) << "Resuming a request that wasn't found"; | 146 DLOG(WARNING) << "Resuming a request that wasn't found"; |
147 return; | 147 return; |
148 } | 148 } |
149 | 149 |
150 if (has_started_response_) { | 150 if (has_started_response_) { |
151 // Send OnResponseStarted to the new renderer. | 151 // Send OnResponseStarted to the new renderer. |
152 DCHECK(response_); | 152 DCHECK(response_); |
153 next_handler_->OnResponseStarted(request_id_, response_); | 153 next_handler_->OnResponseStarted(request_id_, response_); |
154 | 154 |
(...skipping 27 matching lines...) Expand all Loading... |
182 void CrossSiteResourceHandler::StartCrossSiteTransition( | 182 void CrossSiteResourceHandler::StartCrossSiteTransition( |
183 int request_id, | 183 int request_id, |
184 ResourceResponse* response, | 184 ResourceResponse* response, |
185 const GlobalRequestID& global_id) { | 185 const GlobalRequestID& global_id) { |
186 in_cross_site_transition_ = true; | 186 in_cross_site_transition_ = true; |
187 request_id_ = request_id; | 187 request_id_ = request_id; |
188 response_ = response; | 188 response_ = response; |
189 | 189 |
190 // Store this handler on the ExtraRequestInfo, so that RDH can call our | 190 // Store this handler on the ExtraRequestInfo, so that RDH can call our |
191 // ResumeResponse method when the close ACK is received. | 191 // ResumeResponse method when the close ACK is received. |
192 URLRequest* request = rdh_->GetURLRequest(global_id); | 192 net::URLRequest* request = rdh_->GetURLRequest(global_id); |
193 if (!request) { | 193 if (!request) { |
194 DLOG(WARNING) << "Cross site response for a request that wasn't found"; | 194 DLOG(WARNING) << "Cross site response for a request that wasn't found"; |
195 return; | 195 return; |
196 } | 196 } |
197 ResourceDispatcherHostRequestInfo* info = | 197 ResourceDispatcherHostRequestInfo* info = |
198 ResourceDispatcherHost::InfoForRequest(request); | 198 ResourceDispatcherHost::InfoForRequest(request); |
199 info->set_cross_site_handler(this); | 199 info->set_cross_site_handler(this); |
200 | 200 |
201 if (has_started_response_) { | 201 if (has_started_response_) { |
202 // Pause the request until the old renderer is finished and the new | 202 // Pause the request until the old renderer is finished and the new |
203 // renderer is ready. | 203 // renderer is ready. |
204 rdh_->PauseRequest(render_process_host_id_, request_id, true); | 204 rdh_->PauseRequest(render_process_host_id_, request_id, true); |
205 } | 205 } |
206 // If our OnResponseStarted wasn't called, then we're being called by | 206 // If our OnResponseStarted wasn't called, then we're being called by |
207 // OnResponseCompleted after a failure. We don't need to pause, because | 207 // OnResponseCompleted after a failure. We don't need to pause, because |
208 // there will be no reads. | 208 // there will be no reads. |
209 | 209 |
210 // Tell the tab responsible for this request that a cross-site response is | 210 // Tell the tab responsible for this request that a cross-site response is |
211 // starting, so that it can tell its old renderer to run its onunload | 211 // starting, so that it can tell its old renderer to run its onunload |
212 // handler now. We will wait to hear the corresponding ClosePage_ACK. | 212 // handler now. We will wait to hear the corresponding ClosePage_ACK. |
213 CallRenderViewHostRendererManagementDelegate( | 213 CallRenderViewHostRendererManagementDelegate( |
214 render_process_host_id_, render_view_id_, | 214 render_process_host_id_, render_view_id_, |
215 &RenderViewHostDelegate::RendererManagement::OnCrossSiteResponse, | 215 &RenderViewHostDelegate::RendererManagement::OnCrossSiteResponse, |
216 render_process_host_id_, request_id); | 216 render_process_host_id_, request_id); |
217 | 217 |
218 // TODO(creis): If the above call should fail, then we need to notify the IO | 218 // TODO(creis): If the above call should fail, then we need to notify the IO |
219 // thread to proceed anyway, using ResourceDispatcherHost::OnClosePageACK. | 219 // thread to proceed anyway, using ResourceDispatcherHost::OnClosePageACK. |
220 } | 220 } |
OLD | NEW |