From f1a0b68a85b81cf22d8bcf089c664cfdb57b51ff Mon Sep 17 00:00:00 2001
From: Dave Tapuska <dtapuska@chromium.org>
Date: Tue, 19 Jan 2021 21:06:05 +0000
Subject: [PATCH] Remove the last SubresourceFilter message by moving it to
 mojom.

Create a SubresourceFilter interface in mojo. Adjust the tests so
that we can capture the send of the message to the MockRenderProcess.

BUG=993189,820612

Change-Id: I72f5d2ba3305955165fea2555271089812ada8ba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2633353
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Ken Buchanan <kenrb@chromium.org>
Reviewed-by: Charlie Harrison <csharrison@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844893}
---
 ...ent_subresource_filter_throttle_manager.cc |  1 -
 ...source_filter_throttle_manager_unittest.cc |  1 -
 .../content/browser/ruleset_publisher_impl.cc | 27 ++++---
 .../content/browser/ruleset_publisher_impl.h  |  5 ++
 .../ruleset_publisher_impl_unittest.cc        | 78 +++++++++++--------
 .../content/browser/ruleset_service.cc        |  1 -
 .../content/common/BUILD.gn                   |  3 -
 .../subresource_filter_message_generator.cc   |  7 --
 .../subresource_filter_message_generator.h    | 29 -------
 .../common/subresource_filter_messages.h      | 24 ------
 .../content/renderer/BUILD.gn                 |  1 +
 .../renderer/subresource_filter_agent.cc      |  1 -
 .../subresource_filter_agent_unittest.cc      |  1 -
 .../renderer/unverified_ruleset_dealer.cc     | 38 +++++----
 .../renderer/unverified_ruleset_dealer.h      | 28 ++++---
 .../core/mojom/subresource_filter.mojom       |  9 +++
 ipc/ipc_message_start.h                       |  1 -
 tools/ipc_fuzzer/message_lib/all_messages.h   |  1 -
 18 files changed, 121 insertions(+), 135 deletions(-)
 delete mode 100644 components/subresource_filter/content/common/subresource_filter_message_generator.cc
 delete mode 100644 components/subresource_filter/content/common/subresource_filter_message_generator.h
 delete mode 100644 components/subresource_filter/content/common/subresource_filter_messages.h

diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
index de874030042c2..4f4ed7fa1203e 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -21,7 +21,6 @@
 #include "components/subresource_filter/content/browser/profile_interaction_manager.h"
 #include "components/subresource_filter/content/browser/subresource_filter_client.h"
 #include "components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/content/common/subresource_filter_utils.h"
 #include "components/subresource_filter/content/mojom/subresource_filter_agent.mojom.h"
 #include "components/subresource_filter/core/browser/subresource_filter_constants.h"
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
index 38c46f3c12314..51c21abebb265 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
@@ -27,7 +27,6 @@
 #include "components/subresource_filter/content/browser/subframe_navigation_test_utils.h"
 #include "components/subresource_filter/content/browser/subresource_filter_client.h"
 #include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/content/mojom/subresource_filter_agent.mojom.h"
 #include "components/subresource_filter/core/browser/subresource_filter_features.h"
 #include "components/subresource_filter/core/common/common_features.h"
diff --git a/components/subresource_filter/content/browser/ruleset_publisher_impl.cc b/components/subresource_filter/content/browser/ruleset_publisher_impl.cc
index 0d4275298fd9c..d90059f01d9a4 100644
--- a/components/subresource_filter/content/browser/ruleset_publisher_impl.cc
+++ b/components/subresource_filter/content/browser/ruleset_publisher_impl.cc
@@ -11,34 +11,25 @@
 #include "base/feature_list.h"
 #include "base/files/file_util.h"
 #include "base/location.h"
+#include "base/logging.h"
 #include "base/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/task_runner_util.h"
 #include "components/subresource_filter/content/browser/ruleset_service.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/core/browser/subresource_filter_constants.h"
 #include "components/subresource_filter/core/common/common_features.h"
+#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_source.h"
 #include "content/public/browser/notification_types.h"
 #include "content/public/browser/render_process_host.h"
