Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(394)

Unified Diff: content/child/web_data_consumer_handle_impl.cc

Issue 1164493008: Implement WebDataConsumerHandle::Reader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/child/web_data_consumer_handle_impl.cc
diff --git a/content/child/web_data_consumer_handle_impl.cc b/content/child/web_data_consumer_handle_impl.cc
index a26656ed3101a4bb855d7225651a2be38befd68b..5f1e95ba7e5a4d40f56ef2342f0f2179567ec7d0 100644
--- a/content/child/web_data_consumer_handle_impl.cc
+++ b/content/child/web_data_consumer_handle_impl.cc
@@ -11,18 +11,38 @@
namespace content {
-typedef blink::WebDataConsumerHandle::Result Result;
+using Result = blink::WebDataConsumerHandle::Result;
-WebDataConsumerHandleImpl::WebDataConsumerHandleImpl(Handle handle)
- : handle_(handle.Pass()), client_(nullptr) {}
+class WebDataConsumerHandleImpl::Context
+ : public base::RefCountedThreadSafe<Context> {
+ public:
+ explicit Context(Handle handle) : handle_(handle.Pass()) {}
+
+ const Handle& handle() { return handle_; }
+
+ private:
+ friend class base::RefCountedThreadSafe<Context>;
+ ~Context() {}
+ Handle handle_;
+
+ DISALLOW_COPY_AND_ASSIGN(Context);
+};
-WebDataConsumerHandleImpl::~WebDataConsumerHandleImpl() {}
+WebDataConsumerHandleImpl::ReaderImpl::ReaderImpl(
+ scoped_refptr<Context> context,
+ Client* client)
+ : context_(context), client_(client) {
+ if (client_)
+ StartWatching();
+}
+
+WebDataConsumerHandleImpl::ReaderImpl::~ReaderImpl() {
+}
-Result WebDataConsumerHandleImpl::read(
- void* data,
- size_t size,
- Flags flags,
- size_t* read_size) {
+Result WebDataConsumerHandleImpl::ReaderImpl::read(void* data,
+ size_t size,
+ Flags flags,
+ size_t* read_size) {
// We need this variable definition to avoid a link error.
const Flags kNone = FlagNone;
DCHECK_EQ(flags, kNone);
@@ -32,16 +52,17 @@ Result WebDataConsumerHandleImpl::read(
uint32_t size_to_pass = size;
MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE;
- MojoResult rv =
- mojo::ReadDataRaw(handle_.get(), data, &size_to_pass, flags_to_pass);
+ MojoResult rv = mojo::ReadDataRaw(context_->handle().get(), data,
+ &size_to_pass, flags_to_pass);
if (rv == MOJO_RESULT_OK)
*read_size = size_to_pass;
return HandleReadResult(rv);
}
-Result WebDataConsumerHandleImpl::beginRead(
- const void** buffer, Flags flags, size_t* available) {
+Result WebDataConsumerHandleImpl::ReaderImpl::beginRead(const void** buffer,
+ Flags flags,
+ size_t* available) {
// We need this variable definition to avoid a link error.
const Flags kNone = FlagNone;
DCHECK_EQ(flags, kNone);
@@ -52,38 +73,20 @@ Result WebDataConsumerHandleImpl::beginRead(
uint32_t size_to_pass = 0;
MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE;
- MojoResult rv = mojo::BeginReadDataRaw(handle_.get(), buffer,
+ MojoResult rv = mojo::BeginReadDataRaw(context_->handle().get(), buffer,
&size_to_pass, flags_to_pass);
if (rv == MOJO_RESULT_OK)
*available = size_to_pass;
return HandleReadResult(rv);
}
-Result WebDataConsumerHandleImpl::endRead(size_t read_size) {
- MojoResult rv = mojo::EndReadDataRaw(handle_.get(), read_size);
- return
- rv == MOJO_RESULT_OK ? Ok : UnexpectedError;
-}
-
-void WebDataConsumerHandleImpl::registerClient(Client* client) {
- DCHECK(!client_);
- DCHECK(client);
- client_ = client;
-
- handle_watcher_.Start(
- handle_.get(),
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_DEADLINE_INDEFINITE,
- base::Bind(&WebDataConsumerHandleImpl::OnHandleGotReadable,
- base::Unretained(this)));
-}
-
-void WebDataConsumerHandleImpl::unregisterClient() {
- client_ = nullptr;
- handle_watcher_.Stop();
+Result WebDataConsumerHandleImpl::ReaderImpl::endRead(size_t read_size) {
+ MojoResult rv = mojo::EndReadDataRaw(context_->handle().get(), read_size);
+ return rv == MOJO_RESULT_OK ? Ok : UnexpectedError;
}
-Result WebDataConsumerHandleImpl::HandleReadResult(MojoResult mojo_result) {
+Result WebDataConsumerHandleImpl::ReaderImpl::HandleReadResult(
+ MojoResult mojo_result) {
switch (mojo_result) {
case MOJO_RESULT_OK:
return Ok;
@@ -92,14 +95,8 @@ Result WebDataConsumerHandleImpl::HandleReadResult(MojoResult mojo_result) {
case MOJO_RESULT_BUSY:
return Busy;
case MOJO_RESULT_SHOULD_WAIT:
- if (client_) {
- handle_watcher_.Start(
- handle_.get(),
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_DEADLINE_INDEFINITE,
- base::Bind(&WebDataConsumerHandleImpl::OnHandleGotReadable,
- base::Unretained(this)));
- }
+ if (client_)
+ StartWatching();
return ShouldWait;
case MOJO_RESULT_RESOURCE_EXHAUSTED:
return ResourceExhausted;
@@ -108,9 +105,33 @@ Result WebDataConsumerHandleImpl::HandleReadResult(MojoResult mojo_result) {
}
}
-void WebDataConsumerHandleImpl::OnHandleGotReadable(MojoResult) {
+void WebDataConsumerHandleImpl::ReaderImpl::StartWatching() {
+ handle_watcher_.Start(
+ context_->handle().get(), MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_DEADLINE_INDEFINITE,
+ base::Bind(&ReaderImpl::OnHandleGotReadable, base::Unretained(this)));
+}
+
+void WebDataConsumerHandleImpl::ReaderImpl::OnHandleGotReadable(MojoResult) {
DCHECK(client_);
client_->didGetReadable();
}
+WebDataConsumerHandleImpl::WebDataConsumerHandleImpl(Handle handle)
+ : context_(new Context(handle.Pass())) {
+}
+
+WebDataConsumerHandleImpl::~WebDataConsumerHandleImpl() {
+}
+
+scoped_ptr<blink::WebDataConsumerHandle::Reader>
+WebDataConsumerHandleImpl::ObtainReader(Client* client) {
+ return make_scoped_ptr(obtainReaderInternal(client));
+}
+
+WebDataConsumerHandleImpl::ReaderImpl*
+WebDataConsumerHandleImpl::obtainReaderInternal(Client* client) {
+ return new ReaderImpl(context_, client);
+}
+
} // namespace content
« no previous file with comments | « content/child/web_data_consumer_handle_impl.h ('k') | content/child/web_data_consumer_handle_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698