diff options
Diffstat (limited to 'chromium/content/browser/streams')
8 files changed, 61 insertions, 19 deletions
diff --git a/chromium/content/browser/streams/stream.cc b/chromium/content/browser/streams/stream.cc index 5d20fe6ab64..d10770c42d2 100644 --- a/chromium/content/browser/streams/stream.cc +++ b/chromium/content/browser/streams/stream.cc @@ -7,11 +7,13 @@ #include "base/bind.h" #include "base/location.h" #include "base/message_loop/message_loop_proxy.h" +#include "base/values.h" #include "content/browser/streams/stream_handle_impl.h" #include "content/browser/streams/stream_read_observer.h" #include "content/browser/streams/stream_registry.h" #include "content/browser/streams/stream_write_observer.h" #include "net/base/io_buffer.h" +#include "net/http/http_response_headers.h" namespace { // Start throttling the connection at about 1MB. @@ -158,12 +160,15 @@ Stream::StreamState Stream::ReadRawData(net::IOBuffer* buf, return STREAM_HAS_DATA; } -scoped_ptr<StreamHandle> Stream::CreateHandle(const GURL& original_url, - const std::string& mime_type) { +scoped_ptr<StreamHandle> Stream::CreateHandle( + const GURL& original_url, + const std::string& mime_type, + scoped_refptr<net::HttpResponseHeaders> response_headers) { CHECK(!stream_handle_); stream_handle_ = new StreamHandleImpl(weak_ptr_factory_.GetWeakPtr(), original_url, - mime_type); + mime_type, + response_headers); return scoped_ptr<StreamHandle>(stream_handle_).Pass(); } diff --git a/chromium/content/browser/streams/stream.h b/chromium/content/browser/streams/stream.h index 3937f5b9e38..e7e9586ca96 100644 --- a/chromium/content/browser/streams/stream.h +++ b/chromium/content/browser/streams/stream.h @@ -13,6 +13,7 @@ #include "url/gurl.h" namespace net { +class HttpResponseHeaders; class IOBuffer; } @@ -77,8 +78,10 @@ class CONTENT_EXPORT Stream : public base::RefCountedThreadSafe<Stream> { // and STREAM_COMPLETE if the stream is finalized and all data has been read. StreamState ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read); - scoped_ptr<StreamHandle> CreateHandle(const GURL& original_url, - const std::string& mime_type); + scoped_ptr<StreamHandle> CreateHandle( + const GURL& original_url, + const std::string& mime_type, + scoped_refptr<net::HttpResponseHeaders> response_headers); void CloseHandle(); // Indicates whether there is space in the buffer to add more data. diff --git a/chromium/content/browser/streams/stream_context.cc b/chromium/content/browser/streams/stream_context.cc index 44ca0f4a1cd..357e68cae58 100644 --- a/chromium/content/browser/streams/stream_context.cc +++ b/chromium/content/browser/streams/stream_context.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "content/browser/streams/stream_registry.h" #include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_thread.h" using base::UserDataAdapter; diff --git a/chromium/content/browser/streams/stream_context.h b/chromium/content/browser/streams/stream_context.h index fb6cdc720ff..ad8f65cb638 100644 --- a/chromium/content/browser/streams/stream_context.h +++ b/chromium/content/browser/streams/stream_context.h @@ -9,7 +9,6 @@ #include "base/memory/scoped_ptr.h" #include "base/sequenced_task_runner_helpers.h" #include "content/common/content_export.h" -#include "content/public/browser/browser_thread.h" namespace content { class BrowserContext; diff --git a/chromium/content/browser/streams/stream_handle_impl.cc b/chromium/content/browser/streams/stream_handle_impl.cc index d9f877cbc76..6ff49621b57 100644 --- a/chromium/content/browser/streams/stream_handle_impl.cc +++ b/chromium/content/browser/streams/stream_handle_impl.cc @@ -4,23 +4,39 @@ #include "content/browser/streams/stream_handle_impl.h" +#include "base/bind.h" +#include "base/location.h" +#include "base/message_loop/message_loop_proxy.h" #include "content/browser/streams/stream.h" -#include "content/public/browser/browser_thread.h" +#include "net/http/http_response_headers.h" namespace content { -StreamHandleImpl::StreamHandleImpl(const base::WeakPtr<Stream>& stream, - const GURL& original_url, - const std::string& mime_type) +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, + const std::string& mime_type, + scoped_refptr<net::HttpResponseHeaders> response_headers) : stream_(stream), url_(stream->url()), original_url_(original_url), mime_type_(mime_type), + response_headers_(response_headers), stream_message_loop_(base::MessageLoopProxy::current().get()) {} 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() { @@ -35,4 +51,12 @@ const std::string& StreamHandleImpl::GetMimeType() { return mime_type_; } +scoped_refptr<net::HttpResponseHeaders> StreamHandleImpl::GetResponseHeaders() { + return response_headers_; +} + +void StreamHandleImpl::AddCloseListener(const base::Closure& callback) { + close_listeners_.push_back(callback); +} + } // namespace content diff --git a/chromium/content/browser/streams/stream_handle_impl.h b/chromium/content/browser/streams/stream_handle_impl.h index aabd0cb7dfe..dc64dade6da 100644 --- a/chromium/content/browser/streams/stream_handle_impl.h +++ b/chromium/content/browser/streams/stream_handle_impl.h @@ -5,11 +5,16 @@ #ifndef CONTENT_BROWSER_STREAMS_STREAM_HANDLE_IMPL_H_ #define CONTENT_BROWSER_STREAMS_STREAM_HANDLE_IMPL_H_ +#include <vector> + #include "base/memory/weak_ptr.h" -#include "base/message_loop/message_loop_proxy.h" #include "base/synchronization/lock.h" #include "content/public/browser/stream_handle.h" +namespace base { +class MessageLoopProxy; +} + namespace content { class Stream; @@ -18,7 +23,8 @@ class StreamHandleImpl : public StreamHandle { public: StreamHandleImpl(const base::WeakPtr<Stream>& stream, const GURL& original_url, - const std::string& mime_type); + const std::string& mime_type, + scoped_refptr<net::HttpResponseHeaders> response_headers); virtual ~StreamHandleImpl(); private: @@ -26,12 +32,16 @@ class StreamHandleImpl : public StreamHandle { virtual const GURL& GetURL() OVERRIDE; virtual const GURL& GetOriginalURL() OVERRIDE; virtual const std::string& GetMimeType() OVERRIDE; + virtual scoped_refptr<net::HttpResponseHeaders> GetResponseHeaders() OVERRIDE; + virtual void AddCloseListener(const base::Closure& callback) OVERRIDE; base::WeakPtr<Stream> stream_; GURL url_; GURL original_url_; std::string mime_type_; + scoped_refptr<net::HttpResponseHeaders> response_headers_; base::MessageLoopProxy* stream_message_loop_; + std::vector<base::Closure> close_listeners_; }; } // namespace content diff --git a/chromium/content/browser/streams/stream_url_request_job.cc b/chromium/content/browser/streams/stream_url_request_job.cc index 09b9e6d7815..6d70eefa515 100644 --- a/chromium/content/browser/streams/stream_url_request_job.cc +++ b/chromium/content/browser/streams/stream_url_request_job.cc @@ -226,7 +226,7 @@ void StreamURLRequestJob::HeadersCompleted(net::HttpStatusCode status_code) { if (status_code == net::HTTP_OK) { std::string content_type_header(net::HttpRequestHeaders::kContentType); content_type_header.append(": "); - content_type_header.append("plain/text"); + content_type_header.append("text/plain"); headers->AddHeader(content_type_header); } diff --git a/chromium/content/browser/streams/stream_url_request_job_unittest.cc b/chromium/content/browser/streams/stream_url_request_job_unittest.cc index d3378032080..035a588bc96 100644 --- a/chromium/content/browser/streams/stream_url_request_job_unittest.cc +++ b/chromium/content/browser/streams/stream_url_request_job_unittest.cc @@ -51,7 +51,7 @@ class StreamURLRequestJobTest : public testing::Test { StreamRegistry* registry_; }; - StreamURLRequestJobTest() : message_loop_(base::MessageLoop::TYPE_IO) {} + StreamURLRequestJobTest() {} virtual void SetUp() { registry_.reset(new StreamRegistry()); @@ -76,7 +76,7 @@ class StreamURLRequestJobTest : public testing::Test { const std::string& expected_response) { net::TestDelegate delegate; request_ = url_request_context_.CreateRequest( - url, net::DEFAULT_PRIORITY, &delegate); + url, net::DEFAULT_PRIORITY, &delegate, NULL); request_->set_method(method); if (!extra_headers.IsEmpty()) request_->SetExtraRequestHeaders(extra_headers); @@ -93,7 +93,7 @@ class StreamURLRequestJobTest : public testing::Test { } protected: - base::MessageLoop message_loop_; + base::MessageLoopForIO message_loop_; scoped_ptr<StreamRegistry> registry_; net::URLRequestContext url_request_context_; @@ -134,7 +134,7 @@ TEST_F(StreamURLRequestJobTest, TestGetLargeStreamRequest) { TEST_F(StreamURLRequestJobTest, TestGetNonExistentStreamRequest) { net::TestDelegate delegate; request_ = url_request_context_.CreateRequest( - kStreamURL, net::DEFAULT_PRIORITY, &delegate); + kStreamURL, net::DEFAULT_PRIORITY, &delegate, NULL); request_->set_method("GET"); request_->Start(); |