Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / browser / streams / stream_handle_impl.cc
index d13bdc6..949e2fb 100644 (file)
 
 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,
@@ -21,12 +30,20 @@ StreamHandleImpl::StreamHandleImpl(
       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() {
@@ -45,4 +62,8 @@ scoped_refptr<net::HttpResponseHeaders> StreamHandleImpl::GetResponseHeaders() {
   return response_headers_;
 }
 
+void StreamHandleImpl::AddCloseListener(const base::Closure& callback) {
+  close_listeners_.push_back(callback);
+}
+
 }  // namespace content