| 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" |
| 11 #include "base/json/json_reader.h" | 11 #include "base/json/json_reader.h" |
| 12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
| 13 #include "base/memory/ptr_util.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 14 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 15 #include "content/browser/bad_message.h" | 16 #include "content/browser/bad_message.h" |
| 16 #include "content/browser/child_process_security_policy_impl.h" | 17 #include "content/browser/child_process_security_policy_impl.h" |
| 17 #include "content/browser/devtools/devtools_frame_trace_recorder.h" | 18 #include "content/browser/devtools/devtools_frame_trace_recorder.h" |
| 18 #include "content/browser/devtools/devtools_manager.h" | 19 #include "content/browser/devtools/devtools_manager.h" |
| 19 #include "content/browser/devtools/devtools_session.h" | 20 #include "content/browser/devtools/devtools_session.h" |
| 20 #include "content/browser/devtools/page_navigation_throttle.h" | 21 #include "content/browser/devtools/page_navigation_throttle.h" |
| 21 #include "content/browser/devtools/protocol/dom_handler.h" | 22 #include "content/browser/devtools/protocol/dom_handler.h" |
| 22 #include "content/browser/devtools/protocol/emulation_handler.h" | 23 #include "content/browser/devtools/protocol/emulation_handler.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 // RenderFrameDevToolsAgentHost::FrameHostHolder ------------------------------- | 97 // RenderFrameDevToolsAgentHost::FrameHostHolder ------------------------------- |
| 97 | 98 |
| 98 class RenderFrameDevToolsAgentHost::FrameHostHolder { | 99 class RenderFrameDevToolsAgentHost::FrameHostHolder { |
| 99 public: | 100 public: |
| 100 FrameHostHolder( | 101 FrameHostHolder( |
| 101 RenderFrameDevToolsAgentHost* agent, RenderFrameHostImpl* host); | 102 RenderFrameDevToolsAgentHost* agent, RenderFrameHostImpl* host); |
| 102 ~FrameHostHolder(); | 103 ~FrameHostHolder(); |
| 103 | 104 |
| 104 RenderFrameHostImpl* host() const { return host_; } | 105 RenderFrameHostImpl* host() const { return host_; } |
| 105 | 106 |
| 106 void Attach(); | 107 void Attach(DevToolsSession* session); |
| 107 void Reattach(FrameHostHolder* old); | 108 void Reattach(FrameHostHolder* old); |
| 108 void Detach(); | 109 void Detach(int session_id); |
| 109 void DispatchProtocolMessage(int session_id, | 110 void DispatchProtocolMessage(int session_id, |
| 110 int call_id, | 111 int call_id, |
| 111 const std::string& method, | 112 const std::string& method, |
| 112 const std::string& message); | 113 const std::string& message); |
| 113 void InspectElement(int session_id, int x, int y); | 114 void InspectElement(int session_id, int x, int y); |
| 114 bool ProcessChunkedMessageFromAgent(const DevToolsMessageChunk& chunk); | 115 bool ProcessChunkedMessageFromAgent(const DevToolsMessageChunk& chunk); |
| 115 void Suspend(); | 116 void Suspend(); |
| 116 void Resume(); | 117 void Resume(); |
| 117 | 118 |
| 118 private: | 119 private: |
| (...skipping 25 matching lines...) Expand all Loading... |
| 144 base::Unretained(this))) { | 145 base::Unretained(this))) { |
| 145 DCHECK(agent_); | 146 DCHECK(agent_); |
| 146 DCHECK(host_); | 147 DCHECK(host_); |
| 147 } | 148 } |
| 148 | 149 |
| 149 RenderFrameDevToolsAgentHost::FrameHostHolder::~FrameHostHolder() { | 150 RenderFrameDevToolsAgentHost::FrameHostHolder::~FrameHostHolder() { |
| 150 if (attached_) | 151 if (attached_) |
| 151 RevokePolicy(); | 152 RevokePolicy(); |
| 152 } | 153 } |
| 153 | 154 |
| 154 void RenderFrameDevToolsAgentHost::FrameHostHolder::Attach() { | 155 void RenderFrameDevToolsAgentHost::FrameHostHolder::Attach( |
| 156 DevToolsSession* session) { |
| 155 host_->Send(new DevToolsAgentMsg_Attach( | 157 host_->Send(new DevToolsAgentMsg_Attach( |
| 156 host_->GetRoutingID(), agent_->GetId(), agent_->session()->session_id())); | 158 host_->GetRoutingID(), agent_->GetId(), session->session_id())); |
| 157 GrantPolicy(); | 159 GrantPolicy(); |
| 158 attached_ = true; | 160 attached_ = true; |
| 159 } | 161 } |
| 160 | 162 |
| 161 void RenderFrameDevToolsAgentHost::FrameHostHolder::Reattach( | 163 void RenderFrameDevToolsAgentHost::FrameHostHolder::Reattach( |
| 162 FrameHostHolder* old) { | 164 FrameHostHolder* old) { |
| 163 if (old) | 165 if (old) |
| 164 chunk_processor_.set_state_cookie(old->chunk_processor_.state_cookie()); | 166 chunk_processor_.set_state_cookie(old->chunk_processor_.state_cookie()); |
| 165 host_->Send(new DevToolsAgentMsg_Reattach( | 167 host_->Send(new DevToolsAgentMsg_Reattach( |
| 166 host_->GetRoutingID(), agent_->GetId(), agent_->session()->session_id(), | 168 host_->GetRoutingID(), agent_->GetId(), agent_->session()->session_id(), |
| 167 chunk_processor_.state_cookie())); | 169 chunk_processor_.state_cookie())); |
| 168 if (old) { | 170 if (old) { |
| 169 if (IsBrowserSideNavigationEnabled()) { | 171 if (IsBrowserSideNavigationEnabled()) { |
| 170 for (const auto& pair : | 172 for (const auto& pair : |
| 171 old->sent_messages_whose_reply_came_while_suspended_) { | 173 old->sent_messages_whose_reply_came_while_suspended_) { |
| 172 DispatchProtocolMessage(pair.second.session_id, pair.first, | 174 DispatchProtocolMessage(pair.second.session_id, pair.first, |
| 173 pair.second.method, pair.second.message); | 175 pair.second.method, pair.second.message); |
| 174 } | 176 } |
| 175 } | 177 } |
| 176 for (const auto& pair : old->sent_messages_) { | 178 for (const auto& pair : old->sent_messages_) { |
| 177 DispatchProtocolMessage(pair.second.session_id, pair.first, | 179 DispatchProtocolMessage(pair.second.session_id, pair.first, |
| 178 pair.second.method, pair.second.message); | 180 pair.second.method, pair.second.message); |
| 179 } | 181 } |
| 180 } | 182 } |
| 181 GrantPolicy(); | 183 GrantPolicy(); |
| 182 attached_ = true; | 184 attached_ = true; |
| 183 } | 185 } |
| 184 | 186 |
| 185 void RenderFrameDevToolsAgentHost::FrameHostHolder::Detach() { | 187 void RenderFrameDevToolsAgentHost::FrameHostHolder::Detach(int session_id) { |
| 186 host_->Send(new DevToolsAgentMsg_Detach(host_->GetRoutingID())); | 188 host_->Send(new DevToolsAgentMsg_Detach(host_->GetRoutingID())); |
| 187 RevokePolicy(); | 189 RevokePolicy(); |
| 188 attached_ = false; | 190 attached_ = false; |
| 189 } | 191 } |
| 190 | 192 |
| 191 void RenderFrameDevToolsAgentHost::FrameHostHolder::GrantPolicy() { | 193 void RenderFrameDevToolsAgentHost::FrameHostHolder::GrantPolicy() { |
| 192 ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies( | 194 ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies( |
| 193 host_->GetProcess()->GetID()); | 195 host_->GetProcess()->GetID()); |
| 194 } | 196 } |
| 195 | 197 |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 NavigationHandle* navigation_handle) { | 374 NavigationHandle* navigation_handle) { |
| 373 FrameTreeNode* frame_tree_node = | 375 FrameTreeNode* frame_tree_node = |
| 374 static_cast<NavigationHandleImpl*>(navigation_handle)->frame_tree_node(); | 376 static_cast<NavigationHandleImpl*>(navigation_handle)->frame_tree_node(); |
| 375 while (frame_tree_node && frame_tree_node->parent()) { | 377 while (frame_tree_node && frame_tree_node->parent()) { |
| 376 frame_tree_node = frame_tree_node->parent(); | 378 frame_tree_node = frame_tree_node->parent(); |
| 377 } | 379 } |
| 378 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(frame_tree_node); | 380 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(frame_tree_node); |
| 379 // Note Page.setControlNavigations is intended to control navigations in the | 381 // Note Page.setControlNavigations is intended to control navigations in the |
| 380 // main frame and all child frames and |page_handler_| only exists for the | 382 // main frame and all child frames and |page_handler_| only exists for the |
| 381 // main frame. | 383 // main frame. |
| 382 if (agent_host && agent_host->page_handler_) { | 384 if (!agent_host || !agent_host->session()) |
| 383 return agent_host->page_handler_->CreateThrottleForNavigation( | 385 return nullptr; |
| 384 navigation_handle); | 386 protocol::PageHandler* page_handler = agent_host->session()->GetPageHandler(); |
| 385 } | 387 if (!page_handler) |
| 386 return nullptr; | 388 return nullptr; |
| 389 return page_handler->CreateThrottleForNavigation(navigation_handle); |
| 387 } | 390 } |
| 388 | 391 |
| 389 // static | 392 // static |
| 390 bool RenderFrameDevToolsAgentHost::IsNetworkHandlerEnabled( | 393 bool RenderFrameDevToolsAgentHost::IsNetworkHandlerEnabled( |
| 391 FrameTreeNode* frame_tree_node) { | 394 FrameTreeNode* frame_tree_node) { |
| 392 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(frame_tree_node); | 395 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(frame_tree_node); |
| 393 return agent_host && agent_host->network_handler_ && | 396 if (!agent_host || !agent_host->session()) |
| 394 agent_host->network_handler_->enabled(); | 397 return false; |
| 398 protocol::NetworkHandler* network_handler = |
| 399 agent_host->session()->GetNetworkHandler(); |
| 400 return network_handler && network_handler->enabled(); |
| 395 } | 401 } |
| 396 | 402 |
| 397 // static | 403 // static |
| 398 std::string RenderFrameDevToolsAgentHost::UserAgentOverride( | 404 std::string RenderFrameDevToolsAgentHost::UserAgentOverride( |
| 399 FrameTreeNode* frame_tree_node) { | 405 FrameTreeNode* frame_tree_node) { |
| 400 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(frame_tree_node); | 406 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(frame_tree_node); |
| 401 if (agent_host && agent_host->network_handler_) | 407 if (!agent_host || !agent_host->session()) |
| 402 return agent_host->network_handler_->UserAgentOverride(); | 408 return std::string(); |
| 403 return std::string(); | 409 protocol::NetworkHandler* network_handler = |
| 410 agent_host->session()->GetNetworkHandler(); |
| 411 if (!network_handler) |
| 412 return std::string(); |
| 413 return network_handler->UserAgentOverride(); |
| 404 } | 414 } |
| 405 | 415 |
| 406 // static | 416 // static |
| 407 void RenderFrameDevToolsAgentHost::WebContentsCreated( | 417 void RenderFrameDevToolsAgentHost::WebContentsCreated( |
| 408 WebContents* web_contents) { | 418 WebContents* web_contents) { |
| 409 if (ShouldForceCreation()) { | 419 if (ShouldForceCreation()) { |
| 410 // Force agent host. | 420 // Force agent host. |
| 411 DevToolsAgentHost::GetOrCreateFor(web_contents); | 421 DevToolsAgentHost::GetOrCreateFor(web_contents); |
| 412 } | 422 } |
| 413 } | 423 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 | 484 |
| 475 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { | 485 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { |
| 476 WebContents* contents = web_contents(); | 486 WebContents* contents = web_contents(); |
| 477 return contents ? contents->GetBrowserContext() : nullptr; | 487 return contents ? contents->GetBrowserContext() : nullptr; |
| 478 } | 488 } |
| 479 | 489 |
| 480 WebContents* RenderFrameDevToolsAgentHost::GetWebContents() { | 490 WebContents* RenderFrameDevToolsAgentHost::GetWebContents() { |
| 481 return web_contents(); | 491 return web_contents(); |
| 482 } | 492 } |
| 483 | 493 |
| 484 void RenderFrameDevToolsAgentHost::Attach() { | 494 void RenderFrameDevToolsAgentHost::AttachSession(DevToolsSession* session) { |
| 485 session()->dispatcher()->setFallThroughForNotFound(true); | 495 session->SetFallThroughForNotFound(true); |
| 486 | 496 session->SetRenderFrameHost(handlers_frame_host_); |
| 487 if (!frame_tree_node_->parent()) { | 497 if (!frame_tree_node_->parent()) { |
| 488 emulation_handler_.reset(new protocol::EmulationHandler()); | 498 session->AddHandler(base::WrapUnique(new protocol::EmulationHandler())); |
| 489 emulation_handler_->Wire(session()->dispatcher()); | 499 session->AddHandler(base::WrapUnique(new protocol::PageHandler())); |
| 490 emulation_handler_->SetRenderFrameHost(handlers_frame_host_); | 500 session->AddHandler(base::WrapUnique(new protocol::SecurityHandler())); |
| 491 } | 501 } |
| 492 | 502 session->AddHandler(base::WrapUnique(new protocol::DOMHandler())); |
| 493 dom_handler_.reset(new protocol::DOMHandler()); | 503 session->AddHandler(base::WrapUnique(new protocol::InputHandler())); |
| 494 dom_handler_->Wire(session()->dispatcher()); | 504 session->AddHandler(base::WrapUnique(new protocol::InspectorHandler())); |
| 495 dom_handler_->SetRenderFrameHost(handlers_frame_host_); | 505 session->AddHandler(base::WrapUnique(new protocol::IOHandler( |
| 496 | 506 GetIOContext()))); |
| 497 input_handler_.reset(new protocol::InputHandler()); | 507 session->AddHandler(base::WrapUnique(new protocol::NetworkHandler())); |
| 498 input_handler_->Wire(session()->dispatcher()); | 508 session->AddHandler(base::WrapUnique(new protocol::SchemaHandler())); |
| 499 input_handler_->SetRenderFrameHost(handlers_frame_host_); | 509 session->AddHandler(base::WrapUnique(new protocol::ServiceWorkerHandler())); |
| 500 | 510 session->AddHandler(base::WrapUnique(new protocol::StorageHandler())); |
| 501 inspector_handler_.reset(new protocol::InspectorHandler()); | 511 session->AddHandler(base::WrapUnique(new protocol::TargetHandler())); |
| 502 inspector_handler_->Wire(session()->dispatcher()); | 512 session->AddHandler(base::WrapUnique(new protocol::TracingHandler( |
| 503 inspector_handler_->SetRenderFrameHost(handlers_frame_host_); | |
| 504 | |
| 505 io_handler_.reset(new protocol::IOHandler(GetIOContext())); | |
| 506 io_handler_->Wire(session()->dispatcher()); | |
| 507 | |
| 508 network_handler_.reset(new protocol::NetworkHandler()); | |
| 509 network_handler_->Wire(session()->dispatcher()); | |
| 510 network_handler_->SetRenderFrameHost(handlers_frame_host_); | |
| 511 | |
| 512 if (!frame_tree_node_->parent()) { | |
| 513 page_handler_.reset(new protocol::PageHandler()); | |
| 514 page_handler_->Wire(session()->dispatcher()); | |
| 515 page_handler_->SetRenderFrameHost(handlers_frame_host_); | |
| 516 } | |
| 517 | |
| 518 schema_handler_.reset(new protocol::SchemaHandler()); | |
| 519 schema_handler_->Wire(session()->dispatcher()); | |
| 520 | |
| 521 if (!frame_tree_node_->parent()) { | |
| 522 security_handler_.reset(new protocol::SecurityHandler()); | |
| 523 security_handler_->Wire(session()->dispatcher()); | |
| 524 security_handler_->SetRenderFrameHost(handlers_frame_host_); | |
| 525 } | |
| 526 | |
| 527 service_worker_handler_.reset(new protocol::ServiceWorkerHandler()); | |
| 528 service_worker_handler_->Wire(session()->dispatcher()); | |
| 529 service_worker_handler_->SetRenderFrameHost(handlers_frame_host_); | |
| 530 | |
| 531 storage_handler_.reset(new protocol::StorageHandler()); | |
| 532 storage_handler_->Wire(session()->dispatcher()); | |
| 533 storage_handler_->SetRenderFrameHost(handlers_frame_host_); | |
| 534 | |
| 535 target_handler_.reset(new protocol::TargetHandler()); | |
| 536 target_handler_->Wire(session()->dispatcher()); | |
| 537 target_handler_->SetRenderFrameHost(handlers_frame_host_); | |
| 538 | |
| 539 tracing_handler_.reset(new protocol::TracingHandler( | |
| 540 protocol::TracingHandler::Renderer, | 513 protocol::TracingHandler::Renderer, |
| 541 frame_tree_node_->frame_tree_node_id(), | 514 frame_tree_node_->frame_tree_node_id(), |
| 542 GetIOContext())); | 515 GetIOContext()))); |
| 543 tracing_handler_->Wire(session()->dispatcher()); | |
| 544 | 516 |
| 545 if (current_) | 517 if (current_) |
| 546 current_->Attach(); | 518 current_->Attach(session); |
| 547 if (pending_) | 519 if (pending_) |
| 548 pending_->Attach(); | 520 pending_->Attach(session); |
| 549 OnClientAttached(); | 521 OnClientAttached(); |
| 550 } | 522 } |
| 551 | 523 |
| 552 void RenderFrameDevToolsAgentHost::Detach() { | 524 void RenderFrameDevToolsAgentHost::DetachSession(int session_id) { |
| 553 dom_handler_->Disable(); | |
| 554 dom_handler_.reset(); | |
| 555 if (emulation_handler_) { | |
| 556 emulation_handler_->Disable(); | |
| 557 emulation_handler_.reset(); | |
| 558 } | |
| 559 input_handler_->Disable(); | |
| 560 input_handler_.reset(); | |
| 561 inspector_handler_->Disable(); | |
| 562 inspector_handler_.reset(); | |
| 563 io_handler_->Disable(); | |
| 564 io_handler_.reset(); | |
| 565 network_handler_->Disable(); | |
| 566 network_handler_.reset(); | |
| 567 if (page_handler_) { | |
| 568 page_handler_->Disable(); | |
| 569 page_handler_.reset(); | |
| 570 } | |
| 571 schema_handler_->Disable(); | |
| 572 schema_handler_.reset(); | |
| 573 if (security_handler_) { | |
| 574 security_handler_->Disable(); | |
| 575 security_handler_.reset(); | |
| 576 } | |
| 577 service_worker_handler_->Disable(); | |
| 578 service_worker_handler_.reset(); | |
| 579 storage_handler_->Disable(); | |
| 580 storage_handler_.reset(); | |
| 581 target_handler_->Disable(); | |
| 582 target_handler_.reset(); | |
| 583 tracing_handler_->Disable(); | |
| 584 tracing_handler_.reset(); | |
| 585 | |
| 586 if (current_) | 525 if (current_) |
| 587 current_->Detach(); | 526 current_->Detach(session_id); |
| 588 if (pending_) | 527 if (pending_) |
| 589 pending_->Detach(); | 528 pending_->Detach(session_id); |
| 590 OnClientDetached(); | 529 OnClientDetached(); |
| 591 } | 530 } |
| 592 | 531 |
| 593 bool RenderFrameDevToolsAgentHost::DispatchProtocolMessage( | 532 bool RenderFrameDevToolsAgentHost::DispatchProtocolMessage( |
| 533 DevToolsSession* session, |
| 594 const std::string& message) { | 534 const std::string& message) { |
| 595 int call_id = 0; | 535 int call_id = 0; |
| 596 std::string method; | 536 std::string method; |
| 597 if (session()->Dispatch(message, &call_id, &method) != | 537 if (session->Dispatch(message, true, &call_id, &method) != |
| 598 protocol::Response::kFallThrough) { | 538 protocol::Response::kFallThrough) { |
| 599 return true; | 539 return true; |
| 600 } | 540 } |
| 601 | 541 |
| 602 if (!navigating_handles_.empty()) { | 542 if (!navigating_handles_.empty()) { |
| 603 DCHECK(IsBrowserSideNavigationEnabled()); | 543 DCHECK(IsBrowserSideNavigationEnabled()); |
| 604 in_navigation_protocol_message_buffer_[call_id] = | 544 in_navigation_protocol_message_buffer_[call_id] = |
| 605 { session()->session_id(), method, message }; | 545 { session->session_id(), method, message }; |
| 606 return true; | 546 return true; |
| 607 } | 547 } |
| 608 | 548 |
| 609 if (current_) { | 549 if (current_) { |
| 610 current_->DispatchProtocolMessage( | 550 current_->DispatchProtocolMessage( |
| 611 session()->session_id(), call_id, method, message); | 551 session->session_id(), call_id, method, message); |
| 612 } | 552 } |
| 613 if (pending_) { | 553 if (pending_) { |
| 614 pending_->DispatchProtocolMessage( | 554 pending_->DispatchProtocolMessage( |
| 615 session()->session_id(), call_id, method, message); | 555 session->session_id(), call_id, method, message); |
| 616 } | 556 } |
| 617 return true; | 557 return true; |
| 618 } | 558 } |
| 619 | 559 |
| 620 void RenderFrameDevToolsAgentHost::InspectElement(int x, int y) { | 560 void RenderFrameDevToolsAgentHost::InspectElement( |
| 561 DevToolsSession* session, |
| 562 int x, |
| 563 int y) { |
| 621 if (current_) | 564 if (current_) |
| 622 current_->InspectElement(session()->session_id(), x, y); | 565 current_->InspectElement(session->session_id(), x, y); |
| 623 if (pending_) | 566 if (pending_) |
| 624 pending_->InspectElement(session()->session_id(), x, y); | 567 pending_->InspectElement(session->session_id(), x, y); |
| 625 } | 568 } |
| 626 | 569 |
| 627 void RenderFrameDevToolsAgentHost::OnClientAttached() { | 570 void RenderFrameDevToolsAgentHost::OnClientAttached() { |
| 628 if (!web_contents()) | 571 if (!web_contents()) |
| 629 return; | 572 return; |
| 630 | 573 |
| 631 frame_trace_recorder_.reset(new DevToolsFrameTraceRecorder()); | 574 frame_trace_recorder_.reset(new DevToolsFrameTraceRecorder()); |
| 632 CreatePowerSaveBlocker(); | 575 CreatePowerSaveBlocker(); |
| 633 } | 576 } |
| 634 | 577 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 } else { | 647 } else { |
| 705 DiscardPending(); | 648 DiscardPending(); |
| 706 } | 649 } |
| 707 pending_handle_ = nullptr; | 650 pending_handle_ = nullptr; |
| 708 } else if (navigating_handles_.empty()) { | 651 } else if (navigating_handles_.empty()) { |
| 709 current_->Resume(); | 652 current_->Resume(); |
| 710 } | 653 } |
| 711 DispatchBufferedProtocolMessagesIfNecessary(); | 654 DispatchBufferedProtocolMessagesIfNecessary(); |
| 712 | 655 |
| 713 DCHECK(CheckConsistency()); | 656 DCHECK(CheckConsistency()); |
| 714 if (target_handler_ && navigation_handle->HasCommitted()) | 657 protocol::TargetHandler* target_handler = |
| 715 target_handler_->UpdateServiceWorkers(); | 658 session() ? session()->GetTargetHandler() : nullptr; |
| 659 if (target_handler && navigation_handle->HasCommitted()) |
| 660 target_handler->UpdateServiceWorkers(); |
| 716 } | 661 } |
| 717 | 662 |
| 718 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( | 663 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( |
| 719 RenderFrameHost* old_host, | 664 RenderFrameHost* old_host, |
| 720 RenderFrameHost* new_host) { | 665 RenderFrameHost* new_host) { |
| 721 // CommitPending may destruct |this|. | 666 // CommitPending may destruct |this|. |
| 722 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); | 667 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
| 723 | 668 |
| 724 if (IsBrowserSideNavigationEnabled()) | 669 if (IsBrowserSideNavigationEnabled()) |
| 725 return; | 670 return; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 751 current_->Suspend(); | 696 current_->Suspend(); |
| 752 DCHECK(CheckConsistency()); | 697 DCHECK(CheckConsistency()); |
| 753 } | 698 } |
| 754 | 699 |
| 755 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( | 700 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( |
| 756 RenderFrameHost* old_host, | 701 RenderFrameHost* old_host, |
| 757 RenderFrameHost* new_host) { | 702 RenderFrameHost* new_host) { |
| 758 // CommitPending may destruct |this|. | 703 // CommitPending may destruct |this|. |
| 759 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); | 704 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
| 760 | 705 |
| 761 if (target_handler_) | 706 protocol::TargetHandler* target_handler = |
| 762 target_handler_->UpdateFrames(); | 707 session() ? session()->GetTargetHandler() : nullptr; |
| 708 if (target_handler) |
| 709 target_handler->UpdateFrames(); |
| 763 | 710 |
| 764 if (IsBrowserSideNavigationEnabled()) | 711 if (IsBrowserSideNavigationEnabled()) |
| 765 return; | 712 return; |
| 766 | 713 |
| 767 DCHECK(!pending_ || pending_->host() != old_host); | 714 DCHECK(!pending_ || pending_->host() != old_host); |
| 768 if (!current_ || current_->host() != old_host) { | 715 if (!current_ || current_->host() != old_host) { |
| 769 DCHECK(CheckConsistency()); | 716 DCHECK(CheckConsistency()); |
| 770 return; | 717 return; |
| 771 } | 718 } |
| 772 | 719 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); | 780 BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE))); |
| 834 if (web_contents()->GetNativeView()) { | 781 if (web_contents()->GetNativeView()) { |
| 835 power_save_blocker_->InitDisplaySleepBlocker( | 782 power_save_blocker_->InitDisplaySleepBlocker( |
| 836 web_contents()->GetNativeView()); | 783 web_contents()->GetNativeView()); |
| 837 } | 784 } |
| 838 #endif | 785 #endif |
| 839 } | 786 } |
| 840 | 787 |
| 841 void RenderFrameDevToolsAgentHost::RenderProcessGone( | 788 void RenderFrameDevToolsAgentHost::RenderProcessGone( |
| 842 base::TerminationStatus status) { | 789 base::TerminationStatus status) { |
| 790 protocol::InspectorHandler* inspector_handler = |
| 791 session() ? session()->GetInspectorHandler() : nullptr; |
| 843 switch(status) { | 792 switch(status) { |
| 844 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: | 793 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: |
| 845 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: | 794 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: |
| 846 #if defined(OS_CHROMEOS) | 795 #if defined(OS_CHROMEOS) |
| 847 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: | 796 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: |
| 848 #endif | 797 #endif |
| 849 case base::TERMINATION_STATUS_PROCESS_CRASHED: | 798 case base::TERMINATION_STATUS_PROCESS_CRASHED: |
| 850 #if defined(OS_ANDROID) | 799 #if defined(OS_ANDROID) |
| 851 case base::TERMINATION_STATUS_OOM_PROTECTED: | 800 case base::TERMINATION_STATUS_OOM_PROTECTED: |
| 852 #endif | 801 #endif |
| 853 case base::TERMINATION_STATUS_LAUNCH_FAILED: | 802 case base::TERMINATION_STATUS_LAUNCH_FAILED: |
| 854 if (inspector_handler_) | 803 if (inspector_handler) |
| 855 inspector_handler_->TargetCrashed(); | 804 inspector_handler->TargetCrashed(); |
| 856 current_frame_crashed_ = true; | 805 current_frame_crashed_ = true; |
| 857 break; | 806 break; |
| 858 default: | 807 default: |
| 859 if (inspector_handler_) | 808 if (inspector_handler) |
| 860 inspector_handler_->TargetDetached("Render process gone."); | 809 inspector_handler->TargetDetached("Render process gone."); |
| 861 break; | 810 break; |
| 862 } | 811 } |
| 863 DCHECK(CheckConsistency()); | 812 DCHECK(CheckConsistency()); |
| 864 } | 813 } |
| 865 | 814 |
| 866 bool RenderFrameDevToolsAgentHost::OnMessageReceived( | 815 bool RenderFrameDevToolsAgentHost::OnMessageReceived( |
| 867 const IPC::Message& message) { | 816 const IPC::Message& message) { |
| 868 if (!current_) | 817 if (!current_) |
| 869 return false; | 818 return false; |
| 870 if (message.type() == ViewHostMsg_SwapCompositorFrame::ID) | 819 if (message.type() == ViewHostMsg_SwapCompositorFrame::ID) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 887 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, | 836 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, |
| 888 OnDispatchOnInspectorFrontend) | 837 OnDispatchOnInspectorFrontend) |
| 889 IPC_MESSAGE_HANDLER(DevToolsAgentHostMsg_RequestNewWindow, | 838 IPC_MESSAGE_HANDLER(DevToolsAgentHostMsg_RequestNewWindow, |
| 890 OnRequestNewWindow) | 839 OnRequestNewWindow) |
| 891 IPC_MESSAGE_UNHANDLED(handled = false) | 840 IPC_MESSAGE_UNHANDLED(handled = false) |
| 892 IPC_END_MESSAGE_MAP() | 841 IPC_END_MESSAGE_MAP() |
| 893 return handled; | 842 return handled; |
| 894 } | 843 } |
| 895 | 844 |
| 896 void RenderFrameDevToolsAgentHost::DidAttachInterstitialPage() { | 845 void RenderFrameDevToolsAgentHost::DidAttachInterstitialPage() { |
| 897 if (page_handler_) | 846 protocol::PageHandler* page_handler = |
| 898 page_handler_->DidAttachInterstitialPage(); | 847 session() ? session()->GetPageHandler() : nullptr; |
| 848 if (page_handler) |
| 849 page_handler->DidAttachInterstitialPage(); |
| 899 | 850 |
| 900 // TODO(dgozman): this may break for cross-process subframes. | 851 // TODO(dgozman): this may break for cross-process subframes. |
| 901 if (!pending_) { | 852 if (!pending_) { |
| 902 DCHECK(CheckConsistency()); | 853 DCHECK(CheckConsistency()); |
| 903 return; | 854 return; |
| 904 } | 855 } |
| 905 // Pending set in AboutToNavigateRenderFrame turned out to be interstitial. | 856 // Pending set in AboutToNavigateRenderFrame turned out to be interstitial. |
| 906 // Connect back to the real one. | 857 // Connect back to the real one. |
| 907 DiscardPending(); | 858 DiscardPending(); |
| 908 pending_handle_ = nullptr; | 859 pending_handle_ = nullptr; |
| 909 DCHECK(CheckConsistency()); | 860 DCHECK(CheckConsistency()); |
| 910 } | 861 } |
| 911 | 862 |
| 912 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { | 863 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { |
| 913 if (page_handler_) | 864 protocol::PageHandler* page_handler = |
| 914 page_handler_->DidDetachInterstitialPage(); | 865 session() ? session()->GetPageHandler() : nullptr; |
| 866 if (page_handler) |
| 867 page_handler->DidDetachInterstitialPage(); |
| 915 } | 868 } |
| 916 | 869 |
| 917 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( | 870 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( |
| 918 RenderFrameHost* render_frame_host, | 871 RenderFrameHost* render_frame_host, |
| 919 const GURL& url, | 872 const GURL& url, |
| 920 ui::PageTransition transition_type) { | 873 ui::PageTransition transition_type) { |
| 921 // CommitPending may destruct |this|. | 874 // CommitPending may destruct |this|. |
| 922 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); | 875 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
| 923 | 876 |
| 924 if (IsBrowserSideNavigationEnabled()) | 877 if (IsBrowserSideNavigationEnabled()) |
| 925 return; | 878 return; |
| 926 if (pending_ && pending_->host() == render_frame_host) | 879 if (pending_ && pending_->host() == render_frame_host) |
| 927 CommitPending(); | 880 CommitPending(); |
| 928 DCHECK(CheckConsistency()); | 881 DCHECK(CheckConsistency()); |
| 929 if (target_handler_) | 882 protocol::TargetHandler* target_handler = |
| 930 target_handler_->UpdateServiceWorkers(); | 883 session() ? session()->GetTargetHandler() : nullptr; |
| 884 if (target_handler) |
| 885 target_handler->UpdateServiceWorkers(); |
| 931 } | 886 } |
| 932 | 887 |
| 933 void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad( | 888 void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad( |
| 934 RenderFrameHost* render_frame_host, | 889 RenderFrameHost* render_frame_host, |
| 935 const GURL& validated_url, | 890 const GURL& validated_url, |
| 936 int error_code, | 891 int error_code, |
| 937 const base::string16& error_description, | 892 const base::string16& error_description, |
| 938 bool was_ignored_by_handler) { | 893 bool was_ignored_by_handler) { |
| 939 if (IsBrowserSideNavigationEnabled()) | 894 if (IsBrowserSideNavigationEnabled()) |
| 940 return; | 895 return; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 969 | 924 |
| 970 void RenderFrameDevToolsAgentHost::UpdateProtocolHandlers( | 925 void RenderFrameDevToolsAgentHost::UpdateProtocolHandlers( |
| 971 RenderFrameHostImpl* host) { | 926 RenderFrameHostImpl* host) { |
| 972 #if DCHECK_IS_ON() | 927 #if DCHECK_IS_ON() |
| 973 // Check that we don't have stale host object here by accessing some random | 928 // Check that we don't have stale host object here by accessing some random |
| 974 // properties inside. | 929 // properties inside. |
| 975 if (handlers_frame_host_ && handlers_frame_host_->GetRenderWidgetHost()) | 930 if (handlers_frame_host_ && handlers_frame_host_->GetRenderWidgetHost()) |
| 976 handlers_frame_host_->GetRenderWidgetHost()->GetRoutingID(); | 931 handlers_frame_host_->GetRenderWidgetHost()->GetRoutingID(); |
| 977 #endif | 932 #endif |
| 978 handlers_frame_host_ = host; | 933 handlers_frame_host_ = host; |
| 979 if (dom_handler_) | 934 if (session()) |
| 980 dom_handler_->SetRenderFrameHost(host); | 935 session()->SetRenderFrameHost(host); |
| 981 if (emulation_handler_) | |
| 982 emulation_handler_->SetRenderFrameHost(host); | |
| 983 if (input_handler_) | |
| 984 input_handler_->SetRenderFrameHost(host); | |
| 985 if (inspector_handler_) | |
| 986 inspector_handler_->SetRenderFrameHost(host); | |
| 987 if (network_handler_) | |
| 988 network_handler_->SetRenderFrameHost(host); | |
| 989 if (page_handler_) | |
| 990 page_handler_->SetRenderFrameHost(host); | |
| 991 if (service_worker_handler_) | |
| 992 service_worker_handler_->SetRenderFrameHost(host); | |
| 993 if (security_handler_) | |
| 994 security_handler_->SetRenderFrameHost(host); | |
| 995 if (storage_handler_) | |
| 996 storage_handler_->SetRenderFrameHost(host); | |
| 997 if (target_handler_) | |
| 998 target_handler_->SetRenderFrameHost(host); | |
| 999 } | 936 } |
| 1000 | 937 |
| 1001 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { | 938 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { |
| 1002 if (pending_) | 939 if (pending_) |
| 1003 DiscardPending(); | 940 DiscardPending(); |
| 1004 UpdateProtocolHandlers(nullptr); | 941 UpdateProtocolHandlers(nullptr); |
| 1005 disconnected_ = std::move(current_); | 942 disconnected_ = std::move(current_); |
| 1006 disconnected_->Detach(); | 943 if (session()) |
| 944 disconnected_->Detach(session()->session_id()); |
| 1007 frame_tree_node_ = nullptr; | 945 frame_tree_node_ = nullptr; |
| 1008 in_navigation_protocol_message_buffer_.clear(); | 946 in_navigation_protocol_message_buffer_.clear(); |
| 1009 navigating_handles_.clear(); | 947 navigating_handles_.clear(); |
| 1010 pending_handle_ = nullptr; | 948 pending_handle_ = nullptr; |
| 1011 WebContentsObserver::Observe(nullptr); | 949 WebContentsObserver::Observe(nullptr); |
| 1012 } | 950 } |
| 1013 | 951 |
| 1014 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { | 952 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { |
| 1015 // CommitPending may destruct |this|. | 953 // CommitPending may destruct |this|. |
| 1016 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); | 954 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1126 if (content::WebContents* contents = web_contents()) | 1064 if (content::WebContents* contents = web_contents()) |
| 1127 return contents->GetLastActiveTime(); | 1065 return contents->GetLastActiveTime(); |
| 1128 return base::TimeTicks(); | 1066 return base::TimeTicks(); |
| 1129 } | 1067 } |
| 1130 | 1068 |
| 1131 void RenderFrameDevToolsAgentHost::OnSwapCompositorFrame( | 1069 void RenderFrameDevToolsAgentHost::OnSwapCompositorFrame( |
| 1132 const IPC::Message& message) { | 1070 const IPC::Message& message) { |
| 1133 ViewHostMsg_SwapCompositorFrame::Param param; | 1071 ViewHostMsg_SwapCompositorFrame::Param param; |
| 1134 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) | 1072 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) |
| 1135 return; | 1073 return; |
| 1136 if (page_handler_) { | 1074 protocol::PageHandler* page_handler = |
| 1137 page_handler_->OnSwapCompositorFrame( | 1075 session() ? session()->GetPageHandler() : nullptr; |
| 1076 if (page_handler) { |
| 1077 page_handler->OnSwapCompositorFrame( |
| 1138 std::move(std::get<1>(param).metadata)); | 1078 std::move(std::get<1>(param).metadata)); |
| 1139 } | 1079 } |
| 1140 if (input_handler_) | 1080 protocol::InputHandler* input_handler = |
| 1141 input_handler_->OnSwapCompositorFrame(std::get<1>(param).metadata); | 1081 session() ? session()->GetInputHandler() : nullptr; |
| 1142 if (frame_trace_recorder_ && tracing_handler_->did_initiate_recording()) { | 1082 if (input_handler) |
| 1083 input_handler->OnSwapCompositorFrame(std::get<1>(param).metadata); |
| 1084 protocol::TracingHandler* tracing_handler = |
| 1085 session() ? session()->GetTracingHandler() : nullptr; |
| 1086 if (frame_trace_recorder_ && tracing_handler && |
| 1087 tracing_handler->did_initiate_recording()) { |
| 1143 frame_trace_recorder_->OnSwapCompositorFrame( | 1088 frame_trace_recorder_->OnSwapCompositorFrame( |
| 1144 current_ ? current_->host() : nullptr, std::get<1>(param).metadata); | 1089 current_ ? current_->host() : nullptr, std::get<1>(param).metadata); |
| 1145 } | 1090 } |
| 1146 } | 1091 } |
| 1147 | 1092 |
| 1148 void RenderFrameDevToolsAgentHost::SignalSynchronousSwapCompositorFrame( | 1093 void RenderFrameDevToolsAgentHost::SignalSynchronousSwapCompositorFrame( |
| 1149 RenderFrameHost* frame_host, | 1094 RenderFrameHost* frame_host, |
| 1150 cc::CompositorFrameMetadata frame_metadata) { | 1095 cc::CompositorFrameMetadata frame_metadata) { |
| 1151 scoped_refptr<RenderFrameDevToolsAgentHost> dtah(FindAgentHost(frame_host)); | 1096 scoped_refptr<RenderFrameDevToolsAgentHost> dtah(FindAgentHost(frame_host)); |
| 1152 if (dtah) { | 1097 if (dtah) { |
| 1153 // Unblock the compositor. | 1098 // Unblock the compositor. |
| 1154 BrowserThread::PostTask( | 1099 BrowserThread::PostTask( |
| 1155 BrowserThread::UI, FROM_HERE, | 1100 BrowserThread::UI, FROM_HERE, |
| 1156 base::Bind( | 1101 base::Bind( |
| 1157 &RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame, | 1102 &RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame, |
| 1158 dtah.get(), | 1103 dtah.get(), |
| 1159 base::Passed(std::move(frame_metadata)))); | 1104 base::Passed(std::move(frame_metadata)))); |
| 1160 } | 1105 } |
| 1161 } | 1106 } |
| 1162 | 1107 |
| 1163 void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( | 1108 void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( |
| 1164 cc::CompositorFrameMetadata frame_metadata) { | 1109 cc::CompositorFrameMetadata frame_metadata) { |
| 1165 if (page_handler_) | 1110 protocol::PageHandler* page_handler = |
| 1166 page_handler_->OnSynchronousSwapCompositorFrame(std::move(frame_metadata)); | 1111 session() ? session()->GetPageHandler() : nullptr; |
| 1167 if (input_handler_) | 1112 if (page_handler) |
| 1168 input_handler_->OnSwapCompositorFrame(frame_metadata); | 1113 page_handler->OnSynchronousSwapCompositorFrame(std::move(frame_metadata)); |
| 1169 if (frame_trace_recorder_ && tracing_handler_->did_initiate_recording()) { | 1114 protocol::InputHandler* input_handler = |
| 1115 session() ? session()->GetInputHandler() : nullptr; |
| 1116 if (input_handler) |
| 1117 input_handler->OnSwapCompositorFrame(frame_metadata); |
| 1118 protocol::TracingHandler* tracing_handler = |
| 1119 session() ? session()->GetTracingHandler() : nullptr; |
| 1120 if (frame_trace_recorder_ && tracing_handler && |
| 1121 tracing_handler->did_initiate_recording()) { |
| 1170 frame_trace_recorder_->OnSynchronousSwapCompositorFrame( | 1122 frame_trace_recorder_->OnSynchronousSwapCompositorFrame( |
| 1171 current_ ? current_->host() : nullptr, | 1123 current_ ? current_->host() : nullptr, |
| 1172 frame_metadata); | 1124 frame_metadata); |
| 1173 } | 1125 } |
| 1174 } | 1126 } |
| 1175 | 1127 |
| 1176 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( | 1128 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( |
| 1177 RenderFrameHost* sender, | 1129 RenderFrameHost* sender, |
| 1178 const DevToolsMessageChunk& message) { | 1130 const DevToolsMessageChunk& message) { |
| 1179 bool success = true; | 1131 bool success = true; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1209 RenderFrameHost* host) { | 1161 RenderFrameHost* host) { |
| 1210 return (current_ && current_->host() == host) || | 1162 return (current_ && current_->host() == host) || |
| 1211 (pending_ && pending_->host() == host); | 1163 (pending_ && pending_->host() == host); |
| 1212 } | 1164 } |
| 1213 | 1165 |
| 1214 bool RenderFrameDevToolsAgentHost::IsChildFrame() { | 1166 bool RenderFrameDevToolsAgentHost::IsChildFrame() { |
| 1215 return current_ && current_->host()->GetParent(); | 1167 return current_ && current_->host()->GetParent(); |
| 1216 } | 1168 } |
| 1217 | 1169 |
| 1218 } // namespace content | 1170 } // namespace content |
| OLD | NEW |