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

Side by Side Diff: content/browser/devtools/render_frame_devtools_agent_host.cc

Issue 2933243002: [DevTools] Make DevToolsSession own it's DevToolsMessageChunkProcessor (Closed)
Patch Set: addressed comments Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/devtools/render_frame_devtools_agent_host.h" 5 #include "content/browser/devtools/render_frame_devtools_agent_host.h"
6 6
7 #include <tuple> 7 #include <tuple>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/guid.h" 10 #include "base/guid.h"
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 attached_ = false; 188 attached_ = false;
189 } 189 }
190 190
191 void RenderFrameDevToolsAgentHost::FrameHostHolder::DispatchProtocolMessage( 191 void RenderFrameDevToolsAgentHost::FrameHostHolder::DispatchProtocolMessage(
192 int session_id, 192 int session_id,
193 int call_id, 193 int call_id,
194 const std::string& method, 194 const std::string& method,
195 const std::string& message) { 195 const std::string& message) {
196 host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( 196 host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
197 host_->GetRoutingID(), session_id, call_id, method, message)); 197 host_->GetRoutingID(), session_id, call_id, method, message));
198 sent_messages_[call_id] = { session_id, method, message }; 198 sent_messages_[call_id] = {session_id, call_id, method, message};
199 } 199 }
200 200
201 void RenderFrameDevToolsAgentHost::FrameHostHolder::InspectElement( 201 void RenderFrameDevToolsAgentHost::FrameHostHolder::InspectElement(
202 int session_id, int x, int y) { 202 int session_id, int x, int y) {
203 DCHECK(attached_); 203 DCHECK(attached_);
204 host_->Send(new DevToolsAgentMsg_InspectElement( 204 host_->Send(new DevToolsAgentMsg_InspectElement(
205 host_->GetRoutingID(), session_id, x, y)); 205 host_->GetRoutingID(), session_id, x, y));
206 } 206 }
207 207
208 bool 208 bool
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 DevToolsAgentHost::GetOrCreateFor(web_contents); 394 DevToolsAgentHost::GetOrCreateFor(web_contents);
395 } 395 }
396 } 396 }
397 397
398 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost( 398 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost(
399 FrameTreeNode* frame_tree_node) 399 FrameTreeNode* frame_tree_node)
400 : DevToolsAgentHostImpl(base::GenerateGUID()), 400 : DevToolsAgentHostImpl(base::GenerateGUID()),
401 frame_trace_recorder_(nullptr), 401 frame_trace_recorder_(nullptr),
402 handlers_frame_host_(nullptr), 402 handlers_frame_host_(nullptr),
403 current_frame_crashed_(false), 403 current_frame_crashed_(false),
404 chunk_processor_(
405 base::Bind(&RenderFrameDevToolsAgentHost::SendMessageFromProcessor,
406 base::Unretained(this))),
407 frame_tree_node_(frame_tree_node) { 404 frame_tree_node_(frame_tree_node) {
408 if (IsBrowserSideNavigationEnabled()) { 405 if (IsBrowserSideNavigationEnabled()) {
409 frame_host_ = frame_tree_node->current_frame_host(); 406 frame_host_ = frame_tree_node->current_frame_host();
410 render_frame_alive_ = frame_host_ && frame_host_->IsRenderFrameLive(); 407 render_frame_alive_ = frame_host_ && frame_host_->IsRenderFrameLive();
411 } else { 408 } else {
412 if (frame_tree_node->current_frame_host()) { 409 if (frame_tree_node->current_frame_host()) {
413 SetPending(frame_tree_node->current_frame_host()); 410 SetPending(frame_tree_node->current_frame_host());
414 CommitPending(); 411 CommitPending();
415 } 412 }
416 } 413 }
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 int call_id = 0; 535 int call_id = 0;
539 std::string method; 536 std::string method;
540 int session_id = session->session_id(); 537 int session_id = session->session_id();
541 if (session->Dispatch(message, &call_id, &method) != 538 if (session->Dispatch(message, &call_id, &method) !=
542 protocol::Response::kFallThrough) { 539 protocol::Response::kFallThrough) {
543 return true; 540 return true;
544 } 541 }
545 542
546 if (IsBrowserSideNavigationEnabled()) { 543 if (IsBrowserSideNavigationEnabled()) {
547 if (!navigation_handles_.empty()) { 544 if (!navigation_handles_.empty()) {
548 suspended_messages_[call_id] = {session_id, method, message}; 545 suspended_messages_.push_back({session_id, call_id, method, message});
549 return true; 546 return true;
550 } 547 }
551 if (frame_host_) { 548 if (frame_host_) {
552 frame_host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( 549 frame_host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
553 frame_host_->GetRoutingID(), session_id, call_id, method, message)); 550 frame_host_->GetRoutingID(), session_id, call_id, method, message));
554 } 551 }
555 waiting_for_response_messages_[call_id] = {session_id, method, message}; 552 session->waiting_messages()[call_id] = {method, message};
556 } else { 553 } else {
557 if (current_) 554 if (current_)
558 current_->DispatchProtocolMessage(session_id, call_id, method, message); 555 current_->DispatchProtocolMessage(session_id, call_id, method, message);
559 if (pending_) 556 if (pending_)
560 pending_->DispatchProtocolMessage(session_id, call_id, method, message); 557 pending_->DispatchProtocolMessage(session_id, call_id, method, message);
561 } 558 }
562 return true; 559 return true;
563 } 560 }
564 561
565 void RenderFrameDevToolsAgentHost::InspectElement( 562 void RenderFrameDevToolsAgentHost::InspectElement(
(...skipping 23 matching lines...) Expand all
589 #endif 586 #endif
590 if (IsBrowserSideNavigationEnabled()) 587 if (IsBrowserSideNavigationEnabled())
591 GrantPolicy(frame_host_); 588 GrantPolicy(frame_host_);
592 } 589 }
593 590
594 void RenderFrameDevToolsAgentHost::OnClientDetached() { 591 void RenderFrameDevToolsAgentHost::OnClientDetached() {
595 #if defined(OS_ANDROID) 592 #if defined(OS_ANDROID)
596 GetWakeLock()->CancelWakeLock(); 593 GetWakeLock()->CancelWakeLock();
597 #endif 594 #endif
598 frame_trace_recorder_.reset(); 595 frame_trace_recorder_.reset();
599 waiting_for_response_messages_.clear();
600 suspended_messages_.clear(); 596 suspended_messages_.clear();
601 chunk_processor_.Reset();
602 if (IsBrowserSideNavigationEnabled()) 597 if (IsBrowserSideNavigationEnabled())
603 RevokePolicy(frame_host_); 598 RevokePolicy(frame_host_);
604 } 599 }
605 600
606 RenderFrameDevToolsAgentHost::~RenderFrameDevToolsAgentHost() { 601 RenderFrameDevToolsAgentHost::~RenderFrameDevToolsAgentHost() {
607 Instances::iterator it = std::find(g_instances.Get().begin(), 602 Instances::iterator it = std::find(g_instances.Get().begin(),
608 g_instances.Get().end(), 603 g_instances.Get().end(),
609 this); 604 this);
610 if (it != g_instances.Get().end()) 605 if (it != g_instances.Get().end())
611 g_instances.Get().erase(it); 606 g_instances.Get().erase(it);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 if (handle->frame_tree_node() != frame_tree_node_) 647 if (handle->frame_tree_node() != frame_tree_node_)
653 return; 648 return;
654 navigation_handles_.erase(handle); 649 navigation_handles_.erase(handle);
655 650
656 // UpdateFrameHost may destruct |this|. 651 // UpdateFrameHost may destruct |this|.
657 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); 652 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this);
658 if (handle->HasCommitted() && !handle->IsErrorPage()) 653 if (handle->HasCommitted() && !handle->IsErrorPage())
659 UpdateFrameHost(handle->GetRenderFrameHost()); 654 UpdateFrameHost(handle->GetRenderFrameHost());
660 DCHECK(CheckConsistency()); 655 DCHECK(CheckConsistency());
661 if (navigation_handles_.empty()) { 656 if (navigation_handles_.empty()) {
662 if (session() && frame_host_) { 657 if (session()) {
663 for (const auto& pair : suspended_messages_) { 658 for (const Message& message : suspended_messages_) {
664 const Message& message = pair.second; 659 if (frame_host_) {
665 frame_host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( 660 frame_host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
666 frame_host_->GetRoutingID(), message.session_id, pair.first, 661 frame_host_->GetRoutingID(), message.session_id, message.call_id,
667 message.method, message.message)); 662 message.method, message.message));
663 }
664 session()->waiting_messages()[message.call_id] = {message.method,
665 message.message};
668 } 666 }
669 } 667 }
670 waiting_for_response_messages_.insert(suspended_messages_.begin(),
671 suspended_messages_.end());
672 suspended_messages_.clear(); 668 suspended_messages_.clear();
673 } 669 }
674 if (handle->HasCommitted()) { 670 if (handle->HasCommitted()) {
675 for (auto* target : protocol::TargetHandler::ForAgentHost(this)) 671 for (auto* target : protocol::TargetHandler::ForAgentHost(this))
676 target->UpdateServiceWorkers(); 672 target->UpdateServiceWorkers();
677 } 673 }
678 } 674 }
679 675
680 void RenderFrameDevToolsAgentHost::UpdateFrameHost( 676 void RenderFrameDevToolsAgentHost::UpdateFrameHost(
681 RenderFrameHostImpl* frame_host) { 677 RenderFrameHostImpl* frame_host) {
(...skipping 21 matching lines...) Expand all
703 session()->SetRenderFrameHost(frame_host); 699 session()->SetRenderFrameHost(frame_host);
704 MaybeReattachToRenderFrame(); 700 MaybeReattachToRenderFrame();
705 } 701 }
706 } 702 }
707 703
708 void RenderFrameDevToolsAgentHost::MaybeReattachToRenderFrame() { 704 void RenderFrameDevToolsAgentHost::MaybeReattachToRenderFrame() {
709 DCHECK(IsBrowserSideNavigationEnabled()); 705 DCHECK(IsBrowserSideNavigationEnabled());
710 if (!session() || !frame_host_) 706 if (!session() || !frame_host_)
711 return; 707 return;
712 int session_id = session()->session_id(); 708 int session_id = session()->session_id();
713 frame_host_->Send(new DevToolsAgentMsg_Reattach( 709 frame_host_->Send(new DevToolsAgentMsg_Reattach(frame_host_->GetRoutingID(),
714 frame_host_->GetRoutingID(), GetId(), session_id, 710 GetId(), session_id,
715 chunk_processor_.state_cookie())); 711 session()->state_cookie()));
716 for (const auto& pair : waiting_for_response_messages_) { 712 for (const auto& pair : session()->waiting_messages()) {
717 const Message& message = pair.second; 713 int call_id = pair.first;
714 const DevToolsSession::Message& message = pair.second;
718 frame_host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( 715 frame_host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
719 frame_host_->GetRoutingID(), message.session_id, pair.first, 716 frame_host_->GetRoutingID(), session_id, call_id, message.method,
720 message.method, message.message)); 717 message.message));
721 } 718 }
722 } 719 }
723 720
724 void RenderFrameDevToolsAgentHost::SendMessageFromProcessor(
725 int session_id,
726 const std::string& message) {
727 int id = chunk_processor_.last_call_id();
728 waiting_for_response_messages_.erase(id);
729 SendMessageToClient(session_id, message);
730 // |this| may be deleted at this point.
731 }
732
733 void RenderFrameDevToolsAgentHost::GrantPolicy(RenderFrameHostImpl* host) { 721 void RenderFrameDevToolsAgentHost::GrantPolicy(RenderFrameHostImpl* host) {
734 if (!host) 722 if (!host)
735 return; 723 return;
736 ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies( 724 ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies(
737 host->GetProcess()->GetID()); 725 host->GetProcess()->GetID());
738 } 726 }
739 727
740 void RenderFrameDevToolsAgentHost::RevokePolicy(RenderFrameHostImpl* host) { 728 void RenderFrameDevToolsAgentHost::RevokePolicy(RenderFrameHostImpl* host) {
741 if (!host) 729 if (!host)
742 return; 730 return;
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
1260 } 1248 }
1261 } 1249 }
1262 } 1250 }
1263 1251
1264 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( 1252 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend(
1265 RenderFrameHost* sender, 1253 RenderFrameHost* sender,
1266 const DevToolsMessageChunk& message) { 1254 const DevToolsMessageChunk& message) {
1267 bool success = true; 1255 bool success = true;
1268 if (IsBrowserSideNavigationEnabled()) { 1256 if (IsBrowserSideNavigationEnabled()) {
1269 if (sender == frame_host_) 1257 if (sender == frame_host_)
1270 success = chunk_processor_.ProcessChunkedMessageFromAgent(message); 1258 success = session()->ReceiveMessageChunk(message);
1271 } else { 1259 } else {
1272 if (current_ && current_->host() == sender) 1260 if (current_ && current_->host() == sender)
1273 success = current_->ProcessChunkedMessageFromAgent(message); 1261 success = current_->ProcessChunkedMessageFromAgent(message);
1274 else if (pending_ && pending_->host() == sender) 1262 else if (pending_ && pending_->host() == sender)
1275 success = pending_->ProcessChunkedMessageFromAgent(message); 1263 success = pending_->ProcessChunkedMessageFromAgent(message);
1276 } 1264 }
1277 if (!success) { 1265 if (!success) {
1278 bad_message::ReceivedBadMessage( 1266 bad_message::ReceivedBadMessage(
1279 sender->GetProcess(), 1267 sender->GetProcess(),
1280 bad_message::RFH_INCONSISTENT_DEVTOOLS_MESSAGE); 1268 bad_message::RFH_INCONSISTENT_DEVTOOLS_MESSAGE);
(...skipping 16 matching lines...) Expand all
1297 1285
1298 sender->Send(new DevToolsAgentMsg_RequestNewWindow_ACK( 1286 sender->Send(new DevToolsAgentMsg_RequestNewWindow_ACK(
1299 sender->GetRoutingID(), success)); 1287 sender->GetRoutingID(), success));
1300 } 1288 }
1301 1289
1302 bool RenderFrameDevToolsAgentHost::IsChildFrame() { 1290 bool RenderFrameDevToolsAgentHost::IsChildFrame() {
1303 return frame_tree_node_ && frame_tree_node_->parent(); 1291 return frame_tree_node_ && frame_tree_node_->parent();
1304 } 1292 }
1305 1293
1306 } // namespace content 1294 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/devtools/render_frame_devtools_agent_host.h ('k') | content/browser/devtools/worker_devtools_agent_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698