blob: fb79cba4a45b30b00794b462f65e39992d04b290 [file] [log] [blame]
// Copyright (c) 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.
/**
* @constructor
* @extends {WebInspector.VBox}
* @implements {WebInspector.TargetManager.Observer}
*/
WebInspector.ServiceWorkersView = function()
{
WebInspector.VBox.call(this, true);
this.registerRequiredCSS("resources/serviceWorkersView.css");
this.contentElement.classList.add("service-workers-view");
/** @type {!Set.<string>} */
this._securityOriginHosts = new Set();
/** @type {!Map.<string, !WebInspector.ServiceWorkerOriginElement>} */
this._originHostToOriginElementMap = new Map();
/** @type {!Map.<string, !WebInspector.ServiceWorkerOriginElement>} */
this._registrationIdToOriginElementMap = new Map();
var settingsDiv = createElementWithClass("div", "service-workers-settings");
var debugOnStartCheckboxLabel = createCheckboxLabel(WebInspector.UIString("Open DevTools window and pause JavaScript execution on Service Worker startup for debugging."));
this._debugOnStartCheckbox = debugOnStartCheckboxLabel.checkboxElement;
this._debugOnStartCheckbox.addEventListener("change", this._debugOnStartCheckboxChanged.bind(this), false)
this._debugOnStartCheckbox.disabled = true
settingsDiv.appendChild(debugOnStartCheckboxLabel);
this.contentElement.appendChild(settingsDiv);
this._root = this.contentElement.createChild("ol");
this._root.classList.add("service-workers-root");
WebInspector.targetManager.observeTargets(this);
}
WebInspector.ServiceWorkersView.prototype = {
/**
* @override
* @param {!WebInspector.Target} target
*/
targetAdded: function(target)
{
if (this._target)
return;
this._target = target;
this._manager = this._target.serviceWorkerManager;
this._debugOnStartCheckbox.disabled = false;
this._debugOnStartCheckbox.checked = this._manager.debugOnStart();
for (var registration of this._manager.registrations().values())
this._updateRegistration(registration);
this._manager.addEventListener(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated, this._registrationUpdated, this);
this._manager.addEventListener(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted, this._registrationDeleted, this);
this._manager.addEventListener(WebInspector.ServiceWorkerManager.Events.DebugOnStartUpdated, this._debugOnStartUpdated, this);
this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
var securityOrigins = this._target.resourceTreeModel.securityOrigins();
for (var i = 0; i < securityOrigins.length; ++i)
this._addOrigin(securityOrigins[i]);
},
/**
* @override
* @param {!WebInspector.Target} target
*/
targetRemoved: function(target)
{
if (target !== this._target)
return;
delete this._target;
},
/**
* @param {!WebInspector.Event} event
*/
_registrationUpdated: function(event)
{
var registration = /** @type {!WebInspector.ServiceWorkerRegistration} */ (event.data);
this._updateRegistration(registration);
},
/**
* @param {!WebInspector.ServiceWorkerRegistration} registration
*/
_updateRegistration: function(registration)
{
var parsedURL = registration.scopeURL.asParsedURL();
if (!parsedURL)
return;
var originHost = parsedURL.host;
var originElement = this._originHostToOriginElementMap.get(originHost);
if (!originElement) {
originElement = new WebInspector.ServiceWorkerOriginElement(this._manager, originHost);
if (this._securityOriginHosts.has(originHost))
this._appendOriginNode(originElement);
this._originHostToOriginElementMap.set(originHost, originElement);
}
this._registrationIdToOriginElementMap.set(registration.id, originElement);
originElement._updateRegistration(registration);
},
/**
* @param {!WebInspector.Event} event
*/
_registrationDeleted: function(event)
{
var registration = /** @type {!WebInspector.ServiceWorkerRegistration} */ (event.data);
var registrationId = registration.id;
var originElement = this._registrationIdToOriginElementMap.get(registrationId);
if (!originElement)
return;
this._registrationIdToOriginElementMap.delete(registrationId);
originElement._deleteRegistration(registrationId);
if (originElement._hasRegistration())
return;
if (this._securityOriginHosts.has(originElement._originHost))
this._removeOriginNode(originElement);
this._originHostToOriginElementMap.delete(originElement._originHost);
},
/**
* @param {!WebInspector.Event} event
*/
_debugOnStartUpdated: function(event)
{
var debugOnStart = /** @type {boolean} */ (event.data);
this._debugOnStartCheckbox.checked = debugOnStart;
},
/**
* @param {!WebInspector.Event} event
*/
_securityOriginAdded: function(event)
{
this._addOrigin(/** @type {string} */ (event.data));
},
/**
* @param {string} securityOrigin
*/
_addOrigin: function(securityOrigin)
{
var parsedURL = securityOrigin.asParsedURL();
if (!parsedURL)
return;
var originHost = parsedURL.host;
if (this._securityOriginHosts.has(originHost))
return;
this._securityOriginHosts.add(originHost);
var originElement = this._originHostToOriginElementMap.get(originHost);
if (!originElement)
return;
this._appendOriginNode(originElement);
},
/**
* @param {!WebInspector.Event} event
*/
_securityOriginRemoved: function(event)
{
var securityOrigin = /** @type {string} */ (event.data);
var parsedURL = securityOrigin.asParsedURL();
if (!parsedURL)
return;
var originHost = parsedURL.host;
if (!this._securityOriginHosts.has(originHost))
return;
this._securityOriginHosts.delete(originHost);
var originElement = this._originHostToOriginElementMap.get(originHost);
if (!originElement)
return;
this._removeOriginNode(originElement);
},
/**
* @param {!WebInspector.ServiceWorkerOriginElement} originElement
*/
_appendOriginNode: function(originElement)
{
this._root.appendChild(originElement._element);
},
/**
* @param {!WebInspector.ServiceWorkerOriginElement} originElement
*/
_removeOriginNode: function(originElement)
{
this._root.removeChild(originElement._element);
},
_debugOnStartCheckboxChanged: function()
{
if (!this._manager)
return;
this._manager.setDebugOnStart(this._debugOnStartCheckbox.checked);
this._debugOnStartCheckbox.checked = this._manager.debugOnStart();
},
__proto__: WebInspector.VBox.prototype
}
/**
* @constructor
* @param {!WebInspector.ServiceWorkerManager} manager
* @param {string} originHost
*/
WebInspector.ServiceWorkerOriginElement = function(manager, originHost)
{
this._manager = manager;
/** @type {!Map.<string, !WebInspector.SWRegistrationElement>} */
this._registrationElements = new Map();
this._originHost = originHost;
this._element = createElementWithClass("div", "service-workers-origin");
this._listItemNode = this._element.createChild("li", "service-workers-origin-title");
this._listItemNode.createChild("div").createTextChild(originHost);
this._childrenListNode = this._element.createChild("ol");
}
WebInspector.ServiceWorkerOriginElement.prototype = {
/**
* @return {boolean}
*/
_hasRegistration: function()
{
return this._registrationElements.size != 0;
},
/**
* @param {!WebInspector.ServiceWorkerRegistration} registration
*/
_updateRegistration: function(registration)
{
var swRegistrationElement = this._registrationElements.get(registration.id);
if (swRegistrationElement) {
swRegistrationElement._updateRegistration(registration);
return;
}
swRegistrationElement = new WebInspector.SWRegistrationElement(this._manager, this, registration);
this._registrationElements.set(registration.id, swRegistrationElement);
this._childrenListNode.appendChild(swRegistrationElement._element);
},
/**
* @param {string} registrationId
*/
_deleteRegistration: function(registrationId)
{
var swRegistrationElement = this._registrationElements.get(registrationId);
if (!swRegistrationElement)
return;
this._registrationElements.delete(registrationId);
this._childrenListNode.removeChild(swRegistrationElement._element);
},
/**
* @return {boolean}
*/
_visible: function()
{
return !!this._element.parentElement;
},
}
/**
* @constructor
* @param {!WebInspector.ServiceWorkerManager} manager
* @param {!WebInspector.ServiceWorkerOriginElement} originElement
* @param {!WebInspector.ServiceWorkerRegistration} registration
*/
WebInspector.SWRegistrationElement = function(manager, originElement, registration)
{
this._manager = manager;
this._originElement = originElement;
this._registration = registration;
this._element = createElementWithClass("div", "service-workers-registration");
var headerNode = this._element.createChild("div", "service-workers-registration-header");
this._titleNode = headerNode.createChild("div", "service-workers-registration-title");
var buttonsNode = headerNode.createChild("div", "service-workers-registration-buttons");
this._updateButton = buttonsNode.createChild("button", "service-workers-button service-workers-update-button");
this._updateButton.addEventListener("click", this._updateButtonClicked.bind(this), false);
this._updateButton.title = WebInspector.UIString("Update");
this._updateButton.disabled = true
this._pushButton = buttonsNode.createChild("button", "service-workers-button service-workers-push-button");
this._pushButton.addEventListener("click", this._pushButtonClicked.bind(this), false);
this._pushButton.title = WebInspector.UIString("Emulate push event");
this._pushButton.disabled = true
this._deleteButton = buttonsNode.createChild("button", "service-workers-button service-workers-delete-button");
this._deleteButton.addEventListener("click", this._deleteButtonClicked.bind(this), false);
this._deleteButton.title = WebInspector.UIString("Delete");
this._childrenListNode = this._element.createChild("div", "service-workers-registration-content");
this._skipWaitingCheckboxLabel = createCheckboxLabel(WebInspector.UIString("Skip waiting"));
this._skipWaitingCheckboxLabel.title = WebInspector.UIString("Simulate skipWaiting()");
this._skipWaitingCheckboxLabel.classList.add("service-workers-skip-waiting-checkbox-label");
this._skipWaitingCheckbox = this._skipWaitingCheckboxLabel.checkboxElement;
this._skipWaitingCheckbox.classList.add("service-workers-skip-waiting-checkbox");
this._skipWaitingCheckbox.addEventListener("change", this._skipWaitingCheckboxChanged.bind(this), false);
/**
* @type {!Object.<string, !Array.<!WebInspector.ServiceWorkerVersion>>}
*/
this._categorizedVersions = {};
for (var mode in WebInspector.ServiceWorkerVersion.Modes)
this._categorizedVersions[WebInspector.ServiceWorkerVersion.Modes[mode]] = [];
this._selectedMode = WebInspector.ServiceWorkerVersion.Modes.Active;
/**
* @type {!Array.<!WebInspector.SWVersionElement>}
*/
this._versionElements = [];
this._updateRegistration(registration);
}
WebInspector.SWRegistrationElement.prototype = {
/**
* @param {!WebInspector.ServiceWorkerRegistration} registration
*/
_updateRegistration: function(registration)
{
this._registration = registration;
this._titleNode.textContent = WebInspector.UIString(registration.isDeleted ? "Scope: %s - deleted" : "Scope: %s", registration.scopeURL.asParsedURL().path);
this._updateButton.disabled = !!registration.isDeleted;
this._deleteButton.disabled = !!registration.isDeleted;
this._skipWaitingCheckboxLabel.remove();
var lastFocusedVersionId = undefined;
if (this._categorizedVersions[this._selectedMode].length)
lastFocusedVersionId = this._categorizedVersions[this._selectedMode][0].id;
for (var mode in WebInspector.ServiceWorkerVersion.Modes)
this._categorizedVersions[WebInspector.ServiceWorkerVersion.Modes[mode]] = [];
for (var version of registration.versions.valuesArray()) {
if (version.isStoppedAndRedundant() && !version.errorMessages.length)
continue;
var mode = version.mode();
this._categorizedVersions[mode].push(version);
if (version.id === lastFocusedVersionId)
this._selectedMode = mode;
}
if (!this._categorizedVersions[this._selectedMode].length && this._selectedMode != WebInspector.ServiceWorkerVersion.Modes.Waiting) {
for (var mode of [WebInspector.ServiceWorkerVersion.Modes.Active,
WebInspector.ServiceWorkerVersion.Modes.Waiting,
WebInspector.ServiceWorkerVersion.Modes.Installing,
WebInspector.ServiceWorkerVersion.Modes.Redundant]) {
if (this._categorizedVersions[mode].length) {
this._selectedMode = mode;
break;
}
}
}
this._pushButton.disabled = !this._categorizedVersions[WebInspector.ServiceWorkerVersion.Modes.Active].length || !!this._registration.isDeleted;
this._updateVersionList();
if (this._visible() && this._skipWaitingCheckbox.checked) {
this._registration.versions.valuesArray().map(callSkipWaitingForInstalledVersions.bind(this));
}
/**
* @this {WebInspector.SWRegistrationElement}
* @param {!WebInspector.ServiceWorkerVersion} version
*/
function callSkipWaitingForInstalledVersions(version)
{
if (version.isInstalled())
this._manager.skipWaiting(version.id);
}
},
_updateVersionList: function()
{
var fragment = createDocumentFragment();
var modeTabList = createElementWithClass("div", "service-workers-versions-mode-tab-list");
modeTabList.appendChild(this._createVersionModeTab(WebInspector.ServiceWorkerVersion.Modes.Installing));
modeTabList.appendChild(this._createVersionModeTab(WebInspector.ServiceWorkerVersion.Modes.Waiting));
modeTabList.appendChild(this._createVersionModeTab(WebInspector.ServiceWorkerVersion.Modes.Active));
modeTabList.appendChild(this._createVersionModeTab(WebInspector.ServiceWorkerVersion.Modes.Redundant));
fragment.appendChild(modeTabList);
fragment.appendChild(this._createSelectedModeVersionsPanel(this._selectedMode));
this._childrenListNode.removeChildren();
this._childrenListNode.appendChild(fragment);
},
/**
* @param {string} mode
* @return {!Element}
*/
_createVersionModeTab: function(mode)
{
var versions = this._categorizedVersions[mode];
var modeTitle = WebInspector.UIString(mode);
var selected = this._selectedMode == mode;
var modeTab = createElementWithClass("div", "service-workers-versions-mode-tab");
for (var version of versions) {
var icon = modeTab.createChild("div", "service-workers-versions-mode-tab-icon service-workers-color-" + (version.id % 10));
icon.title = WebInspector.UIString("ID: %s", version.id);
}
var modeTabText = modeTab.createChild("div", "service-workers-versions-mode-tab-text");
modeTabText.createTextChild(WebInspector.UIString(modeTitle));
if (selected) {
modeTab.classList.add("service-workers-versions-mode-tab-selected");
modeTabText.classList.add("service-workers-versions-mode-tab-text-selected");
}
if (versions.length || mode == WebInspector.ServiceWorkerVersion.Modes.Waiting) {
modeTab.addEventListener("click", this._modeTabClicked.bind(this, mode), false);
} else {
modeTab.classList.add("service-workers-versions-mode-tab-disabled");
modeTabText.classList.add("service-workers-versions-mode-tab-text-disabled");
}
return modeTab;
},
/**
* @param {string} mode
* @return {!Element}
*/
_createSelectedModeVersionsPanel: function(mode)
{
var versions = this._categorizedVersions[mode];
var panelContainer = createElementWithClass("div", "service-workers-versions-panel-container");
if (mode == WebInspector.ServiceWorkerVersion.Modes.Waiting) {
var panel = createElementWithClass("div", "service-workers-versions-option-panel");
panel.appendChild(this._skipWaitingCheckboxLabel);
panelContainer.appendChild(panel);
}
var index = 0;
var versionElement;
for (var i = 0; i < versions.length; ++i) {
if (i < this._versionElements.length) {
versionElement = this._versionElements[i];
versionElement._updateVersion(versions[i]);
} else {
versionElement = new WebInspector.SWVersionElement(this._manager, this._registration.scopeURL, versions[i]);
this._versionElements.push(versionElement);
}
panelContainer.appendChild(versionElement._element);
}
this._versionElements.splice(versions.length);
return panelContainer;
},
/**
* @param {string} mode
*/
_modeTabClicked: function(mode)
{
if (this._selectedMode == mode)
return;
this._selectedMode = mode;
this._updateVersionList();
},
/**
* @param {!Event} event
*/
_deleteButtonClicked: function(event)
{
this._manager.deleteRegistration(this._registration.id);
},
/**
* @param {!Event} event
*/
_updateButtonClicked: function(event)
{
this._manager.updateRegistration(this._registration.id);
},
/**
* @param {!Event} event
*/
_pushButtonClicked: function(event)
{
var data = "Test push message from DevTools."
this._manager.deliverPushMessage(this._registration.id, data);
},
_skipWaitingCheckboxChanged: function()
{
if (!this._skipWaitingCheckbox.checked)
return;
this._registration.versions.valuesArray().map(callSkipWaitingForInstalledVersions.bind(this));
/**
* @this {WebInspector.SWRegistrationElement}
* @param {!WebInspector.ServiceWorkerVersion} version
*/
function callSkipWaitingForInstalledVersions(version)
{
if (version.isInstalled())
this._manager.skipWaiting(version.id);
}
},
/**
* @return {boolean}
*/
_visible: function()
{
return this._originElement._visible();
},
}
/**
* @constructor
* @param {!WebInspector.ServiceWorkerManager} manager
* @param {string} scopeURL
* @param {!WebInspector.ServiceWorkerVersion} version
*/
WebInspector.SWVersionElement = function(manager, scopeURL, version)
{
this._manager = manager;
this._scopeURL = scopeURL;
this._version = version;
this._element = createElementWithClass("div", "service-workers-version");
/**
* @type {!Object.<string, !WebInspector.TargetInfo>}
*/
this._clientInfoCache = {};
this._createElements();
this._updateVersion(version);
}
WebInspector.SWVersionElement.prototype = {
_createElements: function()
{
var panel = createElementWithClass("div", "service-workers-versions-panel");
var leftPanel = panel.createChild("div", "service-workers-versions-panel-left");
var rightPanel = panel.createChild("div", "service-workers-versions-panel-right");
this._stateCell = this._addTableRow(leftPanel, WebInspector.UIString("State"));
this._workerCell = this._addTableRow(leftPanel, WebInspector.UIString("Worker"));
this._scriptCell = this._addTableRow(leftPanel, WebInspector.UIString("Script URL"));
this._updatedCell = this._addTableRow(leftPanel, WebInspector.UIString("Updated"));
this._updatedCell.classList.add("service-worker-script-response-time");
this._scriptLastModifiedCell = this._addTableRow(leftPanel, WebInspector.UIString("Last-Modified"));
this._scriptLastModifiedCell.classList.add("service-worker-script-last-modified");
rightPanel.createChild("div", "service-workers-versions-table-messages-title").createTextChild(WebInspector.UIString("Recent messages"));
this._messagesPanel = rightPanel.createChild("div", "service-workers-versions-table-messages-content");
this._clientsTitle = rightPanel.createChild("div", "service-workers-versions-table-clients-title");
this._clientsTitle.createTextChild(WebInspector.UIString("Controlled clients"));
this._clientsPanel = rightPanel.createChild("div", "service-workers-versions-table-clients-content");
this._element.appendChild(panel);
},
/**
* @param {!WebInspector.ServiceWorkerVersion} version
*/
_updateVersion: function(version)
{
this._stateCell.removeChildren();
this._stateCell.createTextChild(version.status);
this._workerCell.removeChildren();
if (version.isRunning() || version.isStarting() || version.isStartable()) {
var runningStatusCell = this._workerCell.createChild("div", "service-workers-versions-table-worker-running-status-cell");
var runningStatusLeftCell = runningStatusCell.createChild("div", "service-workers-versions-table-running-status-left-cell");
var runningStatusRightCell = runningStatusCell.createChild("div", "service-workers-versions-table-running-status-right-cell");
if (version.isRunning() || version.isStarting()) {
var stopButton = runningStatusLeftCell.createChild("button", "service-workers-button service-workers-stop-button");
stopButton.addEventListener("click", this._stopButtonClicked.bind(this, version.id), false);
stopButton.title = WebInspector.UIString("Stop");
} else if (version.isStartable()) {
var startButton = runningStatusLeftCell.createChild("button", "service-workers-button service-workers-start-button");
startButton.addEventListener("click", this._startButtonClicked.bind(this), false);
startButton.title = WebInspector.UIString("Start");
}
runningStatusRightCell.createTextChild(version.runningStatus);
if (version.isRunning() || version.isStarting()) {
var inspectButton = runningStatusRightCell.createChild("div", "service-workers-versions-table-running-status-inspect");
inspectButton.createTextChild(WebInspector.UIString("inspect"));
inspectButton.addEventListener("click", this._inspectButtonClicked.bind(this, version.id), false);
}
} else {
this._workerCell.createTextChild(version.runningStatus);
}
this._scriptCell.removeChildren();
this._scriptCell.createTextChild(version.scriptURL.asParsedURL().path);
this._updatedCell.removeChildren();
if (version.scriptResponseTime)
this._updatedCell.createTextChild((new Date(version.scriptResponseTime * 1000)).toConsoleTime());
this._scriptLastModifiedCell.removeChildren();
if (version.scriptLastModified)
this._scriptLastModifiedCell.createTextChild((new Date(version.scriptLastModified * 1000)).toConsoleTime());
this._messagesPanel.removeChildren();
if (version.scriptLastModified) {
var scriptLastModifiedLabel = this._messagesPanel.createChild("label", " service-workers-info service-worker-script-last-modified", "dt-icon-label");
scriptLastModifiedLabel.type = "info-icon";
scriptLastModifiedLabel.createTextChild(WebInspector.UIString("Last-Modified: %s", (new Date(version.scriptLastModified * 1000)).toConsoleTime()));
}
if (version.scriptResponseTime) {
var scriptResponseTimeDiv = this._messagesPanel.createChild("label", " service-workers-info service-worker-script-response-time", "dt-icon-label");
scriptResponseTimeDiv.type = "info-icon";
scriptResponseTimeDiv.createTextChild(WebInspector.UIString("Server response time: %s", (new Date(version.scriptResponseTime * 1000)).toConsoleTime()));
}
var errorMessages = version.errorMessages;
for (var index = 0; index < errorMessages.length; ++index) {
var errorDiv = this._messagesPanel.createChild("div", "service-workers-error");
errorDiv.createChild("label", "", "dt-icon-label").type = "error-icon";
errorDiv.createChild("div", "service-workers-error-message").createTextChild(errorMessages[index].errorMessage);
var script_path = errorMessages[index].sourceURL;
var script_url;
if (script_url = script_path.asParsedURL())
script_path = script_url.displayName;
if (script_path.length && errorMessages[index].lineNumber != -1)
script_path = String.sprintf("(%s:%d)", script_path, errorMessages[index].lineNumber);
errorDiv.createChild("div", "service-workers-error-line").createTextChild(script_path);
}
this._clientsTitle.classList.toggle("hidden", version.controlledClients.length == 0);
this._clientsPanel.removeChildren();
for (var i = 0; i < version.controlledClients.length; ++i) {
var client = version.controlledClients[i];
var clientLabelText = this._clientsPanel.createChild("div", "service-worker-client");
if (this._clientInfoCache[client]) {
this._updateClientInfo(clientLabelText, this._clientInfoCache[client]);
}
this._manager.getTargetInfo(client, this._onClientInfo.bind(this, clientLabelText));
}
},
/**
* @param {!Element} tableElement
* @param {string} title
* @return {!Element}
*/
_addTableRow: function(tableElement, title)
{
var rowElement = tableElement.createChild("div", "service-workers-versions-table-row");
rowElement.createChild("div", "service-workers-versions-table-row-title").createTextChild(title);
return rowElement.createChild("div", "service-workers-versions-table-row-content");
},
/**
* @param {!Element} element
* @param {?WebInspector.TargetInfo} targetInfo
*/
_onClientInfo: function(element, targetInfo)
{
if (!targetInfo)
return;
this._clientInfoCache[targetInfo.id] = targetInfo;
this._updateClientInfo(element, targetInfo);
},
/**
* @param {!Element} element
* @param {!WebInspector.TargetInfo} targetInfo
*/
_updateClientInfo: function(element, targetInfo)
{
if (!(targetInfo.isWebContents() || targetInfo.isFrame())) {
element.createTextChild(WebInspector.UIString("Worker: %s", targetInfo.url));
return;
}
element.removeChildren();
element.createTextChild(WebInspector.UIString("Tab: %s", targetInfo.url));
var focusLabel = element.createChild("label", "service-worker-client-focus");
focusLabel.createTextChild("focus");
focusLabel.addEventListener("click", this._activateTarget.bind(this, targetInfo.id), true);
},
/**
* @param {string} targetId
*/
_activateTarget: function(targetId)
{
this._manager.activateTarget(targetId);
},
/**
* @param {!Event} event
*/
_startButtonClicked: function(event)
{
this._manager.startWorker(this._scopeURL);
},
/**
* @param {string} versionId
* @param {!Event} event
*/
_stopButtonClicked: function(versionId, event)
{
this._manager.stopWorker(versionId);
},
/**
* @param {string} versionId
* @param {!Event} event
*/
_inspectButtonClicked: function(versionId, event)
{
this._manager.inspectWorker(versionId);
},
}