blob: 98ed2cf04cd847ac8b0d33f5493635982c2af357 [file] [log] [blame]
// Copyright 2018 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.
#include "content/browser/renderer_host/frame_token_message_queue.h"
#include "ipc/ipc_message.h"
namespace content {
FrameTokenMessageQueue::FrameTokenMessageQueue(Client* client)
: client_(client) {}
FrameTokenMessageQueue::~FrameTokenMessageQueue() {}
void FrameTokenMessageQueue::DidProcessFrame(uint32_t frame_token) {
// Frame tokens always increase.
if (frame_token <= last_received_frame_token_) {
client_->OnInvalidFrameToken(frame_token);
return;
}
last_received_frame_token_ = frame_token;
while (queued_messages_.size() &&
queued_messages_.front().first <= frame_token) {
ProcessSwapMessages(std::move(queued_messages_.front().second));
queued_messages_.pop();
}
}
void FrameTokenMessageQueue::OnFrameSwapMessagesReceived(
uint32_t frame_token,
std::vector<IPC::Message> messages) {
// Zero token is invalid.
if (!frame_token) {
client_->OnInvalidFrameToken(frame_token);
return;
}
// Frame tokens always increase.
if (queued_messages_.size() && frame_token <= queued_messages_.back().first) {
client_->OnInvalidFrameToken(frame_token);
return;
}
if (frame_token <= last_received_frame_token_) {
ProcessSwapMessages(std::move(messages));
return;
}
queued_messages_.push(std::make_pair(frame_token, std::move(messages)));
}
void FrameTokenMessageQueue::Reset() {
last_received_frame_token_ = 0;
// base::queue does not contain a clear.
auto doomed = std::move(queued_messages_);
}
void FrameTokenMessageQueue::ProcessSwapMessages(
std::vector<IPC::Message> messages) {
for (std::vector<IPC::Message>::const_iterator i = messages.begin();
i != messages.end(); ++i) {
client_->OnProcessSwapMessage(*i);
if (i->dispatch_error())
client_->OnMessageDispatchError(*i);
}
}
} // namespace content