/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

/* eslint-env commonjs */

"use strict";
/**
 * Fennec-specific actors.
 */

const { RootActor } = require("devtools/server/actors/root");
const {
  ActorRegistry,
} = require("devtools/server/actors/utils/actor-registry");
const {
  BrowserTabList,
  BrowserAddonList,
  sendShutdownEvent,
} = require("devtools/server/actors/webbrowser");
const {
  ServiceWorkerRegistrationActorList,
} = require("devtools/server/actors/worker/service-worker-registration-list");
const {
  WorkerDescriptorActorList,
} = require("devtools/server/actors/worker/worker-descriptor-actor-list");

const { ProcessActorList } = require("devtools/server/actors/process");

/**
 * Construct a root actor appropriate for use in a server running in a
 * browser on Android. The returned root actor:
 * - respects the factories registered with ActorRegistry.addGlobalActor,
 * - uses a MobileTabList to supply tab actors,
 * - sends all navigator:browser window documents a Debugger:Shutdown event
 *   when it exits.
 *
 * * @param aConnection DevToolsServerConnection
 *        The conection to the client.
 */
exports.createRootActor = function createRootActor(aConnection) {
  const parameters = {
    tabList: new MobileTabList(aConnection),
    addonList: new BrowserAddonList(aConnection),
    workerList: new WorkerDescriptorActorList(aConnection, {}),
    serviceWorkerRegistrationList: new ServiceWorkerRegistrationActorList(
      aConnection
    ),
    processList: new ProcessActorList(),
    globalActorFactories: ActorRegistry.globalActorFactories,
    onShutdown: sendShutdownEvent,
  };
  return new RootActor(aConnection, parameters);
};

/**
 * A live list of BrowserTabActors representing the current browser tabs,
 * to be provided to the root actor to answer 'listTabs' requests.
 *
 * This object also takes care of listening for TabClose events and
 * onCloseWindow notifications, and exiting the BrowserTabActors concerned.
 *
 * (See the documentation for RootActor for the definition of the "live
 * list" interface.)
 *
 * @param aConnection DevToolsServerConnection
 *     The connection in which this list's tab actors may participate.
 *
 * @see BrowserTabList for more a extensive description of how tab list objects
 *      work.
 */
function MobileTabList(aConnection) {
  BrowserTabList.call(this, aConnection);
}

MobileTabList.prototype = Object.create(BrowserTabList.prototype);

MobileTabList.prototype.constructor = MobileTabList;

MobileTabList.prototype._getSelectedBrowser = function (aWindow) {
  return aWindow.browser;
};

MobileTabList.prototype._getChildren = function (aWindow) {
  return [aWindow.browser];
};
