// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This function is returned to DidInitializeServiceWorkerContextOnWorkerThread // then executed, passing in dependencies as function arguments. // // |backgroundUrl| is the URL of the extension's background page. // |wakeEventPage| is a function that wakes up the current extension's event // page, then runs its callback on completion or failure. // |logging| is an object equivalent to a subset of base/debug/logging.h, with // CHECK/DCHECK/etc. (function(backgroundUrl, wakeEventPage, logging) { 'use strict'; self.chrome = self.chrome || {}; self.chrome.runtime = self.chrome.runtime || {}; // Returns a Promise that resolves to the background page's client, or null // if there is no background client. function findBackgroundClient() { return self.clients.matchAll({ includeUncontrolled: true, type: 'window' }).then(function(clients) { return clients.find(function(client) { return client.url == backgroundUrl; }); }); } // Returns a Promise wrapper around wakeEventPage, that resolves on success, // or rejects on failure. function makeWakeEventPagePromise() { return new Promise(function(resolve, reject) { wakeEventPage(function(success) { if (success) resolve(); else reject('Failed to start background client "' + backgroundUrl + '"'); }); }); } // The chrome.runtime.getBackgroundClient function is documented in // runtime.json. It returns a Promise that resolves to the background page's // client, or is rejected if there is no background client or if the // background client failed to wake. self.chrome.runtime.getBackgroundClient = function() { return findBackgroundClient().then(function(client) { if (client) { // Background client is already awake, or it was persistent. return client; } // Event page needs to be woken. return makeWakeEventPagePromise().then(function() { return findBackgroundClient(); }).then(function(client) { if (!client) { return Promise.reject( 'Background client "' + backgroundUrl + '" not found'); } return client; }); }); }; });