<style> #sync-events-table, #sync-events-table th, #sync-events-table td { border: 1px black solid; } #sync-events-table { width: 100%; } #sync-events > tr { vertical-align: top; } </style> <table id="sync-events-table"> <thead> <th>Time</th> <th>Submodule</th> <th>Event</th> <th>Details</th> </thead> <tbody id="sync-events"> </tbody> </table> <script> (function() { function makeLogEntryNode(entry) { var timeNode = document.createElement('td'); timeNode.innerText = entry.date; var submoduleNode = document.createElement('td'); submoduleNode.innerText = entry.submodule; var eventNode = document.createElement('td'); eventNode.innerText = entry.event; var details = document.createElement('pre'); details.innerText = JSON.stringify(entry.details, null, 2); var detailsNode = document.createElement('td'); detailsNode.appendChild(details); var node = document.createElement('tr'); node.appendChild(timeNode); node.appendChild(submoduleNode); node.appendChild(eventNode); node.appendChild(detailsNode); return node; } var syncEvents = document.getElementById('sync-events'); var entries = chrome.sync.log.entries; for (var i = 0; i < entries.length; ++i) { syncEvents.appendChild(makeLogEntryNode(entries[i])); } chrome.sync.log.addEventListener('append', function(event) { syncEvents.appendChild(makeLogEntryNode(event.detail)); }); })(); </script>