| OLD | NEW |
| 1 // Copyright (c) 2010 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_frame/urlmon_url_request.h" | 5 #include "chrome_frame/urlmon_url_request.h" |
| 6 | 6 |
| 7 #include <wininet.h> | 7 #include <wininet.h> |
| 8 #include <urlmon.h> | 8 #include <urlmon.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 DCHECK(thread_ == 0 || thread_ == base::PlatformThread::CurrentId()); | 51 DCHECK(thread_ == 0 || thread_ == base::PlatformThread::CurrentId()); |
| 52 thread_ = base::PlatformThread::CurrentId(); | 52 thread_ = base::PlatformThread::CurrentId(); |
| 53 status_.Start(); | 53 status_.Start(); |
| 54 // The UrlmonUrlRequest instance can get destroyed in the context of | 54 // The UrlmonUrlRequest instance can get destroyed in the context of |
| 55 // StartAsyncDownload if BindToStorage finishes synchronously with an error. | 55 // StartAsyncDownload if BindToStorage finishes synchronously with an error. |
| 56 // Grab a reference to protect against this. | 56 // Grab a reference to protect against this. |
| 57 scoped_refptr<UrlmonUrlRequest> ref(this); | 57 scoped_refptr<UrlmonUrlRequest> ref(this); |
| 58 HRESULT hr = StartAsyncDownload(); | 58 HRESULT hr = StartAsyncDownload(); |
| 59 if (FAILED(hr) && status_.get_state() != UrlmonUrlRequest::Status::DONE) { | 59 if (FAILED(hr) && status_.get_state() != UrlmonUrlRequest::Status::DONE) { |
| 60 status_.Done(); | 60 status_.Done(); |
| 61 status_.set_result(URLRequestStatus::FAILED, HresultToNetError(hr)); | 61 status_.set_result(net::URLRequestStatus::FAILED, HresultToNetError(hr)); |
| 62 NotifyDelegateAndDie(); | 62 NotifyDelegateAndDie(); |
| 63 } | 63 } |
| 64 return true; | 64 return true; |
| 65 } | 65 } |
| 66 | 66 |
| 67 void UrlmonUrlRequest::Stop() { | 67 void UrlmonUrlRequest::Stop() { |
| 68 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); | 68 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); |
| 69 DCHECK((status_.get_state() != Status::DONE) == (binding_ != NULL)); | 69 DCHECK((status_.get_state() != Status::DONE) == (binding_ != NULL)); |
| 70 Status::State state = status_.get_state(); | 70 Status::State state = status_.get_state(); |
| 71 delegate_ = NULL; | 71 delegate_ = NULL; |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 if (state == Status::WORKING) { | 366 if (state == Status::WORKING) { |
| 367 status_.set_result(result); | 367 status_.set_result(result); |
| 368 | 368 |
| 369 // Special case. If the last request was a redirect and the current OS | 369 // Special case. If the last request was a redirect and the current OS |
| 370 // error value is E_ACCESSDENIED, that means an unsafe redirect was | 370 // error value is E_ACCESSDENIED, that means an unsafe redirect was |
| 371 // attempted. In that case, correct the OS error value to be the more | 371 // attempted. In that case, correct the OS error value to be the more |
| 372 // specific ERR_UNSAFE_REDIRECT error value. | 372 // specific ERR_UNSAFE_REDIRECT error value. |
| 373 if (result == E_ACCESSDENIED) { | 373 if (result == E_ACCESSDENIED) { |
| 374 int http_code = GetHttpResponseStatusFromBinding(binding_); | 374 int http_code = GetHttpResponseStatusFromBinding(binding_); |
| 375 if (300 <= http_code && http_code < 400) { | 375 if (300 <= http_code && http_code < 400) { |
| 376 status_.set_result(URLRequestStatus::FAILED, | 376 status_.set_result(net::URLRequestStatus::FAILED, |
| 377 net::ERR_UNSAFE_REDIRECT); | 377 net::ERR_UNSAFE_REDIRECT); |
| 378 } | 378 } |
| 379 } | 379 } |
| 380 | 380 |
| 381 // The code below seems easy but it is not. :) | 381 // The code below seems easy but it is not. :) |
| 382 // The network policy in Chrome network is that error code/end_of_stream | 382 // The network policy in Chrome network is that error code/end_of_stream |
| 383 // should be returned only as a result of read (or start) request. | 383 // should be returned only as a result of read (or start) request. |
| 384 // Here are the possible cases: | 384 // Here are the possible cases: |
| 385 // pending_data_|pending_read | 385 // pending_data_|pending_read |
| 386 // FALSE |FALSE => EndRequest if no headers, otherwise wait for Read. | 386 // FALSE |FALSE => EndRequest if no headers, otherwise wait for Read. |
| 387 // FALSE |TRUE => EndRequest. | 387 // FALSE |TRUE => EndRequest. |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 | 831 |
| 832 void UrlmonUrlRequest::NotifyDelegateAndDie() { | 832 void UrlmonUrlRequest::NotifyDelegateAndDie() { |
| 833 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); | 833 DCHECK_EQ(thread_, base::PlatformThread::CurrentId()); |
| 834 DVLOG(1) << __FUNCTION__ << me(); | 834 DVLOG(1) << __FUNCTION__ << me(); |
| 835 | 835 |
| 836 PluginUrlRequestDelegate* delegate = delegate_; | 836 PluginUrlRequestDelegate* delegate = delegate_; |
| 837 delegate_ = NULL; | 837 delegate_ = NULL; |
| 838 ReleaseBindings(); | 838 ReleaseBindings(); |
| 839 TerminateTransaction(); | 839 TerminateTransaction(); |
| 840 if (delegate) { | 840 if (delegate) { |
| 841 URLRequestStatus result = status_.get_result(); | 841 net::URLRequestStatus result = status_.get_result(); |
| 842 delegate->OnResponseEnd(id(), result); | 842 delegate->OnResponseEnd(id(), result); |
| 843 } else { | 843 } else { |
| 844 DLOG(WARNING) << __FUNCTION__ << me() << "no delegate"; | 844 DLOG(WARNING) << __FUNCTION__ << me() << "no delegate"; |
| 845 } | 845 } |
| 846 } | 846 } |
| 847 | 847 |
| 848 void UrlmonUrlRequest::TerminateTransaction() { | 848 void UrlmonUrlRequest::TerminateTransaction() { |
| 849 if (cleanup_transaction_ && bind_context_ && moniker_) { | 849 if (cleanup_transaction_ && bind_context_ && moniker_) { |
| 850 // We return INET_E_TERMINATED_BIND from our OnDataAvailable implementation | 850 // We return INET_E_TERMINATED_BIND from our OnDataAvailable implementation |
| 851 // to ensure that the transaction stays around if Chrome decides to issue | 851 // to ensure that the transaction stays around if Chrome decides to issue |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 980 scoped_refptr<UrlmonUrlRequest> new_request; | 980 scoped_refptr<UrlmonUrlRequest> new_request; |
| 981 bool is_started = false; | 981 bool is_started = false; |
| 982 if (pending_request_) { | 982 if (pending_request_) { |
| 983 if (pending_request_->url() != request_info.url) { | 983 if (pending_request_->url() != request_info.url) { |
| 984 DLOG(WARNING) << __FUNCTION__ | 984 DLOG(WARNING) << __FUNCTION__ |
| 985 << "Received unexpected url request for url:" | 985 << "Received unexpected url request for url:" |
| 986 << request_info.url | 986 << request_info.url |
| 987 << ".Pending url request for url:" | 987 << ".Pending url request for url:" |
| 988 << pending_request_->url() | 988 << pending_request_->url() |
| 989 << " was expected."; | 989 << " was expected."; |
| 990 URLRequestStatus result; | 990 net::URLRequestStatus result; |
| 991 result.set_status(URLRequestStatus::FAILED); | 991 result.set_status(net::URLRequestStatus::FAILED); |
| 992 OnResponseEnd(request_id, result); | 992 OnResponseEnd(request_id, result); |
| 993 return; | 993 return; |
| 994 } | 994 } |
| 995 new_request.swap(pending_request_); | 995 new_request.swap(pending_request_); |
| 996 is_started = true; | 996 is_started = true; |
| 997 DVLOG(1) << __FUNCTION__ << new_request->me() | 997 DVLOG(1) << __FUNCTION__ << new_request->me() |
| 998 << " assigned id " << request_id; | 998 << " assigned id " << request_id; |
| 999 } else { | 999 } else { |
| 1000 CComObject<UrlmonUrlRequest>* created_request = NULL; | 1000 CComObject<UrlmonUrlRequest>* created_request = NULL; |
| 1001 CComObject<UrlmonUrlRequest>::CreateInstance(&created_request); | 1001 CComObject<UrlmonUrlRequest>::CreateInstance(&created_request); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1168 const std::string& data) { | 1168 const std::string& data) { |
| 1169 DCHECK_NE(request_id, -1); | 1169 DCHECK_NE(request_id, -1); |
| 1170 DVLOG(1) << __FUNCTION__ << " id: " << request_id; | 1170 DVLOG(1) << __FUNCTION__ << " id: " << request_id; |
| 1171 DCHECK(LookupRequest(request_id) != NULL); | 1171 DCHECK(LookupRequest(request_id) != NULL); |
| 1172 ++calling_delegate_; | 1172 ++calling_delegate_; |
| 1173 delegate_->OnReadComplete(request_id, data); | 1173 delegate_->OnReadComplete(request_id, data); |
| 1174 --calling_delegate_; | 1174 --calling_delegate_; |
| 1175 DVLOG(1) << __FUNCTION__ << " done id: " << request_id; | 1175 DVLOG(1) << __FUNCTION__ << " done id: " << request_id; |
| 1176 } | 1176 } |
| 1177 | 1177 |
| 1178 void UrlmonUrlRequestManager::OnResponseEnd(int request_id, | 1178 void UrlmonUrlRequestManager::OnResponseEnd( |
| 1179 const URLRequestStatus& status) { | 1179 int request_id, |
| 1180 const net::URLRequestStatus& status) { |
| 1180 DCHECK_NE(request_id, -1); | 1181 DCHECK_NE(request_id, -1); |
| 1181 DVLOG(1) << __FUNCTION__; | 1182 DVLOG(1) << __FUNCTION__; |
| 1182 DCHECK(status.status() != URLRequestStatus::CANCELED); | 1183 DCHECK(status.status() != net::URLRequestStatus::CANCELED); |
| 1183 RequestMap::size_type n = request_map_.erase(request_id); | 1184 RequestMap::size_type n = request_map_.erase(request_id); |
| 1184 if (n != 1u) { | 1185 if (n != 1u) { |
| 1185 DLOG(WARNING) << __FUNCTION__ | 1186 DLOG(WARNING) << __FUNCTION__ |
| 1186 << " Failed to find request id:" | 1187 << " Failed to find request id:" |
| 1187 << request_id; | 1188 << request_id; |
| 1188 } | 1189 } |
| 1189 ++calling_delegate_; | 1190 ++calling_delegate_; |
| 1190 delegate_->OnResponseEnd(request_id, status); | 1191 delegate_->OnResponseEnd(request_id, status); |
| 1191 --calling_delegate_; | 1192 --calling_delegate_; |
| 1192 } | 1193 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1238 privacy_info_.privacy_records[UTF8ToWide(url)]; | 1239 privacy_info_.privacy_records[UTF8ToWide(url)]; |
| 1239 | 1240 |
| 1240 privacy_entry.flags |= flags; | 1241 privacy_entry.flags |= flags; |
| 1241 privacy_entry.policy_ref = UTF8ToWide(policy_ref); | 1242 privacy_entry.policy_ref = UTF8ToWide(policy_ref); |
| 1242 | 1243 |
| 1243 if (fire_privacy_event && IsWindow(notification_window_)) { | 1244 if (fire_privacy_event && IsWindow(notification_window_)) { |
| 1244 PostMessage(notification_window_, WM_FIRE_PRIVACY_CHANGE_NOTIFICATION, 1, | 1245 PostMessage(notification_window_, WM_FIRE_PRIVACY_CHANGE_NOTIFICATION, 1, |
| 1245 0); | 1246 0); |
| 1246 } | 1247 } |
| 1247 } | 1248 } |
| OLD | NEW |