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

Unified Diff: content/browser/renderer_host/websocket_blob_receiver.h

Issue 1626453003: [OBSOLETE] Browser-side implementation of WebSocket Blob receive. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add WebSocketHost::ReceiveQuotaMultiplexer Created 4 years, 11 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
« no previous file with comments | « no previous file | content/browser/renderer_host/websocket_blob_receiver.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/websocket_blob_receiver.h
diff --git a/content/browser/renderer_host/websocket_blob_receiver.h b/content/browser/renderer_host/websocket_blob_receiver.h
new file mode 100644
index 0000000000000000000000000000000000000000..d4033ed4459e109168e4b3276124a41569967bc5
--- /dev/null
+++ b/content/browser/renderer_host/websocket_blob_receiver.h
@@ -0,0 +1,143 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBSOCKET_BLOB_RECEIVER_H_
+#define WEBSOCKET_BLOB_RECEIVER_H_
+
+#include <stdint.h>
+#include <iosfwd>
+#include <vector>
+
+#include "base/files/file.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "content/common/content_export.h"
+
+namespace net {
+class FileStream;
+class DrainableIOBuffer;
+}
+
+namespace storage {
+class BlobDataHandle;
+class BlobStorageContext;
+class ShareableFileReference;
+}
+
+namespace content {
+
+// Reads data from a WebSocket and writes it to a Blob for later access by the
+// renderer.
+class CONTENT_EXPORT WebSocketBlobReceiver {
+ public:
+ // Interface to be implemented by the client of WebSocketBlobReceiver. None of
+ // these methods will be called after the WebSocketBlobReceiver object has
+ // been destroyed.
+ class Client {
+ public:
+ Client() = default;
+ virtual ~Client() = default;
+
+ // Signals that a Blob has successfully been created. Will be called
+ // asynchronously after WebSocketBlobReceiver::Finish() returns. The
+ // owner of the WebSocketBlobReceiver object should delete it after this is
+ // called. |blob_data_handle| must be copied to keep the Blob alive.
+ virtual void BlobCreated(
+ const storage::BlobDataHandle& blob_data_handle) = 0;
+
+ // Signals asynchronously that Blob creation failed. Synchronous failures
+ // are indicated by AppendData() or Finish() returning net error codes.
+ // May be called any time after Start() returns.
+ virtual void BlobFailed(int net_error_code) = 0;
+
+ // Indicates that up to |quota| additional bytes of data may be passed to
+ // OnNewData(). May be called any time between Start() and Finish().
+ virtual void AddFlowControlQuota(int64_t quota) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Client);
+ };
+
+ // |blob_storage_context| must out-live this object. |client| will be
+ // destroyed when this object is.
+ WebSocketBlobReceiver(scoped_ptr<Client> client,
+ storage::BlobStorageContext* blob_storage_context);
+ ~WebSocketBlobReceiver();
+
+ // Prepares to create the Blob. Calls AddFlowControlQuota() asychronously when
+ // it is ready to accept data. Calls BlobFailed() asynchronously on error.
+ void Start();
+
+ // Adds data to the Blob at the end. It is reasonable to call this for small
+ // amounts of data: a new BlobDataItem is not created for each call. May call
+ // AddFlowControlQuota() synchronously or asynchronously when it is ready for
+ // more data. Returns a net::Error code on synchronous error, net::OK on
+ // synchronous success, or net::ERR_IO_PENDING. |data| must not be larger than
+ // the unused bytes passed to client_->AddFlowControlQuota() so far.
+ int AppendData(const std::vector<char>& data);
+
+ // Indicates that AppendData() will not be called again and that the Blob
+ // should be finalised. Returns a net::Error code on synchronous failure.
+ // BlobCreated() or BlobFailed() will be called asynchronously after this
+ // method returns net::ERR_IO_PENDING.
+ int Finish();
+
+ private:
+ class FileInfoHelper;
+
+ enum class State {
+ NONE = 0,
+ CREATE_FILE,
+ CREATE_FILE_COMPLETE,
+ SEND_QUOTA,
+ WRITE,
+ WRITE_COMPLETE,
+ GET_INFO,
+ GET_INFO_COMPLETE,
+ };
+
+ // Needed to make CHECK_EQ(), etc. work
+ friend std::ostream& operator<<(std::ostream& os, State state);
+
+ int DoLoop(int result);
+ void DoLoopAsync(int result);
+ int DoCreateFile();
+ int DoCreateFileComplete(int result);
+ int DoSendQuota();
+ int DoWrite();
+ int DoWriteComplete(int result);
+ int DoGetInfo();
+ int DoGetInfoComplete(int result);
+
+ void OnWriteComplete(int result);
+
+ void DidCreateTemporaryFileStream(
+ base::File::Error error_code,
+ scoped_ptr<net::FileStream> file_stream,
+ storage::ShareableFileReference* deletable_file);
+
+ void PrepareWrite(const std::vector<char>& data);
+
+ void DidGetInfo(bool result, const base::File::Info& info);
+
+ const scoped_ptr<Client> client_;
+ storage::BlobStorageContext* blob_storage_context_;
+ scoped_ptr<net::FileStream> file_stream_;
+ scoped_refptr<storage::ShareableFileReference> deletable_file_;
+ const scoped_refptr<net::DrainableIOBuffer> io_buffer_;
+ std::vector<char> pending_data_;
+ int64_t pending_quota_;
+ State next_state_ = State::NONE;
+ bool io_in_progress_ = false;
+ bool finish_called_ = false;
+ base::WeakPtrFactory<WebSocketBlobReceiver> weak_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebSocketBlobReceiver);
+};
+
+} // namespace content
+
+#endif
« no previous file with comments | « no previous file | content/browser/renderer_host/websocket_blob_receiver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698