| // Copyright 2019 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/test/did_commit_navigation_interceptor.h" |
| |
| #include "base/memory/raw_ptr.h" |
| #include "content/browser/renderer_host/render_frame_host_impl.h" |
| #include "content/common/frame.mojom-test-utils.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/web_contents.h" |
| |
| namespace content { |
| |
| // Responsible for intercepting DidCommitNavigation's being processed by |
| // a given RenderFrameHostImpl. |
| class DidCommitNavigationInterceptor::FrameAgent |
| : public RenderFrameHostImpl::CommitCallbackInterceptor { |
| public: |
| FrameAgent(DidCommitNavigationInterceptor* interceptor, RenderFrameHost* rfh) |
| : interceptor_(interceptor), |
| rfhi_(static_cast<RenderFrameHostImpl*>(rfh)) { |
| rfhi_->SetCommitCallbackInterceptorForTesting(this); |
| } |
| |
| FrameAgent(const FrameAgent&) = delete; |
| FrameAgent& operator=(const FrameAgent&) = delete; |
| |
| ~FrameAgent() override { |
| rfhi_->SetCommitCallbackInterceptorForTesting(nullptr); |
| } |
| |
| bool WillProcessDidCommitNavigation( |
| NavigationRequest* navigation_request, |
| mojom::DidCommitProvisionalLoadParamsPtr* params, |
| mojom::DidCommitProvisionalLoadInterfaceParamsPtr* interface_params) |
| override { |
| return interceptor_->WillProcessDidCommitNavigation( |
| rfhi_, navigation_request, params, interface_params); |
| } |
| |
| private: |
| raw_ptr<DidCommitNavigationInterceptor> interceptor_; |
| |
| raw_ptr<RenderFrameHostImpl> rfhi_; |
| }; |
| |
| DidCommitNavigationInterceptor::DidCommitNavigationInterceptor( |
| WebContents* web_contents) |
| : WebContentsObserver(web_contents) { |
| web_contents->ForEachRenderFrameHost(base::BindRepeating( |
| [](DidCommitNavigationInterceptor* interceptor, |
| RenderFrameHost* render_frame_host) { |
| if (render_frame_host->IsRenderFrameLive()) |
| interceptor->RenderFrameCreated(render_frame_host); |
| }, |
| this)); |
| } |
| |
| DidCommitNavigationInterceptor::~DidCommitNavigationInterceptor() = default; |
| |
| void DidCommitNavigationInterceptor::RenderFrameCreated( |
| RenderFrameHost* render_frame_host) { |
| bool did_insert; |
| std::tie(std::ignore, did_insert) = frame_agents_.emplace( |
| render_frame_host, std::make_unique<FrameAgent>(this, render_frame_host)); |
| DCHECK(did_insert); |
| } |
| |
| void DidCommitNavigationInterceptor::RenderFrameDeleted( |
| RenderFrameHost* render_frame_host) { |
| bool did_remove = !!frame_agents_.erase(render_frame_host); |
| DCHECK(did_remove); |
| } |
| |
| } // namespace content |