namespace content {
+namespace {
+
+void RunCloseListeners(const std::vector<base::Closure>& close_listeners) {
+ for (size_t i = 0; i < close_listeners.size(); ++i)
+ close_listeners[i].Run();
+}
+
+} // namespace
+
StreamHandleImpl::StreamHandleImpl(
const base::WeakPtr<Stream>& stream,
const GURL& original_url,
url_(stream->url()),
original_url_(original_url),
mime_type_(mime_type),
- response_headers_(response_headers),
- stream_message_loop_(base::MessageLoopProxy::current().get()) {}
+ response_headers_(NULL),
+ stream_message_loop_(base::MessageLoopProxy::current().get()) {
+ // Make a copy of the response headers so it is safe to pass this across
+ // threads.
+ if (response_headers.get()) {
+ response_headers_ =
+ new net::HttpResponseHeaders(response_headers->raw_headers());
+ }
+}
StreamHandleImpl::~StreamHandleImpl() {
- stream_message_loop_->PostTask(FROM_HERE,
- base::Bind(&Stream::CloseHandle, stream_));
+ stream_message_loop_->PostTaskAndReply(FROM_HERE,
+ base::Bind(&Stream::CloseHandle, stream_),
+ base::Bind(&RunCloseListeners, close_listeners_));
}
const GURL& StreamHandleImpl::GetURL() {
return response_headers_;
}
+void StreamHandleImpl::AddCloseListener(const base::Closure& callback) {
+ close_listeners_.push_back(callback);
+}
+
} // namespace content