blob: a78c43615a4c7ff3d68b60e3b0865c959f041fa6 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2020 The Chromium Authors
Lingqi Chifa0dda12020-11-18 05:32:452// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/mojo_binder_policy_applier.h"
6
Avi Drissmanadac21992023-01-11 23:46:397#include "base/functional/callback.h"
Lingqi Chifa0dda12020-11-18 05:32:458#include "base/memory/weak_ptr.h"
Lingqi Chie9e0fb32021-03-30 13:13:519#include "base/test/bind.h"
Lingqi Chifa0dda12020-11-18 05:32:4510#include "base/test/task_environment.h"
Lingqi Chi775e60752020-12-14 06:31:1611#include "content/browser/mojo_binder_policy_map_impl.h"
Takashi Toyoshimae1331512023-11-13 02:51:1512#include "content/public/test/mojo_capability_control_test_interfaces.mojom.h"
Lingqi Chifa0dda12020-11-18 05:32:4513#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
14#include "mojo/public/cpp/bindings/receiver.h"
15#include "mojo/public/cpp/bindings/remote.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18namespace content {
19
Lingqi Chifa0dda12020-11-18 05:32:4520// A test class that implements test interfaces and provides verification
21// methods.
22class TestReceiverCollector : public mojom::TestInterfaceForDefer,
23 public mojom::TestInterfaceForGrant,
Lingqi Chie9e0fb32021-03-30 13:13:5124 public mojom::TestInterfaceForCancel,
25 public mojom::TestInterfaceForUnexpected {
Lingqi Chifa0dda12020-11-18 05:32:4526 public:
27 TestReceiverCollector() = default;
28
29 ~TestReceiverCollector() override = default;
30
31 // Deletes copy and move operations.
32 TestReceiverCollector(const TestReceiverCollector& other) = delete;
33 TestReceiverCollector& operator=(const TestReceiverCollector& other) = delete;
34 TestReceiverCollector(TestReceiverCollector&&) = delete;
35 TestReceiverCollector& operator=(TestReceiverCollector&&) = delete;
36
37 void BindDeferInterface(
38 mojo::PendingReceiver<mojom::TestInterfaceForDefer> receiver) {
39 ASSERT_FALSE(defer_receiver_.is_bound());
40 defer_receiver_.Bind(std::move(receiver));
41 }
42
43 void BindGrantInterface(
44 mojo::PendingReceiver<mojom::TestInterfaceForGrant> receiver) {
45 ASSERT_FALSE(grant_receiver_.is_bound());
46 grant_receiver_.Bind(std::move(receiver));
47 }
48
49 void BindCancelInterface(
50 mojo::PendingReceiver<mojom::TestInterfaceForCancel> receiver) {
51 ASSERT_FALSE(cancel_receiver_.is_bound());
52 cancel_receiver_.Bind(std::move(receiver));
53 }
54
Lingqi Chie9e0fb32021-03-30 13:13:5155 void BindUnexpectedInterface(
56 mojo::PendingReceiver<mojom::TestInterfaceForUnexpected> receiver) {
57 ASSERT_FALSE(unexpected_receiver_.is_bound());
58 unexpected_receiver_.Bind(std::move(receiver));
59 }
60
Hiroki Nakagawab2ce0972021-03-17 08:20:3561 // mojom::TestInterfaceForDefer implementation.
Peter Boströmfc7ddc182024-10-31 19:37:2162 void Ping(PingCallback callback) override { NOTREACHED(); }
Hiroki Nakagawab2ce0972021-03-17 08:20:3563
Lingqi Chifa0dda12020-11-18 05:32:4564 // Will be called when MojoBinderPolicyApplier::ApplyPolicyToBinder()
65 // handles a kCancel binding request.
Lingqi Chifc4b7d9c2021-04-08 01:41:2266 void Cancel(const std::string& interface_name) {
67 is_cancelled_ = true;
68 cancelled_interface_ = interface_name;
69 }
Lingqi Chifa0dda12020-11-18 05:32:4570
71 // Used to check if the cancel_closure of MojoBinderPolicyApplier was
72 // executed.
Lingqi Chifc4b7d9c2021-04-08 01:41:2273 bool IsCancelled() { return is_cancelled_; }
74
75 const std::string& cancelled_interface() const {
76 return cancelled_interface_;
77 }
Lingqi Chifa0dda12020-11-18 05:32:4578
79 bool IsDeferReceiverBound() const { return defer_receiver_.is_bound(); }
80
81 bool IsGrantReceiverBound() const { return grant_receiver_.is_bound(); }
82
83 bool IsCancelReceiverBound() const { return cancel_receiver_.is_bound(); }
84
Lingqi Chie9e0fb32021-03-30 13:13:5185 bool IsUnexpectedReceiverBound() const {
86 return unexpected_receiver_.is_bound();
87 }
88
Lingqi Chifa0dda12020-11-18 05:32:4589 private:
90 mojo::Receiver<mojom::TestInterfaceForDefer> defer_receiver_{this};
91 mojo::Receiver<mojom::TestInterfaceForGrant> grant_receiver_{this};
92 mojo::Receiver<mojom::TestInterfaceForCancel> cancel_receiver_{this};
Lingqi Chie9e0fb32021-03-30 13:13:5193 mojo::Receiver<mojom::TestInterfaceForUnexpected> unexpected_receiver_{this};
Lingqi Chifc4b7d9c2021-04-08 01:41:2294 bool is_cancelled_ = false;
95 std::string cancelled_interface_;
Lingqi Chifa0dda12020-11-18 05:32:4596};
97
Lingqi Chi93462c62021-06-15 05:25:0898class MojoBinderPolicyApplierTest : public testing::Test,
99 mojom::MojoContextProvider {
Lingqi Chifa0dda12020-11-18 05:32:45100 public:
101 MojoBinderPolicyApplierTest() = default;
102
Lingqi Chi93462c62021-06-15 05:25:08103 // mojom::MojoContextProvider
104 void GrantAll() override { policy_applier_.GrantAll(); }
105
Lingqi Chifa0dda12020-11-18 05:32:45106 protected:
Lingqi Chi242d891e2021-03-10 09:45:49107 std::vector<base::OnceClosure>& deferred_binders() {
108 return policy_applier_.deferred_binders_;
109 }
110
Lingqi Chi93462c62021-06-15 05:25:08111 // Calls MojoBinderPolicyApplier::GrantAll() inside a Mojo message dispatch
112 // stack.
113 void RunGrantAll() {
114 DCHECK(!receiver_.is_bound());
115 receiver_.Bind(remote_.BindNewPipeAndPassReceiver());
116 remote_->GrantAll();
117 remote_.FlushForTesting();
118 }
119
Lingqi Chi775e60752020-12-14 06:31:16120 const MojoBinderPolicyMapImpl policy_map_{
Lingqi Chi2e03d9d62021-11-08 05:45:41121 {{"content.mojom.TestInterfaceForDefer",
122 MojoBinderNonAssociatedPolicy::kDefer},
123 {"content.mojom.TestInterfaceForGrant",
124 MojoBinderNonAssociatedPolicy::kGrant},
125 {"content.mojom.TestInterfaceForCancel",
126 MojoBinderNonAssociatedPolicy::kCancel},
Lingqi Chie9e0fb32021-03-30 13:13:51127 {"content.mojom.TestInterfaceForUnexpected",
Lingqi Chi2e03d9d62021-11-08 05:45:41128 MojoBinderNonAssociatedPolicy::kUnexpected}}};
Lingqi Chifa0dda12020-11-18 05:32:45129 TestReceiverCollector collector_{};
130 MojoBinderPolicyApplier policy_applier_{
131 &policy_map_, base::BindOnce(&TestReceiverCollector::Cancel,
132 base::Unretained(&collector_))};
133
134 private:
135 base::test::TaskEnvironment task_environment_;
Lingqi Chi93462c62021-06-15 05:25:08136 mojo::Remote<mojom::MojoContextProvider> remote_;
137 mojo::Receiver<mojom::MojoContextProvider> receiver_{this};
Lingqi Chifa0dda12020-11-18 05:32:45138};
139
Lingqi Chi0ca6ac52021-03-17 10:39:55140// Verifies that interfaces whose policies are kGrant can be bound immediately.
141TEST_F(MojoBinderPolicyApplierTest, GrantInEnforce) {
142 // Initialize Mojo interfaces.
143 mojo::Remote<mojom::TestInterfaceForGrant> grant_remote;
144 mojo::GenericPendingReceiver grant_receiver(
145 grant_remote.BindNewPipeAndPassReceiver());
146
147 // Bind the interface immediately if the policy is kGrant.
148 const std::string interface_name = grant_receiver.interface_name().value();
Lingqi Chifc4b7d9c2021-04-08 01:41:22149 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chi0ca6ac52021-03-17 10:39:55150 EXPECT_FALSE(collector_.IsGrantReceiverBound());
Lingqi Chi2e03d9d62021-11-08 05:45:41151 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chi0ca6ac52021-03-17 10:39:55152 interface_name,
153 base::BindOnce(&TestReceiverCollector::BindGrantInterface,
154 base::Unretained(&collector_),
155 grant_receiver.As<mojom::TestInterfaceForGrant>()));
156 EXPECT_TRUE(collector_.IsGrantReceiverBound());
Lingqi Chifc4b7d9c2021-04-08 01:41:22157 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chi0ca6ac52021-03-17 10:39:55158}
159
Lingqi Chifa0dda12020-11-18 05:32:45160// Verifies that interfaces whose policies are kDefer cannot be bound until
161// GrantAll() is called.
Lingqi Chi0ca6ac52021-03-17 10:39:55162TEST_F(MojoBinderPolicyApplierTest, DeferInEnforce) {
Lingqi Chifa0dda12020-11-18 05:32:45163 // Initialize Mojo interfaces.
164 mojo::Remote<mojom::TestInterfaceForDefer> defer_remote;
165 mojo::GenericPendingReceiver defer_receiver(
166 defer_remote.BindNewPipeAndPassReceiver());
167
168 // Delay binding the interface until GrantAll() is called.
169 const std::string interface_name = defer_receiver.interface_name().value();
Lingqi Chifc4b7d9c2021-04-08 01:41:22170 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chi2e03d9d62021-11-08 05:45:41171 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chifa0dda12020-11-18 05:32:45172 interface_name,
173 base::BindOnce(&TestReceiverCollector::BindDeferInterface,
174 base::Unretained(&collector_),
175 defer_receiver.As<mojom::TestInterfaceForDefer>()));
176 EXPECT_FALSE(collector_.IsDeferReceiverBound());
Lingqi Chi242d891e2021-03-10 09:45:49177 EXPECT_EQ(1U, deferred_binders().size());
178
Lingqi Chi93462c62021-06-15 05:25:08179 RunGrantAll();
Lingqi Chi242d891e2021-03-10 09:45:49180 EXPECT_EQ(0U, deferred_binders().size());
Lingqi Chifa0dda12020-11-18 05:32:45181 EXPECT_TRUE(collector_.IsDeferReceiverBound());
Lingqi Chifc4b7d9c2021-04-08 01:41:22182 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chifa0dda12020-11-18 05:32:45183}
184
Lingqi Chi0ca6ac52021-03-17 10:39:55185// Verifies that MojoBinderPolicyApplier will run `cancel_closure` when running
186// in the kEnforce mode and receiving an interface whose policy is kCancel,
187TEST_F(MojoBinderPolicyApplierTest, CancelInEnforce) {
Lingqi Chifa0dda12020-11-18 05:32:45188 // Initialize Mojo interfaces.
189 mojo::Remote<mojom::TestInterfaceForCancel> cancel_remote;
190 mojo::GenericPendingReceiver cancel_receiver(
191 cancel_remote.BindNewPipeAndPassReceiver());
192
193 const std::string interface_name = cancel_receiver.interface_name().value();
Lingqi Chifc4b7d9c2021-04-08 01:41:22194 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chifa0dda12020-11-18 05:32:45195 EXPECT_FALSE(collector_.IsCancelReceiverBound());
Lingqi Chi2e03d9d62021-11-08 05:45:41196 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chifa0dda12020-11-18 05:32:45197 interface_name,
198 base::BindOnce(&TestReceiverCollector::BindCancelInterface,
199 base::Unretained(&collector_),
200 cancel_receiver.As<mojom::TestInterfaceForCancel>()));
Lingqi Chifc4b7d9c2021-04-08 01:41:22201 EXPECT_TRUE(collector_.IsCancelled());
202 EXPECT_EQ(collector_.cancelled_interface(),
203 "content.mojom.TestInterfaceForCancel");
Lingqi Chifa0dda12020-11-18 05:32:45204 EXPECT_FALSE(collector_.IsCancelReceiverBound());
205}
206
Lingqi Chi0ca6ac52021-03-17 10:39:55207// When MojoBinderPolicyApplier runs in the kPrepareToGrantAll mode, verifies it
208// applies kGrant for kGrant interfaces.
209TEST_F(MojoBinderPolicyApplierTest, GrantInPrepareToGrantAll) {
210 // Initialize Mojo interfaces.
211 mojo::Remote<mojom::TestInterfaceForGrant> grant_remote;
212 mojo::GenericPendingReceiver grant_receiver(
213 grant_remote.BindNewPipeAndPassReceiver());
214
215 policy_applier_.PrepareToGrantAll();
216 const std::string grant_interface_name =
217 grant_receiver.interface_name().value();
Lingqi Chi2e03d9d62021-11-08 05:45:41218 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chi0ca6ac52021-03-17 10:39:55219 grant_interface_name,
220 base::BindOnce(&TestReceiverCollector::BindGrantInterface,
221 base::Unretained(&collector_),
222 grant_receiver.As<mojom::TestInterfaceForGrant>()));
223 EXPECT_TRUE(collector_.IsGrantReceiverBound());
224}
225
226// When MojoBinderPolicyApplier runs in the kPrepareToGrantAll mode, verifies it
227// applies kDefer for kDefer interfaces.
228TEST_F(MojoBinderPolicyApplierTest, DeferInPrepareToGrantAll) {
229 // Initialize Mojo interfaces.
230 mojo::Remote<mojom::TestInterfaceForDefer> defer_remote;
231 mojo::GenericPendingReceiver defer_receiver(
232 defer_remote.BindNewPipeAndPassReceiver());
233
234 policy_applier_.PrepareToGrantAll();
235 const std::string defer_interface_name =
236 defer_receiver.interface_name().value();
Lingqi Chi2e03d9d62021-11-08 05:45:41237 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chi0ca6ac52021-03-17 10:39:55238 defer_interface_name,
239 base::BindOnce(&TestReceiverCollector::BindDeferInterface,
240 base::Unretained(&collector_),
241 defer_receiver.As<mojom::TestInterfaceForDefer>()));
242 EXPECT_FALSE(collector_.IsDeferReceiverBound());
243 EXPECT_EQ(1U, deferred_binders().size());
244
Lingqi Chi93462c62021-06-15 05:25:08245 RunGrantAll();
Lingqi Chi0ca6ac52021-03-17 10:39:55246 EXPECT_TRUE(collector_.IsDeferReceiverBound());
247 EXPECT_EQ(0U, deferred_binders().size());
248}
249
250// When MojoBinderPolicyApplier runs in the kPrepareToGrantAll mode, verifies it
Lingqi Chic8b3e812021-04-23 11:45:18251// applies kGrant rather than kCancel policy when receiving a kCancel interface
Lingqi Chi0ca6ac52021-03-17 10:39:55252// binding request.
253TEST_F(MojoBinderPolicyApplierTest, CancelInPrepareToGrantAll) {
254 // Initialize Mojo interfaces.
255 mojo::Remote<mojom::TestInterfaceForCancel> cancel_remote;
256 mojo::GenericPendingReceiver cancel_receiver(
257 cancel_remote.BindNewPipeAndPassReceiver());
258
259 policy_applier_.PrepareToGrantAll();
260 const std::string cancel_interface_name =
261 cancel_receiver.interface_name().value();
Lingqi Chi2e03d9d62021-11-08 05:45:41262 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chi0ca6ac52021-03-17 10:39:55263 cancel_interface_name,
264 base::BindOnce(&TestReceiverCollector::BindCancelInterface,
265 base::Unretained(&collector_),
266 cancel_receiver.As<mojom::TestInterfaceForCancel>()));
Lingqi Chifc4b7d9c2021-04-08 01:41:22267 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chi0ca6ac52021-03-17 10:39:55268 EXPECT_TRUE(collector_.IsCancelReceiverBound());
Lingqi Chi0ca6ac52021-03-17 10:39:55269}
270
Lingqi Chie9e0fb32021-03-30 13:13:51271TEST_F(MojoBinderPolicyApplierTest, UnexpectedInPrepareToGrantAll) {
272 // Initialize Mojo interfaces.
273 mojo::Remote<mojom::TestInterfaceForUnexpected> unexpected_remote;
274 mojo::GenericPendingReceiver unexpected_receiver(
275 unexpected_remote.BindNewPipeAndPassReceiver());
276
277 policy_applier_.PrepareToGrantAll();
278 const std::string interface_name =
279 unexpected_receiver.interface_name().value();
Lingqi Chi2e03d9d62021-11-08 05:45:41280 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chie9e0fb32021-03-30 13:13:51281 interface_name,
282 base::BindOnce(
283 &TestReceiverCollector::BindUnexpectedInterface,
284 base::Unretained(&collector_),
285 unexpected_receiver.As<mojom::TestInterfaceForUnexpected>()));
Lingqi Chifc4b7d9c2021-04-08 01:41:22286 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chie9e0fb32021-03-30 13:13:51287 EXPECT_TRUE(collector_.IsUnexpectedReceiverBound());
Lingqi Chie9e0fb32021-03-30 13:13:51288}
289
Lingqi Chifa0dda12020-11-18 05:32:45290// Verifies that all interfaces are bound immediately if GrantAll() is called,
291// regardless of policies.
292TEST_F(MojoBinderPolicyApplierTest, BindInterfacesAfterResolving) {
293 // Initialize Mojo interfaces.
294 mojo::Remote<mojom::TestInterfaceForDefer> defer_remote;
295 mojo::GenericPendingReceiver defer_receiver(
296 defer_remote.BindNewPipeAndPassReceiver());
297 mojo::Remote<mojom::TestInterfaceForGrant> grant_remote;
298 mojo::GenericPendingReceiver grant_receiver(
299 grant_remote.BindNewPipeAndPassReceiver());
300 mojo::Remote<mojom::TestInterfaceForCancel> cancel_remote;
301 mojo::GenericPendingReceiver cancel_receiver(
302 cancel_remote.BindNewPipeAndPassReceiver());
Lingqi Chie9e0fb32021-03-30 13:13:51303 mojo::Remote<mojom::TestInterfaceForUnexpected> unexpected_remote;
304 mojo::GenericPendingReceiver unexpected_receiver(
305 unexpected_remote.BindNewPipeAndPassReceiver());
Lingqi Chifa0dda12020-11-18 05:32:45306
Lingqi Chi93462c62021-06-15 05:25:08307 RunGrantAll();
308
Lingqi Chifa0dda12020-11-18 05:32:45309 // All interfaces should be bound immediately.
310 const std::string defer_interface_name =
311 defer_receiver.interface_name().value();
312 const std::string grant_interface_name =
313 grant_receiver.interface_name().value();
314 const std::string cancel_interface_name =
315 cancel_receiver.interface_name().value();
Lingqi Chie9e0fb32021-03-30 13:13:51316 const std::string unexpected_interface_name =
317 unexpected_receiver.interface_name().value();
Lingqi Chifc4b7d9c2021-04-08 01:41:22318 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chifa0dda12020-11-18 05:32:45319 EXPECT_FALSE(collector_.IsGrantReceiverBound());
320 EXPECT_FALSE(collector_.IsDeferReceiverBound());
321 EXPECT_FALSE(collector_.IsCancelReceiverBound());
Lingqi Chie9e0fb32021-03-30 13:13:51322 EXPECT_FALSE(collector_.IsUnexpectedReceiverBound());
Lingqi Chi2e03d9d62021-11-08 05:45:41323 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chifa0dda12020-11-18 05:32:45324 defer_interface_name,
325 base::BindOnce(&TestReceiverCollector::BindDeferInterface,
326 base::Unretained(&collector_),
327 defer_receiver.As<mojom::TestInterfaceForDefer>()));
Lingqi Chi2e03d9d62021-11-08 05:45:41328 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chifa0dda12020-11-18 05:32:45329 grant_interface_name,
330 base::BindOnce(&TestReceiverCollector::BindGrantInterface,
331 base::Unretained(&collector_),
332 grant_receiver.As<mojom::TestInterfaceForGrant>()));
Lingqi Chi2e03d9d62021-11-08 05:45:41333 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chifa0dda12020-11-18 05:32:45334 cancel_interface_name,
335 base::BindOnce(&TestReceiverCollector::BindCancelInterface,
336 base::Unretained(&collector_),
337 cancel_receiver.As<mojom::TestInterfaceForCancel>()));
Lingqi Chi2e03d9d62021-11-08 05:45:41338 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chie9e0fb32021-03-30 13:13:51339 unexpected_interface_name,
340 base::BindOnce(
341 &TestReceiverCollector::BindUnexpectedInterface,
342 base::Unretained(&collector_),
343 unexpected_receiver.As<mojom::TestInterfaceForUnexpected>()));
Lingqi Chifa0dda12020-11-18 05:32:45344 EXPECT_TRUE(collector_.IsGrantReceiverBound());
345 EXPECT_TRUE(collector_.IsDeferReceiverBound());
346 EXPECT_TRUE(collector_.IsCancelReceiverBound());
Lingqi Chie9e0fb32021-03-30 13:13:51347 EXPECT_TRUE(collector_.IsUnexpectedReceiverBound());
Lingqi Chifc4b7d9c2021-04-08 01:41:22348 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chi242d891e2021-03-10 09:45:49349 EXPECT_EQ(0U, deferred_binders().size());
Lingqi Chifa0dda12020-11-18 05:32:45350}
351
Lingqi Chi242d891e2021-03-10 09:45:49352// Verifies that DropDeferredBinders() deletes all deferred binders.
353TEST_F(MojoBinderPolicyApplierTest, DropDeferredBinders) {
354 // Initialize Mojo interfaces.
355 mojo::Remote<mojom::TestInterfaceForDefer> defer_remote;
356 mojo::GenericPendingReceiver defer_receiver(
357 defer_remote.BindNewPipeAndPassReceiver());
358
359 const std::string interface_name = defer_receiver.interface_name().value();
Lingqi Chifc4b7d9c2021-04-08 01:41:22360 EXPECT_FALSE(collector_.IsCancelled());
Lingqi Chi2e03d9d62021-11-08 05:45:41361 policy_applier_.ApplyPolicyToNonAssociatedBinder(
Lingqi Chi242d891e2021-03-10 09:45:49362 interface_name,
363 base::BindOnce(&TestReceiverCollector::BindDeferInterface,
364 base::Unretained(&collector_),
365 defer_receiver.As<mojom::TestInterfaceForDefer>()));
366 EXPECT_FALSE(collector_.IsDeferReceiverBound());
367 EXPECT_EQ(1U, deferred_binders().size());
368 policy_applier_.DropDeferredBinders();
369 EXPECT_EQ(0U, deferred_binders().size());
Lingqi Chi93462c62021-06-15 05:25:08370 RunGrantAll();
Lingqi Chi242d891e2021-03-10 09:45:49371 EXPECT_FALSE(collector_.IsDeferReceiverBound());
372}
Lingqi Chifa0dda12020-11-18 05:32:45373
374} // namespace content