| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |