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

Unified Diff: content/browser/renderer_host/websocket_host.cc

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 | « content/browser/renderer_host/websocket_host.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/websocket_host.cc
diff --git a/content/browser/renderer_host/websocket_host.cc b/content/browser/renderer_host/websocket_host.cc
index 5551e9643bf2de32a906f1558bdfdcd88d5ab1bb..a349e35a138e4e5c914bc07d36528ce4db64ad9e 100644
--- a/content/browser/renderer_host/websocket_host.cc
+++ b/content/browser/renderer_host/websocket_host.cc
@@ -153,8 +153,7 @@ WebSocketEventHandler::WebSocketEventHandler(
int render_frame_id)
: dispatcher_(dispatcher),
routing_id_(routing_id),
- render_frame_id_(render_frame_id) {
-}
+ render_frame_id_(render_frame_id) {}
WebSocketEventHandler::~WebSocketEventHandler() {
DVLOG(1) << "WebSocketEventHandler destroyed routing_id=" << routing_id_;
@@ -164,8 +163,8 @@ ChannelState WebSocketEventHandler::OnAddChannelResponse(
const std::string& selected_protocol,
const std::string& extensions) {
DVLOG(3) << "WebSocketEventHandler::OnAddChannelResponse"
- << " routing_id=" << routing_id_
- << " selected_protocol=\"" << selected_protocol << "\""
+ << " routing_id=" << routing_id_ << " selected_protocol=\""
+ << selected_protocol << "\""
<< " extensions=\"" << extensions << "\"";
return StateCast(dispatcher_->SendAddChannelResponse(
@@ -180,8 +179,8 @@ ChannelState WebSocketEventHandler::OnDataFrame(
<< " routing_id=" << routing_id_ << " fin=" << fin
<< " type=" << type << " data is " << data.size() << " bytes";
- return StateCast(dispatcher_->SendFrame(
- routing_id_, fin, OpCodeToMessageType(type), data));
+ return StateCast(dispatcher_->SendFrame(routing_id_, fin,
+ OpCodeToMessageType(type), data));
}
ChannelState WebSocketEventHandler::OnClosingHandshake() {
@@ -211,8 +210,7 @@ ChannelState WebSocketEventHandler::OnDropChannel(bool was_clean,
ChannelState WebSocketEventHandler::OnFailChannel(const std::string& message) {
DVLOG(3) << "WebSocketEventHandler::OnFailChannel"
- << " routing_id=" << routing_id_
- << " message=\"" << message << "\"";
+ << " routing_id=" << routing_id_ << " message=\"" << message << "\"";
return StateCast(dispatcher_->NotifyFailure(routing_id_, message));
}
@@ -237,8 +235,8 @@ ChannelState WebSocketEventHandler::OnStartOpeningHandshake(
request->headers.ToString();
request_to_pass.request_time = request->request_time;
- return StateCast(dispatcher_->NotifyStartOpeningHandshake(routing_id_,
- request_to_pass));
+ return StateCast(
+ dispatcher_->NotifyStartOpeningHandshake(routing_id_, request_to_pass));
}
ChannelState WebSocketEventHandler::OnFinishOpeningHandshake(
@@ -263,8 +261,8 @@ ChannelState WebSocketEventHandler::OnFinishOpeningHandshake(
response->headers->raw_headers());
response_to_pass.response_time = response->response_time;
- return StateCast(dispatcher_->NotifyFinishOpeningHandshake(routing_id_,
- response_to_pass));
+ return StateCast(
+ dispatcher_->NotifyFinishOpeningHandshake(routing_id_, response_to_pass));
}
ChannelState WebSocketEventHandler::OnSSLCertificateError(
@@ -281,7 +279,7 @@ ChannelState WebSocketEventHandler::OnSSLCertificateError(
ssl_error_handler_delegate_->GetWeakPtr(), url,
dispatcher_->render_process_id(), render_frame_id_, ssl_info, fatal);
// The above method is always asynchronous.
- return WebSocketEventInterface::CHANNEL_ALIVE;
+ return WebSocketEventInterface::CHANNEL_ALIVE;
}
WebSocketEventHandler::SSLErrorHandlerDelegate::SSLErrorHandlerDelegate(
@@ -312,6 +310,56 @@ void WebSocketEventHandler::SSLErrorHandlerDelegate::ContinueSSLRequest() {
} // namespace
+WebSocketHost::ReceiveQuotaMultiplexer::ReceiveQuotaMultiplexer()
+ : channel_(nullptr), published_quota_(0), current_consumer_(nullptr) {}
+
+// Quota can be added to any consumer at any time.
+bool WebSocketHost::ReceiveQuotaMultiplexer::AddQuota(
+ ReceiveQuotaProvider* provider,
+ int64_t quota) {
+ DCHECK(channel_);
+ DCHECK_GE(quota, 0);
+ *provider += quota;
+ if (provider == current_consumer_) {
+ PublishMoreQuotaIfNeeded();
+ return true;
+ }
+ return false;
+}
+
+// Quota can only be used from the current consumer.
+int64_t WebSocketHost::ReceiveQuotaMultiplexer::AvailableQuota() const {
+ DCHECK(current_consumer_);
+ return *current_consumer_;
+}
+
+// Quota is only consumed by the current consumer.
+void WebSocketHost::ReceiveQuotaMultiplexer::ConsumedQuota(int64_t quota) {
+ DCHECK_GE(quota, 0);
+ DCHECK_GE(*current_consumer_, quota);
+ DCHECK_GE(published_quota_, *current_consumer_);
+ *current_consumer_ -= quota;
+ published_quota_ -= quota;
+}
+
+// Changing the current consumer may result in more quota being published.
+void WebSocketHost::ReceiveQuotaMultiplexer::SetConsumer(
+ ReceiveQuotaConsumer* consumer) {
+ DCHECK(channel_);
+ DCHECK(consumer);
+ current_consumer_ = consumer;
+ PublishMoreQuotaIfNeeded();
+}
+
+void WebSocketHost::ReceiveQuotaMultiplexer::PublishMoreQuotaIfNeeded() {
+ DCHECK(channel_);
+ DCHECK(current_consumer_);
+ if (*current_consumer_ > published_quota_) {
+ channel_->SendFlowControl(published_quota_ - *current_consumer_);
+ published_quota_ = *current_consumer_;
+ }
+}
+
WebSocketHost::WebSocketHost(int routing_id,
WebSocketDispatcherHost* dispatcher,
net::URLRequestContext* url_request_context,
« no previous file with comments | « content/browser/renderer_host/websocket_host.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698