blob: a0faf0ed7b26ee6c757c1427474f64bff8d46ad1 [file] [log] [blame]
// Copyright (c) 2012 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.
function inspect(data) {
chrome.send('inspect', [data]);
}
function terminate(data) {
chrome.send('terminate', [data]);
}
function removeChildren(element_id) {
var element = $(element_id);
element.textContent = '';
}
function onload() {
var tabContents = document.querySelectorAll('#content > div');
for (var i = 0; i != tabContents.length; i++) {
var tabContent = tabContents[i];
var tabName = tabContent.querySelector('.content-header').textContent;
var tabHeader = document.createElement('div');
tabHeader.className = 'tab-header';
var button = document.createElement('button');
button.textContent = tabName;
tabHeader.appendChild(button);
tabHeader.addEventListener('click', selectTab.bind(null, tabContent.id));
$('navigation').appendChild(tabHeader);
}
var selectedTabName = window.location.hash.slice(1) || 'devices';
selectTab(selectedTabName + '-tab');
chrome.send('init-ui');
}
function selectTab(id) {
var tabContents = document.querySelectorAll('#content > div');
var tabHeaders = $('navigation').querySelectorAll('.tab-header');
for (var i = 0; i != tabContents.length; i++) {
var tabContent = tabContents[i];
var tabHeader = tabHeaders[i];
if (tabContent.id == id) {
tabContent.classList.add('selected');
tabHeader.classList.add('selected');
} else {
tabContent.classList.remove('selected');
tabHeader.classList.remove('selected');
}
}
}
function populateLists(data) {
removeChildren('pages');
removeChildren('extensions');
removeChildren('apps');
removeChildren('others');
for (var i = 0; i < data.length; i++) {
if (data[i].type === 'page')
addToPagesList(data[i]);
else if (data[i].type === 'extension')
addToExtensionsList(data[i]);
else if (data[i].type === 'app')
addToAppsList(data[i]);
else
addToOthersList(data[i]);
}
}
function populateWorkersList(data) {
removeChildren('workers');
for (var i = 0; i < data.length; i++)
addToWorkersList(data[i]);
}
function populateDeviceLists(pages) {
var pagesDigest = JSON.stringify(pages);
if (!pages || pagesDigest == window.pagesDigest)
return;
window.pagesDigest = pagesDigest;
// Clear existing entries
var deviceElements = document.querySelectorAll('.device');
for (var i = 0; i < deviceElements.length; i++)
deviceElements[i].remove();
var containerElement = $('devices');
// Populate with new entries
for (var i = 0; pages && i < pages.length; i++) {
var page = pages[i];
var listId = 'device-' + page.adbSerial;
var listElement = $(listId);
if (!listElement) {
var sectionElement = document.createElement('div');
sectionElement.className = 'section device';
sectionElement.textContent = page.adbModel;
listElement = document.createElement('div');
listElement.className = 'list device';
listElement.id = listId;
containerElement.appendChild(sectionElement);
containerElement.appendChild(listElement);
}
var packageId = 'package-' + page.adbModel + '-' + page.adbPackage;
var packageElement = $(packageId);
if (!packageElement) {
var sectionElement = document.createElement('div');
sectionElement.className = 'small-section package';
sectionElement.textContent = page.adbPackage;
packageElement = document.createElement('div');
packageElement.className = 'list package';
packageElement.id = packageId;
listElement.appendChild(sectionElement);
listElement.appendChild(packageElement);
}
addTargetToList(page, packageId, ['faviconUrl', 'name', 'url']);
}
}
function addToPagesList(data) {
addTargetToList(data, 'pages', ['faviconUrl', 'name', 'url']);
}
function addToExtensionsList(data) {
addTargetToList(data, 'extensions', ['name', 'url']);
}
function addToAppsList(data) {
addTargetToList(data, 'apps', ['name', 'url']);
}
function addToWorkersList(data) {
addTargetToList(data,
'workers',
['name', 'url', 'pid'],
true);
}
function addToOthersList(data) {
addTargetToList(data, 'others', ['url']);
}
function formatValue(data, property) {
var value = data[property];
if (property == 'faviconUrl') {
var faviconElement = document.createElement('img');
if (value)
faviconElement.src = value;
return faviconElement;
}
var text = value ? String(value) : '';
if (text.length > 100)
text = text.substring(0, 100) + '\u2026';
if (property == 'pid')
text = 'Pid:' + text;
var span = document.createElement('span');
span.textContent = ' ' + text + ' ';
span.className = property;
return span;
}
function addTargetToList(data, listId, properties, canTerminate) {
var list = $(listId);
var row = document.createElement('div');
row.className = 'row';
for (var j = 0; j < properties.length; j++)
row.appendChild(formatValue(data, properties[j]));
row.appendChild(createInspectElement(data));
if (canTerminate)
row.appendChild(createTerminateElement(data));
row.processId = data.processId;
row.routeId = data.routeId;
list.appendChild(row);
}
function createInspectElement(data) {
var link = document.createElement('a');
link.setAttribute('href', '#');
link.textContent = ' inspect ';
link.addEventListener(
'click',
inspect.bind(this, data),
true);
return link;
}
function createTerminateElement(data) {
var link = document.createElement('a');
if (data.attached)
link.disabled = true;
link.setAttribute('href', '#');
link.textContent = ' terminate ';
link.addEventListener(
'click',
terminate.bind(this, data),
true);
return link;
}
document.addEventListener('DOMContentLoaded', onload);