// Copyright 2017 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.

(async function() {
  TestRunner.addResult(`Tests the way service worker manager manages targets.\n`);
  await TestRunner.loadModule('application_test_runner');
    // Note: every test that uses a storage API must manually clean-up state from previous tests.
  await ApplicationTestRunner.resetState();

  await TestRunner.showPanel('resources');

  var scriptURL = 'http://127.0.0.1:8000/devtools/service-workers/resources/service-worker-empty.js';
  var scope = 'http://127.0.0.1:8000/devtools/service-workers/resources/scope1/';
  ApplicationTestRunner.registerServiceWorker(scriptURL, scope);

  SDK.targetManager.observeTargets({
    targetAdded: function(target) {
      TestRunner.addResult('Target added: ' + target.name() + '; type: ' + target.type());
      if (target.type() === SDK.Target.Type.ServiceWorker) {
        var serviceWorkerManager = SDK.targetManager.mainTarget().model(SDK.ServiceWorkerManager);
        // Allow agents to do rountrips.
        TestRunner.deprecatedRunAfterPendingDispatches(function() {
          for (var registration of serviceWorkerManager.registrations().values())
            serviceWorkerManager.deleteRegistration(registration.id)
        });
      }
    },

    targetRemoved: function(target) {
      TestRunner.addResult('Target removed: ' + target.name() + '; type: ' + target.type());
      if (target.type() === SDK.Target.Type.ServiceWorker)
        setTimeout(TestRunner.completeTest);
    }
  });
})();
