[Extensions] Display runtime errors in chrome://extensions.

This CL makes code changes to display runtime errors on
chrome://extensions for service worker based extensions.

Bug: 1152202
Change-Id: I4e8979ddd35c0d17e14fefba3557e8740bdac5b9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2567672
Reviewed-by: Arthur Sonzogni <[email protected]>
Reviewed-by: Istiaque Ahmed <[email protected]>
Reviewed-by: Hiroki Nakagawa <[email protected]>
Commit-Queue: Ghazale Hosseinabadi <[email protected]>
Cr-Commit-Position: refs/heads/master@{#892025}
diff --git a/extensions/browser/service_worker_task_queue.h b/extensions/browser/service_worker_task_queue.h
index ebe605656..0f2dd33a 100644
--- a/extensions/browser/service_worker_task_queue.h
+++ b/extensions/browser/service_worker_task_queue.h
@@ -14,6 +14,7 @@
 #include "base/strings/string_util.h"
 #include "base/version.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "content/public/browser/service_worker_context_observer.h"
 #include "extensions/browser/lazy_context_id.h"
 #include "extensions/browser/lazy_context_task_queue.h"
 #include "extensions/browser/service_worker/worker_id.h"
@@ -25,6 +26,7 @@
 
 namespace content {
 class BrowserContext;
+class ServiceWorkerContext;
 }
 
 namespace extensions {
@@ -73,7 +75,8 @@
 //
 // TODO(lazyboy): Clean up queue when extension is unloaded/uninstalled.
 class ServiceWorkerTaskQueue : public KeyedService,
-                               public LazyContextTaskQueue {
+                               public LazyContextTaskQueue,
+                               public content::ServiceWorkerContextObserver {
  public:
   explicit ServiceWorkerTaskQueue(content::BrowserContext* browser_context);
   ~ServiceWorkerTaskQueue() override;
@@ -123,6 +126,12 @@
   absl::optional<ActivationSequence> GetCurrentSequence(
       const ExtensionId& extension_id) const;
 
+  // content::ServiceWorkerContextObserver:
+  void OnReportConsoleMessage(int64_t version_id,
+                              const GURL& scope,
+                              const content::ConsoleMessage& message) override;
+  void OnDestruct(content::ServiceWorkerContext* context) override;
+
   class TestObserver {
    public:
     TestObserver();
@@ -197,6 +206,8 @@
 
   int next_activation_sequence_ = 0;
 
+  std::multiset<content::ServiceWorkerContext*> observing_worker_contexts_;
+
   // The state of worker of each activated extension.
   std::map<SequencedContextId, WorkerState> worker_state_map_;