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, |