Index: content/browser/devtools/render_frame_devtools_agent_host.cc |
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc |
index 76b3866d638974a579b444ec8e8ee4eafc6b3e96..823c922abcf3884911fed536a0a6970f668fa1b4 100644 |
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc |
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc |
@@ -130,6 +130,8 @@ class RenderFrameDevToolsAgentHost::FrameHostHolder { |
std::vector<std::pair<int, std::string>> pending_messages_; |
// <call_id> -> PendingMessage |
std::map<int, PendingMessage> sent_messages_; |
+ // These are sent messages for which we got a reply while suspended. |
+ std::map<int, PendingMessage> sent_messages_whose_reply_came_while_suspended_; |
}; |
RenderFrameDevToolsAgentHost::FrameHostHolder::FrameHostHolder( |
@@ -165,6 +167,13 @@ void RenderFrameDevToolsAgentHost::FrameHostHolder::Reattach( |
host_->GetRoutingID(), agent_->GetId(), agent_->session()->session_id(), |
chunk_processor_.state_cookie())); |
if (old) { |
+ if (IsBrowserSideNavigationEnabled()) { |
+ for (const auto& pair : |
+ old->sent_messages_whose_reply_came_while_suspended_) { |
+ DispatchProtocolMessage(pair.second.session_id, pair.first, |
+ pair.second.method, pair.second.message); |
+ } |
+ } |
for (const auto& pair : old->sent_messages_) { |
DispatchProtocolMessage(pair.second.session_id, pair.first, |
pair.second.method, pair.second.message); |
@@ -233,11 +242,14 @@ RenderFrameDevToolsAgentHost::FrameHostHolder::ProcessChunkedMessageFromAgent( |
void RenderFrameDevToolsAgentHost::FrameHostHolder::SendMessageToClient( |
int session_id, |
const std::string& message) { |
- sent_messages_.erase(chunk_processor_.last_call_id()); |
- if (suspended_) |
+ int id = chunk_processor_.last_call_id(); |
+ if (suspended_) { |
+ sent_messages_whose_reply_came_while_suspended_[id] = sent_messages_[id]; |
pending_messages_.push_back(std::make_pair(session_id, message)); |
- else |
+ } else { |
agent_->SendMessageToClient(session_id, message); |
+ } |
+ sent_messages_.erase(id); |
} |
void RenderFrameDevToolsAgentHost::FrameHostHolder::Suspend() { |
@@ -250,6 +262,7 @@ void RenderFrameDevToolsAgentHost::FrameHostHolder::Resume() { |
agent_->SendMessageToClient(pair.first, pair.second); |
std::vector<std::pair<int, std::string>> empty; |
pending_messages_.swap(empty); |
+ sent_messages_whose_reply_came_while_suspended_.clear(); |
} |
// RenderFrameDevToolsAgentHost ------------------------------------------------ |
@@ -691,6 +704,8 @@ void RenderFrameDevToolsAgentHost::DidFinishNavigation( |
DiscardPending(); |
} |
pending_handle_ = nullptr; |
+ } else if (navigating_handles_.empty()) { |
+ current_->Resume(); |
} |
DispatchBufferedProtocolMessagesIfNecessary(); |
@@ -732,6 +747,7 @@ void RenderFrameDevToolsAgentHost::AboutToNavigate( |
return; |
DCHECK(current_); |
navigating_handles_.insert(navigation_handle); |
+ current_->Suspend(); |
DCHECK(CheckConsistency()); |
} |