-#include "ipc/ipc_platform_file.h"
 
 namespace subresource_filter {
 
 namespace {
 
-void SendRulesetToRenderProcess(base::File* file,
-                                content::RenderProcessHost* rph) {
-  DCHECK(rph);
-  DCHECK(file);
-  DCHECK(file->IsValid());
-  rph->Send(new SubresourceFilterMsg_SetRulesetForProcess(
-      IPC::TakePlatformFileForTransit(file->Duplicate())));
-}
-
 // The file handle is closed when the argument goes out of scope.
 void CloseFile(base::File) {}
 
@@ -137,4 +128,18 @@ void RulesetPublisherImpl::Observe(
       content::Source<content::RenderProcessHost>(source).ptr());
 }
 
+void RulesetPublisherImpl::SendRulesetToRenderProcess(
+    base::File* file,
+    content::RenderProcessHost* rph) {
+  DCHECK(rph);
+  DCHECK(file);
+  DCHECK(file->IsValid());
+  if (!rph->GetChannel())
+    return;
+  mojo::AssociatedRemote<mojom::SubresourceFilterRulesetObserver>
+      subresource_filter;
+  rph->GetChannel()->GetRemoteAssociatedInterface(&subresource_filter);
+  subresource_filter->SetRulesetForProcess(file->Duplicate());
+}
+
 }  // namespace subresource_filter
