Browse Source

chore: cherry-pick 0d2bf89e15cc from chromium (#27534)

* chore: cherry-pick 0d2bf89e15cc from chromium

* update patches

Co-authored-by: Electron Bot <[email protected]>
Pedro Pontes 4 years ago
parent
commit
4265d2fdad
2 changed files with 149 additions and 0 deletions
  1. 1 0
      patches/chromium/.patches
  2. 148 0
      patches/chromium/cherry-pick-0d2bf89e15cc.patch

+ 1 - 0
patches/chromium/.patches

@@ -176,3 +176,4 @@ mediacapabilities_use_threadsafe_static_wtf_string.patch
 ots_backport_maxp_sanitization.patch
 ots_backport_of_glyf_guard_access_to_maxp_version_1_field.patch
 cherry-pick-d74ba931c4b7.patch
+cherry-pick-0d2bf89e15cc.patch

+ 148 - 0
patches/chromium/cherry-pick-0d2bf89e15cc.patch

@@ -0,0 +1,148 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Sam McNally <[email protected]>
+Date: Thu, 17 Dec 2020 02:58:09 +0000
+Subject: Observe ProcessManager shutdowns from KeepAliveImpl.
+
+ExtensionRegistry uses the underlying BrowserContext for incognito
+contexts. Thus, for incognito uses, the ProcessManager can be destroyed
+without the KeepAliveImpl being notified. Observe ProcessManager
+shutdowns directly to ensure KeepAliveImpls are cleaned up when a
+ProcessManager is shut down.
+
+[Substituted ScopedObserver for base::ScopedObservation since the latter
+ was introduced in 88]
+
+(cherry picked from commit 5a55fe16e633dd02e3c40e513acabf4324bb6318)
+
+(cherry picked from commit c2bf2463fbeff3959ea1998a4f3ae82dd648b56c)
+
+Bug: 1149177
+Change-Id: I39a0cf54bcf8cf0d58e36560935b8d2f79399cd2
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2548585
+Auto-Submit: Sam McNally <[email protected]>
+Commit-Queue: Ben Wells <[email protected]>
+Reviewed-by: Ben Wells <[email protected]>
+Cr-Original-Original-Commit-Position: refs/heads/master@{#830107}
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2563379
+Reviewed-by: Sam McNally <[email protected]>
+Commit-Queue: Sam McNally <[email protected]>
+Cr-Original-Commit-Position: refs/branch-heads/4280@{#1653}
+Cr-Original-Branched-From: ea420fb963f9658c9969b6513c56b8f47efa1a2a-refs/heads/master@{#812852}
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2587154
+Commit-Queue: Achuith Bhandarkar <[email protected]>
+Reviewed-by: Achuith Bhandarkar <[email protected]>
+Cr-Commit-Position: refs/branch-heads/4240@{#1496}
+Cr-Branched-From: f297677702651916bbf65e59c0d4bbd4ce57d1ee-refs/heads/master@{#800218}
+
+diff --git a/extensions/browser/mojo/keep_alive_impl.cc b/extensions/browser/mojo/keep_alive_impl.cc
+index a9bd8fd3b717f18ff86e8cb6ea00c3df03d8f4c1..af41df6b808a8cd8b3aba079b22cf74dcc57851c 100644
+--- a/extensions/browser/mojo/keep_alive_impl.cc
++++ b/extensions/browser/mojo/keep_alive_impl.cc
+@@ -8,7 +8,6 @@
+ 
+ #include "base/bind.h"
+ #include "content/public/browser/browser_context.h"
+-#include "extensions/browser/process_manager.h"
+ 
+ namespace extensions {
+ 
+@@ -32,6 +31,7 @@ KeepAliveImpl::KeepAliveImpl(content::BrowserContext* context,
+   receiver_.set_disconnect_handler(
+       base::Bind(&KeepAliveImpl::OnDisconnected, base::Unretained(this)));
+   extension_registry_observer_.Add(ExtensionRegistry::Get(context_));
++  process_manager_observation_.Add(ProcessManager::Get(context_));
+ }
+ 
+ KeepAliveImpl::~KeepAliveImpl() = default;
+@@ -54,4 +54,8 @@ void KeepAliveImpl::OnDisconnected() {
+   delete this;
+ }
+ 
++void KeepAliveImpl::OnProcessManagerShutdown(ProcessManager* manager) {
++  delete this;
++}
++
+ }  // namespace extensions
+diff --git a/extensions/browser/mojo/keep_alive_impl.h b/extensions/browser/mojo/keep_alive_impl.h
+index a3e4233a3e6691999decb281dbaf80f74bf922cc..331fc2fdf670e44d51adc610ee39144dac15ae87 100644
+--- a/extensions/browser/mojo/keep_alive_impl.h
++++ b/extensions/browser/mojo/keep_alive_impl.h
+@@ -10,6 +10,8 @@
+ #include "base/scoped_observer.h"
+ #include "extensions/browser/extension_registry.h"
+ #include "extensions/browser/extension_registry_observer.h"
++#include "extensions/browser/process_manager.h"
++#include "extensions/browser/process_manager_observer.h"
+ #include "extensions/common/mojom/keep_alive.mojom.h"
+ #include "mojo/public/cpp/bindings/pending_receiver.h"
+ #include "mojo/public/cpp/bindings/receiver.h"
+@@ -21,10 +23,13 @@ class RenderFrameHost;
+ 
+ namespace extensions {
+ class Extension;
++class ProcessManager;
+ 
+ // An RAII mojo service implementation for extension keep alives. This adds a
+ // keep alive on construction and removes it on destruction.
+-class KeepAliveImpl : public KeepAlive, public ExtensionRegistryObserver {
++class KeepAliveImpl : public KeepAlive,
++                      public ExtensionRegistryObserver,
++                      public ProcessManagerObserver {
+  public:
+   // Create a keep alive for |extension| running in |context| and connect it to
+   // |receiver|. When the receiver closes its pipe, the keep alive ends.
+@@ -45,6 +50,9 @@ class KeepAliveImpl : public KeepAlive, public ExtensionRegistryObserver {
+                            UnloadedExtensionReason reason) override;
+   void OnShutdown(ExtensionRegistry* registry) override;
+ 
++  // ProcessManagerObserver overrides.
++  void OnProcessManagerShutdown(ProcessManager* manager) override;
++
+   // Invoked when the mojo connection is disconnected.
+   void OnDisconnected();
+ 
+@@ -52,6 +60,8 @@ class KeepAliveImpl : public KeepAlive, public ExtensionRegistryObserver {
+   const Extension* extension_;
+   ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
+       extension_registry_observer_{this};
++  ScopedObserver<ProcessManager, ProcessManagerObserver>
++      process_manager_observation_{this};
+   mojo::Receiver<KeepAlive> receiver_;
+ 
+   DISALLOW_COPY_AND_ASSIGN(KeepAliveImpl);
+diff --git a/extensions/browser/mojo/keep_alive_impl_unittest.cc b/extensions/browser/mojo/keep_alive_impl_unittest.cc
+index 90599cc46d24dc7ec0eabb1da17545b489d93445..e6f60c39cf29d9554cb0f1096ed87345d3e38923 100644
+--- a/extensions/browser/mojo/keep_alive_impl_unittest.cc
++++ b/extensions/browser/mojo/keep_alive_impl_unittest.cc
+@@ -160,7 +160,7 @@ TEST_F(KeepAliveTest, UnloadExtension) {
+   run_loop.Run();
+ }
+ 
+-TEST_F(KeepAliveTest, Shutdown) {
++TEST_F(KeepAliveTest, ShutdownExtensionRegistry) {
+   mojo::Remote<KeepAlive> keep_alive;
+   CreateKeepAlive(keep_alive.BindNewPipeAndPassReceiver());
+   EXPECT_EQ(1, GetKeepAliveCount());
+@@ -178,4 +178,22 @@ TEST_F(KeepAliveTest, Shutdown) {
+   run_loop.Run();
+ }
+ 
++TEST_F(KeepAliveTest, ShutdownProcessManager) {
++  mojo::Remote<KeepAlive> keep_alive;
++  CreateKeepAlive(keep_alive.BindNewPipeAndPassReceiver());
++  EXPECT_EQ(1, GetKeepAliveCount());
++  EXPECT_EQ(1u, GetActivities().count(mojo_activity_));
++
++  ProcessManager::Get(browser_context())->Shutdown();
++  // After a shutdown event, the KeepAliveImpl should not access its
++  // ProcessManager and so the keep-alive count should remain unchanged.
++  EXPECT_EQ(1, GetKeepAliveCount());
++  EXPECT_EQ(1u, GetActivities().count(mojo_activity_));
++
++  // Wait for |keep_alive| to disconnect.
++  base::RunLoop run_loop;
++  keep_alive.set_disconnect_handler(run_loop.QuitClosure());
++  run_loop.Run();
++}
++
+ }  // namespace extensions