<!DOCTYPE html>
<!-- much of this is stolen from omahaproxy.appspot.com/viewer -->
<html>
<head>
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<title>NaCl SDK Manifest Viewer</title>
</head>
<style type="text/css" media="screen">
body {
font-family: monospace;
font-size: 10pt;
}
table {
border-collapse: collapse;
border-color: rgb(100, 100, 100);
border-style: solid;
border-width: 1px 0px 1px 0px;
}
table td {
padding: 3px;
border-color: rgb(100, 100, 100);
border-style: solid;
border-width: 0px 1px 0px 1px;
}
thead {
background-color: lightblue;
font-weight: bold;
border-style: solid;
border-color: rgb(100, 100, 100);
border-width: 0px 0px 2px 0px;
text-align: center;
}
tbody tr:nth-child(odd) {
background-color: rgb(230, 230, 230);
}
tbody tr:hover {
background-color: orange;
}
td a {
padding: 3px;
}
#log > span {
display: block;
}
#log > span.highlight {
font-weight: bold;
}
#log > span.missing {
color: #f00;
}
</style>
<body>
<h1>NaCl SDK Manifest Viewer</h1>
<table>
<thead id="columns">
</thead>
<tbody id="rows">
</tbody>
</table>
<h2>Most recent upload log:</h2>
<div id="log">
</div>
<script type="application/javascript">
function loadText(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onreadystatechange = function (e) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
callback(xhr.responseText);
} else {
console.log("Failed to load "+url+": error " + xhr.status);
}
}
}
xhr.send(null);
}
function loadJson(url, callback) {
loadText(url, function (text) {
callback(JSON.parse(text));
});
}
function removeAllChildren(elm) {
while (elm.childNodes.length) {
elm.removeChild(elm.firstChild);
}
}
function display(data) {
data = data.bundles;
var columnsElm = document.getElementById('columns');
var rowsElm = document.getElementById('rows');
removeAllChildren(columnsElm);
removeAllChildren(rowsElm);
// Create the column headers.
var tr = document.createElement('tr');
var columns = [
'name', 'version', 'revision', 'trunk_revision', 'chrome_version', 'win', 'mac', 'linux', 'all'
];
columns.forEach(function(column) {
var td = document.createElement('td');
var text = document.createTextNode(column);
td.appendChild(text);
tr.appendChild(td);
});
columnsElm.appendChild(tr);
data.forEach(function(row) {
var tr = document.createElement('tr');
columns.forEach(function(column) {
var td = document.createElement('td');
var node = makeCell(row, column);
if (node) {
td.appendChild(node);
}
tr.appendChild(td);
});
rowsElm.appendChild(tr);
});
}
function makeCell(row, column) {
var platforms = ['win', 'mac', 'linux', 'all'];
if (platforms.indexOf(column) !== -1) {
return makePlatformCell(row, column);
} else if (column === 'trunk_revision') {
return makeTrunkRevisionCell(row);
} else if (column === 'chrome_version') {
return makeChromeVersionCell(row);
} else {
return document.createTextNode(row[column]);
}
}
function makePlatformCell(row, column) {
var archives = row.archives;
for (var k = 0; k < archives.length; ++k) {
if (column !== archives[k].host_os) {
continue;
}
// Convert the URL to a short name:
// https://.../36.0.1974.2/naclsdk_linux.tar.bz2 -> naclsdk_linux
var url = archives[k].url;
var lastSlash = url.lastIndexOf('/');
var nextDot = url.indexOf('.', lastSlash);
var name = url.substr(lastSlash + 1, nextDot - lastSlash - 1);
var node = document.createElement('a');
node.setAttribute('href', url);
node.appendChild(document.createTextNode(name));
return node;
}
return null;
}
function makeTrunkRevisionCell(row) {
var url = row.archives[0].url;
var version = versionFromUrl(url);
if (version) {
var node = document.createTextNode('');
baseTrunkRevisionFromVersion(version, function(node) {
return function(revision) {
node.textContent = revision;
};
}(node));
return node;
}
return null;
}
function makeChromeVersionCell(row) {
var url = row.archives[0].url;
var version = versionFromUrl(url);
if (version) {
return document.createTextNode(version);
}
return null;
}
function versionFromUrl(url) {
// Extract the Chrome version from an archive URL.
// It should look something like:
// https://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/36.0.1974.2/naclsdk_win.tar.bz2
var lastSlash = url.lastIndexOf('/');
var penultimateSlash = url.lastIndexOf('/', lastSlash - 1);
// The version is between these two slashes.
var version = url.substr(penultimateSlash + 1,
lastSlash - penultimateSlash - 1);
// It is a chrome version if it matches one of these regexes:
if (/trunk\.\d+/.test(version)) {
// Trunk version.
return version;
} else if (/\d+\.\d+\.\d+\.\d+/.test(version)) {
// Branch version.
return version;
} else {
// Not a version.
return null;
}
}
function baseTrunkRevisionFromVersion(version, callback) {
if (version.indexOf('trunk', 0) === 0) {
callback(version.substr(6)); // Skip "trunk."
} else {
revisionFromVersion(baseTrunkVersionFromVersion(version), callback);
}
}
function baseTrunkVersionFromVersion(version) {
var lastDot = version.lastIndexOf('.');
return version.substr(0, lastDot) + '.0';
}
function revisionFromVersion(version, callback) {
var url = 'http://omahaproxy.appspot.com/revision.json?version='+version;
loadJson(url, function(data) {
callback(data.chromium_revision);
});
}
function displayLog(text) {
var lines = text.split('\n');
var logEl = document.getElementById('log');
lines.forEach(function (line) {
var spanEl = document.createElement('span');
spanEl.textContent = line;
if (line.indexOf('>>>', 0) === 0) {
spanEl.classList.add('highlight');
} else if (line.indexOf('Missing archives') !== -1) {
spanEl.classList.add('missing');
}
logEl.appendChild(spanEl);
});
}
loadJson('naclsdk_manifest2.json', display);
loadText('naclsdk_manifest2.json.log', displayLog);
</script>
</body>
</html>