diff --git a/components/subresource_filter/content/browser/ruleset_publisher_impl.h b/components/subresource_filter/content/browser/ruleset_publisher_impl.h
index d08b548cf5fd4..111ca6c98fa22 100644
--- a/components/subresource_filter/content/browser/ruleset_publisher_impl.h
+++ b/components/subresource_filter/content/browser/ruleset_publisher_impl.h
@@ -18,6 +18,7 @@
 #include "components/subresource_filter/content/browser/verified_ruleset_dealer.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/render_process_host.h"
 
 namespace subresource_filter {
 
@@ -51,6 +52,10 @@ class RulesetPublisherImpl : public RulesetPublisher,
   void IndexAndStoreAndPublishRulesetIfNeeded(
       const UnindexedRulesetInfo& unindex_ruleset_info);
 
+ protected:
+  virtual void SendRulesetToRenderProcess(base::File* file,
+                                          content::RenderProcessHost* rph);
+
  private:
   // content::NotificationObserver:
   void Observe(int type,
diff --git a/components/subresource_filter/content/browser/ruleset_publisher_impl_unittest.cc b/components/subresource_filter/content/browser/ruleset_publisher_impl_unittest.cc
index b9922038fa2a3..5d93ca0ac3bad 100644
--- a/components/subresource_filter/content/browser/ruleset_publisher_impl_unittest.cc
+++ b/components/subresource_filter/content/browser/ruleset_publisher_impl_unittest.cc
@@ -23,7 +23,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/subresource_filter/content/browser/ruleset_service.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/core/common/test_ruleset_creator.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/content_browser_client.h"
@@ -64,13 +63,6 @@ std::string ReadFileContentsToString(base::File* file) {
   return contents;
 }
 
-// Extracts and takes ownership of the ruleset file handle in the IPC message.
-base::File ExtractRulesetFromMessage(const IPC::Message* message) {
-  std::tuple<IPC::PlatformFileForTransit> arg;
-  SubresourceFilterMsg_SetRulesetForProcess::Read(message, &arg);
-  return IPC::PlatformFileForTransitToFile(std::get<0>(arg));
-}
-
 }  // namespace
 
 class SubresourceFilterRulesetPublisherImplTest : public ::testing::Test {
@@ -91,15 +83,11 @@ class SubresourceFilterRulesetPublisherImplTest : public ::testing::Test {
     return scoped_temp_dir_.GetPath().AppendASCII("data");
   }
 
-  void AssertSetRulesetForProcessMessageWithContent(
-      const IPC::Message* message,
-      const std::string& expected_contents) {
-    ASSERT_EQ(
-        static_cast<uint32_t>(SubresourceFilterMsg_SetRulesetForProcess::ID),
-        message->type());
-    base::File ruleset_file = ExtractRulesetFromMessage(message);
-    ASSERT_TRUE(ruleset_file.IsValid());
-    ASSERT_EQ(expected_contents, ReadFileContentsToString(&ruleset_file));
+  void AssertSetRulesetFileWithContent(base::File* ruleset_file,
+                                       const std::string& expected_contents) {
+    ASSERT_TRUE(ruleset_file);
+    ASSERT_TRUE(ruleset_file->IsValid());
+    ASSERT_EQ(expected_contents, ReadFileContentsToString(ruleset_file));
   }
 
  private:
@@ -111,13 +99,39 @@ class SubresourceFilterRulesetPublisherImplTest : public ::testing::Test {
   DISALLOW_COPY_AND_ASSIGN(SubresourceFilterRulesetPublisherImplTest);
 };
 
+class MockRulesetPublisherImpl : public RulesetPublisherImpl {
+ public:
+  template <typename... Args>
+  explicit MockRulesetPublisherImpl(Args&&... args)
+      : RulesetPublisherImpl(std::forward<Args>(args)...) {}
+  void SendRulesetToRenderProcess(
+      base::File* file,
+      content::RenderProcessHost* process) override {
+    last_file_[process] = file;
+    sent_count_++;
+  }
+
+  size_t RulesetSent() const { return sent_count_; }
+
+  base::File* RulesetFileForProcess(content::RenderProcessHost* process) {
+    auto it = last_file_.find(process);
+    if (it == last_file_.end())
+      return nullptr;
+    return it->second;
+  }
+
+ private:
+  size_t sent_count_ = 0;
+  std::map<content::RenderProcessHost*, base::File*> last_file_;
+};
+
 TEST_F(SubresourceFilterRulesetPublisherImplTest, NoRuleset_NoIPCMessages) {
   NotifyingMockRenderProcessHost existing_renderer(browser_context());
-  RulesetPublisherImpl service(nullptr, base::ThreadTaskRunnerHandle::Get());
+  MockRulesetPublisherImpl service(nullptr,
+                                   base::ThreadTaskRunnerHandle::Get());
   NotifyingMockRenderProcessHost new_renderer(browser_context());
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(0u, existing_renderer.sink().message_count());
-  EXPECT_EQ(0u, new_renderer.sink().message_count());
+  EXPECT_EQ(0u, service.RulesetSent());
 }
 
 TEST_F(SubresourceFilterRulesetPublisherImplTest,
@@ -132,7 +146,8 @@ TEST_F(SubresourceFilterRulesetPublisherImplTest,
 
   NotifyingMockRenderProcessHost existing_renderer(browser_context());
   MockClosureTarget publish_callback_target;
-  RulesetPublisherImpl service(nullptr, base::ThreadTaskRunnerHandle::Get());
+  MockRulesetPublisherImpl service(nullptr,
+                                   base::ThreadTaskRunnerHandle::Get());
   service.SetRulesetPublishedCallbackForTesting(base::BindOnce(
       &MockClosureTarget::Call, base::Unretained(&publish_callback_target)));
   EXPECT_CALL(publish_callback_target, Call()).Times(1);
@@ -140,16 +155,16 @@ TEST_F(SubresourceFilterRulesetPublisherImplTest,
   base::RunLoop().RunUntilIdle();
   ::testing::Mock::VerifyAndClearExpectations(&publish_callback_target);
 
-  ASSERT_EQ(1u, existing_renderer.sink().message_count());
-  ASSERT_NO_FATAL_FAILURE(AssertSetRulesetForProcessMessageWithContent(
-      existing_renderer.sink().GetMessageAt(0), kTestFileContents));
+  ASSERT_EQ(2u, service.RulesetSent());
+  ASSERT_NO_FATAL_FAILURE(AssertSetRulesetFileWithContent(
+      service.RulesetFileForProcess(&existing_renderer), kTestFileContents));
 
   NotifyingMockRenderProcessHost second_renderer(browser_context());
   base::RunLoop().RunUntilIdle();
 
-  ASSERT_EQ(1u, second_renderer.sink().message_count());
-  ASSERT_NO_FATAL_FAILURE(AssertSetRulesetForProcessMessageWithContent(
-      second_renderer.sink().GetMessageAt(0), kTestFileContents));
+  ASSERT_EQ(3u, service.RulesetSent());
+  ASSERT_NO_FATAL_FAILURE(AssertSetRulesetFileWithContent(
+      service.RulesetFileForProcess(&second_renderer), kTestFileContents));
 }
 
 TEST_F(SubresourceFilterRulesetPublisherImplTest,
@@ -192,9 +207,10 @@ TEST_F(SubresourceFilterRulesetPublisherImplTest,
   NotifyingMockRenderProcessHost renderer_host(browser_context());
   base::RunLoop callback_waiter;
   auto content_service =
-      std::make_unique<RulesetPublisherImpl>(nullptr, blocking_task_runner);
+      std::make_unique<MockRulesetPublisherImpl>(nullptr, blocking_task_runner);
   content_service->SetRulesetPublishedCallbackForTesting(
       callback_waiter.QuitClosure());
+  auto* mock_publisher = content_service.get();
 
   // |RulesetService| constructor should read the last indexed ruleset version
   // and post ruleset setup on |blocking_task_runner|.
@@ -211,11 +227,11 @@ TEST_F(SubresourceFilterRulesetPublisherImplTest,
   callback_waiter.Run();
 
   // Check that the ruleset data is delivered to the renderer.
-  EXPECT_EQ(1u, renderer_host.sink().message_count());
+  ASSERT_EQ(2u, mock_publisher->RulesetSent());
   const std::string expected_data(ruleset.indexed.contents.begin(),
                                   ruleset.indexed.contents.end());
-  ASSERT_NO_FATAL_FAILURE(AssertSetRulesetForProcessMessageWithContent(
-      renderer_host.sink().GetMessageAt(0), expected_data));
+  ASSERT_NO_FATAL_FAILURE(AssertSetRulesetFileWithContent(
+      mock_publisher->RulesetFileForProcess(&renderer_host), expected_data));
 
   //
   // |RulesetPublisherImpl| destruction requires additional tricks. Its member
diff --git a/components/subresource_filter/content/browser/ruleset_service.cc b/components/subresource_filter/content/browser/ruleset_service.cc
index 085e713ae6bd7..98985db47809d 100644
--- a/components/subresource_filter/content/browser/ruleset_service.cc
+++ b/components/subresource_filter/content/browser/ruleset_service.cc
@@ -27,7 +27,6 @@
 #include "components/subresource_filter/content/browser/ruleset_publisher.h"
 #include "components/subresource_filter/content/browser/ruleset_publisher_impl.h"
 #include "components/subresource_filter/content/browser/unindexed_ruleset_stream_generator.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/core/browser/copying_file_stream.h"
 #include "components/subresource_filter/core/browser/subresource_filter_constants.h"
 #include "components/subresource_filter/core/browser/subresource_filter_features.h"
diff --git a/components/subresource_filter/content/common/BUILD.gn b/components/subresource_filter/content/common/BUILD.gn
index 49180832317b4..98dfe332af77b 100644
--- a/components/subresource_filter/content/common/BUILD.gn
+++ b/components/subresource_filter/content/common/BUILD.gn
@@ -6,9 +6,6 @@ static_library("common") {
   sources = [
     "ruleset_dealer.cc",
     "ruleset_dealer.h",
-    "subresource_filter_message_generator.cc",
-    "subresource_filter_message_generator.h",
-    "subresource_filter_messages.h",
     "subresource_filter_utils.cc",
     "subresource_filter_utils.h",
   ]
diff --git a/components/subresource_filter/content/common/subresource_filter_message_generator.cc b/components/subresource_filter/content/common/subresource_filter_message_generator.cc
deleted file mode 100644
index 276a08a20ab3e..0000000000000
--- a/components/subresource_filter/content/common/subresource_filter_message_generator.cc
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2016 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.
-
-// Multiply-included file, hence no include guard.
-
-#include "components/subresource_filter/content/common/subresource_filter_message_generator.h"
diff --git a/components/subresource_filter/content/common/subresource_filter_message_generator.h b/components/subresource_filter/content/common/subresource_filter_message_generator.h
deleted file mode 100644
index a1f06dbc28ad9..0000000000000
--- a/components/subresource_filter/content/common/subresource_filter_message_generator.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 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.
-
-// Get basic type definitions.
-#define IPC_MESSAGE_IMPL
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
-
-// Generate constructors.
-#include "ipc/struct_constructor_macros.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
-
-// Generate param traits write methods.
-#include "ipc/param_traits_write_macros.h"
-namespace IPC {
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
-}  // namespace IPC
-
-// Generate param traits read methods.
-#include "ipc/param_traits_read_macros.h"
-namespace IPC {
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
-}  // namespace IPC
-
-// Generate param traits log methods.
-#include "ipc/param_traits_log_macros.h"
-namespace IPC {
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
-}  // namespace IPC
diff --git a/components/subresource_filter/content/common/subresource_filter_messages.h b/components/subresource_filter/content/common/subresource_filter_messages.h
deleted file mode 100644
index 1e3c36db19d0b..0000000000000
--- a/components/subresource_filter/content/common/subresource_filter_messages.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 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.
-
-// Message definition file, included multiple times, hence no include guard.
-// no-include-guard-because-multiply-included
-
-#include "base/time/time.h"
-#include "content/public/common/common_param_traits_macros.h"
-#include "ipc/ipc_message.h"
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_platform_file.h"
-
-#define IPC_MESSAGE_START SubresourceFilterMsgStart
-
-// ----------------------------------------------------------------------------
-// Messages sent from the browser to the renderer.
-// ----------------------------------------------------------------------------
-
-// Sends a read-only mode file handle with the ruleset data to a renderer
-// process, containing the subresource filtering rules to be consulted for all
-// subsequent document loads that have subresource filtering activated.
-IPC_MESSAGE_CONTROL1(SubresourceFilterMsg_SetRulesetForProcess,
-                     IPC::PlatformFileForTransit /* ruleset_file */)
diff --git a/components/subresource_filter/content/renderer/BUILD.gn b/components/subresource_filter/content/renderer/BUILD.gn
index 5c5b289964d8c..e9afaff414b40 100644
--- a/components/subresource_filter/content/renderer/BUILD.gn
+++ b/components/subresource_filter/content/renderer/BUILD.gn
@@ -18,6 +18,7 @@ static_library("renderer") {
     "//components/subresource_filter/content/common",
     "//components/subresource_filter/content/mojom",
     "//components/subresource_filter/core/common",
+    "//components/subresource_filter/core/mojom",
     "//content/public/common",
     "//content/public/renderer",
     "//third_party/blink/public:blink",
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
index 274e4f20534ec..ffc002d261415 100644
--- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
@@ -13,7 +13,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/content/common/subresource_filter_utils.h"
 #include "components/subresource_filter/content/renderer/unverified_ruleset_dealer.h"
 #include "components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h"
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
index 9ce2a873276ba..4ec416d586394 100644
--- a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/strings/string_piece.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/time/time.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/content/renderer/unverified_ruleset_dealer.h"
 #include "components/subresource_filter/core/common/memory_mapped_ruleset.h"
 #include "components/subresource_filter/core/common/scoped_timers.h"
diff --git a/components/subresource_filter/content/renderer/unverified_ruleset_dealer.cc b/components/subresource_filter/content/renderer/unverified_ruleset_dealer.cc
index e014c732a700e..63a3d8fc0a388 100644
--- a/components/subresource_filter/content/renderer/unverified_ruleset_dealer.cc
+++ b/components/subresource_filter/content/renderer/unverified_ruleset_dealer.cc
@@ -4,28 +4,38 @@
 
 #include "components/subresource_filter/content/renderer/unverified_ruleset_dealer.h"
 
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
-#include "ipc/ipc_message_macros.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 
 namespace subresource_filter {
 
 UnverifiedRulesetDealer::UnverifiedRulesetDealer() = default;
 UnverifiedRulesetDealer::~UnverifiedRulesetDealer() = default;
 
-bool UnverifiedRulesetDealer::OnControlMessageReceived(
-    const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(UnverifiedRulesetDealer, message)
-    IPC_MESSAGE_HANDLER(SubresourceFilterMsg_SetRulesetForProcess,
-                        OnSetRulesetForProcess)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
+void UnverifiedRulesetDealer::RegisterMojoInterfaces(
+    blink::AssociatedInterfaceRegistry* associated_interfaces) {
+  // base::Unretained can be used here because the associated_interfaces
+  // is owned by the RenderThread and will live for the duration of the
+  // RenderThread.
+  associated_interfaces->AddInterface(
+      base::BindRepeating(&UnverifiedRulesetDealer::OnRendererAssociatedRequest,
+                          base::Unretained(this)));
 }
 
-void UnverifiedRulesetDealer::OnSetRulesetForProcess(
-    const IPC::PlatformFileForTransit& platform_file) {
-  SetRulesetFile(IPC::PlatformFileForTransitToFile(platform_file));
+void UnverifiedRulesetDealer::UnregisterMojoInterfaces(
+    blink::AssociatedInterfaceRegistry* associated_interfaces) {
+  associated_interfaces->RemoveInterface(
+      mojom::SubresourceFilterRulesetObserver::Name_);
+}
+
+void UnverifiedRulesetDealer::SetRulesetForProcess(base::File ruleset_file) {
+  SetRulesetFile(std::move(ruleset_file));
+}
+
+void UnverifiedRulesetDealer::OnRendererAssociatedRequest(
+    mojo::PendingAssociatedReceiver<mojom::SubresourceFilterRulesetObserver>
+        receiver) {
+  receiver_.reset();
+  receiver_.Bind(std::move(receiver));
 }
 
 }  // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/unverified_ruleset_dealer.h b/components/subresource_filter/content/renderer/unverified_ruleset_dealer.h
index 329e61222587a..7e9516e8e94ee 100644
--- a/components/subresource_filter/content/renderer/unverified_ruleset_dealer.h
+++ b/components/subresource_filter/content/renderer/unverified_ruleset_dealer.h
@@ -7,12 +7,9 @@
 
 #include "base/macros.h"
 #include "components/subresource_filter/content/common/ruleset_dealer.h"
+#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h"
 #include "content/public/renderer/render_thread_observer.h"
-#include "ipc/ipc_platform_file.h"
-
-namespace IPC {
-class Message;
-}  // namespace IPC
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 
 namespace subresource_filter {
 
@@ -26,15 +23,28 @@ class MemoryMappedRuleset;
 // See RulesetDealerBase for details on the lifetime of MemoryMappedRuleset, and
 // the distribution pipeline diagram in content_ruleset_service.h.
 class UnverifiedRulesetDealer : public RulesetDealer,
-                                public content::RenderThreadObserver {
+                                public content::RenderThreadObserver,
+                                public mojom::SubresourceFilterRulesetObserver {
  public:
   UnverifiedRulesetDealer();
   ~UnverifiedRulesetDealer() override;
 
  private:
-  // content::RenderThreadObserver:
-  bool OnControlMessageReceived(const IPC::Message& message) override;
-  void OnSetRulesetForProcess(const IPC::PlatformFileForTransit& file);
+  // content::RenderThreadObserver overrides:
+  void RegisterMojoInterfaces(
+      blink::AssociatedInterfaceRegistry* associated_interfaces) override;
+  void UnregisterMojoInterfaces(
+      blink::AssociatedInterfaceRegistry* associated_interfaces) override;
+
+  // mojom::SubresourceFilterRulesetObserver overrides:
+  void SetRulesetForProcess(base::File ruleset_file) override;
+
+  void OnRendererAssociatedRequest(
+      mojo::PendingAssociatedReceiver<mojom::SubresourceFilterRulesetObserver>
+          receiver);
+
+  mojo::AssociatedReceiver<mojom::SubresourceFilterRulesetObserver> receiver_{
+      this};
 
   DISALLOW_COPY_AND_ASSIGN(UnverifiedRulesetDealer);
 };
diff --git a/components/subresource_filter/core/mojom/subresource_filter.mojom b/components/subresource_filter/core/mojom/subresource_filter.mojom
index 44406b59e7705..08e1403404da5 100644
--- a/components/subresource_filter/core/mojom/subresource_filter.mojom
+++ b/components/subresource_filter/core/mojom/subresource_filter.mojom
@@ -4,6 +4,7 @@
 
 module subresource_filter.mojom;
 
+import "mojo/public/mojom/base/file.mojom";
 import "mojo/public/mojom/base/time.mojom";
 
 enum ActivationLevel {
@@ -94,3 +95,11 @@ interface SubresourceFilterHost {
   // ads violations within the ads intervention manager.
   OnAdsViolationTriggered(AdsViolation violation);
 };
+
+// Subresource filter implemented by the renderer.
+interface SubresourceFilterRulesetObserver {
+  // Sends a read-only mode file handle with the ruleset data to a renderer
+  // process, containing the subresource filtering rules to be consulted for all
+  // subsequent document loads that have subresource filtering activated.
+  SetRulesetForProcess(mojo_base.mojom.File ruleset_file);
+};
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h
index 51d130ef01275..4549e2b47012f 100644
--- a/ipc/ipc_message_start.h
+++ b/ipc/ipc_message_start.h
@@ -32,7 +32,6 @@ enum IPCMessageStart {
   GuestViewMsgStart,
   MediaPlayerDelegateMsgStart,
   ExtensionWorkerMsgStart,
-  SubresourceFilterMsgStart,
   LastIPCMsgStart  // Must come last.
 };
 
diff --git a/tools/ipc_fuzzer/message_lib/all_messages.h b/tools/ipc_fuzzer/message_lib/all_messages.h
index acfaef7b35a6c..628d30766b276 100644
--- a/tools/ipc_fuzzer/message_lib/all_messages.h
+++ b/tools/ipc_fuzzer/message_lib/all_messages.h
@@ -22,7 +22,6 @@
 #include "components/nacl/common/nacl_host_messages.h"
 #endif
 #include "components/guest_view/common/guest_view_message_generator.h"
-#include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "content/common/all_messages.h"
 #include "extensions/common/extension_message_generator.h"
 #include "gpu/ipc/common/gpu_message_generator.h"