blob: eaeb62debd0f53db38806b0ee1bc2c76942a3e34 [file] [log] [blame]
/*
* Copyright (C) 2011 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @unrestricted
*/
Profiler.ProfileLauncherView = class extends UI.VBox {
/**
* @param {!Profiler.ProfilesPanel} profilesPanel
*/
constructor(profilesPanel) {
super();
this.registerRequiredCSS('profiler/profileLauncherView.css');
this._panel = profilesPanel;
this.element.classList.add('profile-launcher-view');
this._contentElement = this.element.createChild('div', 'profile-launcher-view-content vbox');
const profileTypeSelectorElement = this._contentElement.createChild('div', 'vbox');
this._selectedProfileTypeSetting = Common.settings.createSetting('selectedProfileType', 'CPU');
this._profileTypeHeaderElement = profileTypeSelectorElement.createChild('h1');
this._profileTypeSelectorForm = profileTypeSelectorElement.createChild('form');
UI.ARIAUtils.markAsRadioGroup(this._profileTypeSelectorForm);
const isolateSelectorElement = this._contentElement.createChild('div', 'vbox profile-isolate-selector-block');
isolateSelectorElement.createChild('h1').textContent = ls`Select JavaScript VM instance`;
const isolateSelector = new Profiler.IsolateSelector();
isolateSelector.show(isolateSelectorElement.createChild('div', 'vbox profile-launcher-target-list'));
isolateSelectorElement.appendChild(isolateSelector.totalMemoryElement());
const buttonsDiv = this._contentElement.createChild('div', 'hbox profile-launcher-buttons');
this._controlButton = UI.createTextButton('', this._controlButtonClicked.bind(this), '', /* primary */ true);
this._loadButton = UI.createTextButton(ls`Load`, this._loadButtonClicked.bind(this), '');
buttonsDiv.appendChild(this._controlButton);
buttonsDiv.appendChild(this._loadButton);
this._recordButtonEnabled = true;
/** @type {!Map<string, !HTMLOptionElement>} */
this._typeIdToOptionElement = new Map();
}
_loadButtonClicked() {
this._panel.showLoadFromFileDialog();
}
_updateControls() {
if (this._isEnabled && this._recordButtonEnabled) {
this._controlButton.removeAttribute('disabled');
} else {
this._controlButton.setAttribute('disabled', '');
}
this._controlButton.title = this._recordButtonEnabled ? '' : UI.anotherProfilerActiveLabel();
if (this._isInstantProfile) {
this._controlButton.classList.remove('running');
this._controlButton.classList.add('primary-button');
this._controlButton.textContent = Common.UIString('Take snapshot');
} else if (this._isProfiling) {
this._controlButton.classList.add('running');
this._controlButton.classList.remove('primary-button');
this._controlButton.textContent = Common.UIString('Stop');
} else {
this._controlButton.classList.remove('running');
this._controlButton.classList.add('primary-button');
this._controlButton.textContent = Common.UIString('Start');
}
for (const item of this._typeIdToOptionElement.values()) {
item.disabled = !!this._isProfiling;
}
}
profileStarted() {
this._isProfiling = true;
this._updateControls();
}
profileFinished() {
this._isProfiling = false;
this._updateControls();
}
/**
* @param {!Profiler.ProfileType} profileType
* @param {boolean} recordButtonEnabled
*/
updateProfileType(profileType, recordButtonEnabled) {
this._isInstantProfile = profileType.isInstantProfile();
this._recordButtonEnabled = recordButtonEnabled;
this._isEnabled = profileType.isEnabled();
this._updateControls();
}
/**
* @param {!Profiler.ProfileType} profileType
*/
addProfileType(profileType) {
const labelElement = UI.createRadioLabel('profile-type', profileType.name);
this._profileTypeSelectorForm.appendChild(labelElement);
const optionElement = labelElement.radioElement;
this._typeIdToOptionElement.set(profileType.id, optionElement);
optionElement._profileType = profileType;
optionElement.style.hidden = true;
optionElement.addEventListener('change', this._profileTypeChanged.bind(this, profileType), false);
const descriptionElement = this._profileTypeSelectorForm.createChild('p');
descriptionElement.textContent = profileType.description;
UI.ARIAUtils.setDescription(optionElement, profileType.description);
const customContent = profileType.customContent();
if (customContent) {
this._profileTypeSelectorForm.createChild('p').appendChild(customContent);
profileType.setCustomContentEnabled(false);
}
const headerText = this._typeIdToOptionElement.size > 1 ? ls`Select profiling type` : profileType.name;
this._profileTypeHeaderElement.textContent = headerText;
UI.ARIAUtils.setAccessibleName(this._profileTypeSelectorForm, headerText);
}
restoreSelectedProfileType() {
let typeId = this._selectedProfileTypeSetting.get();
if (!this._typeIdToOptionElement.has(typeId)) {
typeId = this._typeIdToOptionElement.keys().next().value;
this._selectedProfileTypeSetting.set(typeId);
}
this._typeIdToOptionElement.get(typeId).checked = true;
const type = this._typeIdToOptionElement.get(typeId)._profileType;
for (const [id, element] of this._typeIdToOptionElement) {
const enabled = (id === typeId);
element._profileType.setCustomContentEnabled(enabled);
}
this.dispatchEventToListeners(Profiler.ProfileLauncherView.Events.ProfileTypeSelected, type);
}
_controlButtonClicked() {
this._panel.toggleRecord();
}
/**
* @param {!Profiler.ProfileType} profileType
*/
_profileTypeChanged(profileType) {
const typeId = this._selectedProfileTypeSetting.get();
const type = this._typeIdToOptionElement.get(typeId)._profileType;
type.setCustomContentEnabled(false);
profileType.setCustomContentEnabled(true);
this.dispatchEventToListeners(Profiler.ProfileLauncherView.Events.ProfileTypeSelected, profileType);
this._isInstantProfile = profileType.isInstantProfile();
this._isEnabled = profileType.isEnabled();
this._updateControls();
this._selectedProfileTypeSetting.set(profileType.id);
}
};
/** @enum {symbol} */
Profiler.ProfileLauncherView.Events = {
ProfileTypeSelected: Symbol('ProfileTypeSelected')
};