Reland "Hook up running extension SW information to ProcessManager"
This is a reland of 7466707780d996e09adff361f84c0ae0add4602c
The only change is to wait for "activate" SW event in tests
instead of "install" event. This fixes the previous test
flakiness locally.
Original change's description:
> Hook up running extension SW information to ProcessManager
>
> When service worker context initializes, add the corresponding
> entry to ProcessManager and remove it when the context stops.
>
> Introduce IPC for worker initialization
> (DidInitializeServiceWorkerContext) and modify worker
> stop IPC (DidStopServiceWorkerContext) as necessary.
>
> Note that we cannot use loadstop
> (DidStartServiceWorkerContext) for PM entry addition because it
> can be too late as extension API calls might arrive in browser
> process before this.
>
> Also add SW information cleanup on render process termination as
> termination doesn't trigger stop worker messages (where the
> regular cleanup in PM happens).
>
> This CL will enable extension messaging in future CLs.
>
> Add tests for shutdown and termination behavior.
>
> Bug: 925918
> Change-Id: I9442bac9a1e9acf01063084a1e6ef2fac3279e09
> Reviewed-on: https://chromium-review.googlesource.com/c/1455267
> Reviewed-by: Dominick Ng <[email protected]>
> Reviewed-by: Devlin <[email protected]>
> Commit-Queue: Istiaque Ahmed <[email protected]>
> Cr-Commit-Position: refs/heads/master@{#636929}
[email protected],[email protected]
Bug: 925918
Change-Id: I148fe7ddce1b66b934eec20536172cbb94b27540
Reviewed-on: https://chromium-review.googlesource.com/c/1497862
Reviewed-by: Istiaque Ahmed <[email protected]>
Commit-Queue: Istiaque Ahmed <[email protected]>
Cr-Commit-Position: refs/heads/master@{#637118}
diff --git a/extensions/browser/process_manager.h b/extensions/browser/process_manager.h
index a1a3841..463d557 100644
--- a/extensions/browser/process_manager.h
+++ b/extensions/browser/process_manager.h
@@ -19,10 +19,12 @@
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
+#include "base/scoped_observer.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/devtools_agent_host_observer.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/render_process_host_observer.h"
#include "extensions/browser/activity.h"
#include "extensions/browser/event_page_tracker.h"
#include "extensions/browser/extension_registry_observer.h"
@@ -55,7 +57,8 @@
public content::NotificationObserver,
public ExtensionRegistryObserver,
public EventPageTracker,
- public content::DevToolsAgentHostObserver {
+ public content::DevToolsAgentHostObserver,
+ public content::RenderProcessHostObserver {
public:
using ExtensionHostSet = std::set<extensions::ExtensionHost*>;
@@ -72,7 +75,6 @@
// Registers or unregisters a running worker state to this process manager.
// Note: This does not create any Service Workers.
- // TODO(lazyboy): Hook this up to ServiceWorkerTaskQueue class.
void RegisterServiceWorker(const WorkerId& worker_id);
void UnregisterServiceWorker(const WorkerId& worker_id);
@@ -235,6 +237,8 @@
return startup_background_hosts_created_;
}
+ std::vector<WorkerId> GetAllWorkersIdsForTesting();
+
protected:
static ProcessManager* Create(content::BrowserContext* context);
@@ -264,6 +268,11 @@
const Extension* extension,
UnloadedExtensionReason reason) override;
+ // content::RenderProcessHostObserver:
+ void RenderProcessExited(
+ content::RenderProcessHost* host,
+ const content::ChildProcessTerminationInfo& info) override;
+
// Extra information we keep for each extension's background page.
struct BackgroundPageData;
struct ExtensionRenderFrameData;
@@ -376,6 +385,13 @@
// start notification. In that case we want to avoid decrementing keepalive.
std::map<int, ExtensionHost*> pending_network_requests_;
+ // Observers of Service Worker RPH this ProcessManager manages.
+ ScopedObserver<content::RenderProcessHost, content::RenderProcessHostObserver>
+ process_observer_;
+ // Maps render render_process_id -> extension_id for all Service Workers this
+ // ProcessManager manages.
+ std::map<int, std::set<ExtensionId>> worker_process_to_extension_ids_;
+
// Must be last member, see doc on WeakPtrFactory.
base::WeakPtrFactory<ProcessManager> weak_ptr_factory_;