Make runtime.onInstalled work for Service Worker based extensions.

runtime.onInstalled depends on Dispatch*WithLazyListener. For
Service Workers, this wouldn't dispatch the event as the event
listener doens't exist. For event pages, this works as we
manually add a listener before calling Dispatch. This CL does
the same for service worker based extensions.

Bug: 888798
Change-Id: I75dddc32613862464ba2bb73fd972ec1b0d2b03a
Reviewed-on: https://chromium-review.googlesource.com/1247190
Reviewed-by: Devlin <[email protected]>
Commit-Queue: Istiaque Ahmed <[email protected]>
Cr-Commit-Position: refs/heads/master@{#595679}
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 5d8265c9..83b163dc 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -297,6 +297,13 @@
   EXPECT_TRUE(newtab_listener.WaitUntilSatisfied());
 }
 
+// Tests chrome.runtime.onInstalled fires for extension service workers.
+IN_PROC_BROWSER_TEST_P(ServiceWorkerBasedBackgroundTest, OnInstalledEvent) {
+  ASSERT_TRUE(RunExtensionTest(
+      "service_worker/worker_based_background/events_on_installed"))
+      << message_;
+}
+
 // Class that dispatches an event to |extension_id| right after a
 // non-lazy listener to the event is added from the extension's Service Worker.
 class EarlyWorkerMessageSender : public EventRouter::Observer {