|
|
|
@ -64,6 +64,15 @@ var dateOptions = {
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Adjust top padding of content table, to match that of toolbar height.
|
|
|
|
|
|
|
|
|
|
document.getElementById('content').style.setProperty(
|
|
|
|
|
'margin-top',
|
|
|
|
|
document.getElementById('toolbar').offsetHeight + 'px'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var escapeHTML = function(s) {
|
|
|
|
|
return s.replace(reEscapeLeftBracket, '<')
|
|
|
|
|
.replace(reEscapeRightBracket, '>');
|
|
|
|
@ -74,6 +83,18 @@ var reEscapeRightBracket = />/g;
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var classNameFromTabId = function(tabId) {
|
|
|
|
|
if ( tabId === noTabId ) {
|
|
|
|
|
return 'tab_bts';
|
|
|
|
|
}
|
|
|
|
|
if ( tabId !== '' ) {
|
|
|
|
|
return 'tab_' + tabId;
|
|
|
|
|
}
|
|
|
|
|
return '';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Emphasize hostname and cookie name.
|
|
|
|
|
|
|
|
|
|
var emphasizeCookie = function(s) {
|
|
|
|
@ -261,11 +282,12 @@ var renderLogEntry = function(entry) {
|
|
|
|
|
|
|
|
|
|
if ( entry.tab ) {
|
|
|
|
|
tr.classList.add('tab');
|
|
|
|
|
var className = classNameFromTabId(entry.tab);
|
|
|
|
|
if ( className !== '' ) {
|
|
|
|
|
tr.classList.add(className);
|
|
|
|
|
}
|
|
|
|
|
if ( entry.tab === noTabId ) {
|
|
|
|
|
tr.classList.add('tab_bts');
|
|
|
|
|
tr.cells[1].appendChild(createHiddenTextNode('bts'));
|
|
|
|
|
} else if ( entry.tab !== '' ) {
|
|
|
|
|
tr.classList.add('tab_' + entry.tab);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ( entry.cat !== '' ) {
|
|
|
|
@ -329,6 +351,81 @@ var renderLogEntries = function(response) {
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var synchronizeTabIds = function(newTabIds) {
|
|
|
|
|
var oldTabIds = allTabIds;
|
|
|
|
|
|
|
|
|
|
// Neuter rows for which a tab does not exist anymore
|
|
|
|
|
// TODO: sort to avoid using indexOf
|
|
|
|
|
|
|
|
|
|
var autoDeleteVoidRows = !!vAPI.localStorage.getItem('loggerAutoDeleteVoidRows');
|
|
|
|
|
var rowVoided = false;
|
|
|
|
|
var trs;
|
|
|
|
|
for ( var tabId in oldTabIds ) {
|
|
|
|
|
if ( oldTabIds.hasOwnProperty(tabId) === false ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( newTabIds.hasOwnProperty(tabId) ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
// Mark or remove voided rows
|
|
|
|
|
trs = uDom('.tab_' + tabId);
|
|
|
|
|
if ( autoDeleteVoidRows ) {
|
|
|
|
|
toJunkyard(trs);
|
|
|
|
|
} else {
|
|
|
|
|
trs.removeClass('canMtx');
|
|
|
|
|
rowVoided = true;
|
|
|
|
|
}
|
|
|
|
|
// Remove popup if it is currently bound to a removed tab.
|
|
|
|
|
if ( tabId === popupManager.tabId ) {
|
|
|
|
|
popupManager.toggleOff();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var select = document.getElementById('pageSelector');
|
|
|
|
|
var selectValue = select.value;
|
|
|
|
|
var tabIds = Object.keys(newTabIds).sort(function(a, b) {
|
|
|
|
|
var sa = newTabIds[a].title || newTabIds[a].url;
|
|
|
|
|
var sb = newTabIds[b].title || newTabIds[b].url;
|
|
|
|
|
return sa.localeCompare(sb);
|
|
|
|
|
});
|
|
|
|
|
var option, entry;
|
|
|
|
|
for ( var i = 0, j = 2; i < tabIds.length; i++ ) {
|
|
|
|
|
tabId = tabIds[i];
|
|
|
|
|
if ( tabId === noTabId ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
option = select.options[j];
|
|
|
|
|
j += 1;
|
|
|
|
|
if ( !option ) {
|
|
|
|
|
option = document.createElement('option');
|
|
|
|
|
select.appendChild(option);
|
|
|
|
|
}
|
|
|
|
|
entry = newTabIds[tabId];
|
|
|
|
|
option.textContent = entry.title || entry.url;
|
|
|
|
|
option.value = classNameFromTabId(tabId);
|
|
|
|
|
if ( option.value === selectValue ) {
|
|
|
|
|
option.setAttribute('selected', '');
|
|
|
|
|
} else {
|
|
|
|
|
option.removeAttribute('selected');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for ( ; j < select.options.length; j++ ) {
|
|
|
|
|
select.removeChild(select.options[j]);
|
|
|
|
|
}
|
|
|
|
|
if ( select.value !== selectValue ) {
|
|
|
|
|
select.selectedIndex = 0;
|
|
|
|
|
select.value = '';
|
|
|
|
|
select.options[0].setAttribute('selected', '');
|
|
|
|
|
pageSelectorChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
allTabIds = newTabIds;
|
|
|
|
|
|
|
|
|
|
return rowVoided;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var truncateLog = function(size) {
|
|
|
|
|
if ( size === 0 ) {
|
|
|
|
|
size = 5000;
|
|
|
|
@ -356,28 +453,7 @@ var onLogBufferRead = function(response) {
|
|
|
|
|
|
|
|
|
|
// Neuter rows for which a tab does not exist anymore
|
|
|
|
|
// TODO: sort to avoid using indexOf
|
|
|
|
|
var autoDeleteVoidRows = vAPI.localStorage.getItem('loggerAutoDeleteVoidRows');
|
|
|
|
|
var rowVoided = false, trs;
|
|
|
|
|
for ( var tabId in allTabIds ) {
|
|
|
|
|
if ( allTabIds.hasOwnProperty(tabId) === false ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( response.tabIds.hasOwnProperty(tabId) ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
trs = uDom('.tab_' + tabId);
|
|
|
|
|
if ( autoDeleteVoidRows ) {
|
|
|
|
|
toJunkyard(trs);
|
|
|
|
|
} else {
|
|
|
|
|
trs.removeClass('canMtx');
|
|
|
|
|
rowVoided = true;
|
|
|
|
|
}
|
|
|
|
|
if ( tabId === popupManager.tabId ) {
|
|
|
|
|
popupManager.toggleOff();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
allTabIds = response.tabIds;
|
|
|
|
|
|
|
|
|
|
var rowVoided = synchronizeTabIds(response.tabIds);
|
|
|
|
|
renderLogEntries(response);
|
|
|
|
|
|
|
|
|
|
if ( rowVoided ) {
|
|
|
|
@ -408,6 +484,41 @@ var readLogBuffer = function() {
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var pageSelectorChanged = function() {
|
|
|
|
|
var style = document.getElementById('tabFilterer');
|
|
|
|
|
var tabClass = document.getElementById('pageSelector').value;
|
|
|
|
|
var sheet = style.sheet;
|
|
|
|
|
while ( sheet.cssRules.length !== 0 ) {
|
|
|
|
|
sheet.deleteRule(0);
|
|
|
|
|
}
|
|
|
|
|
if ( tabClass !== '' ) {
|
|
|
|
|
sheet.insertRule(
|
|
|
|
|
'#content table tr:not(.' + tabClass + ') { display: none; }',
|
|
|
|
|
0
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
uDom('#refresh').toggleClass(
|
|
|
|
|
'disabled',
|
|
|
|
|
tabClass === '' || tabClass === 'tab_bts'
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var refreshTab = function() {
|
|
|
|
|
var tabClass = document.getElementById('pageSelector').value;
|
|
|
|
|
var matches = tabClass.match(/^tab_(.+)$/);
|
|
|
|
|
if ( matches === null ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ( matches[1] === 'bts' ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
messager.send({ what: 'forceReloadTab', tabId: matches[1] });
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var onMaxEntriesChanged = function() {
|
|
|
|
|
var raw = uDom(this).val();
|
|
|
|
|
try {
|
|
|
|
@ -675,7 +786,7 @@ var popupManager = (function() {
|
|
|
|
|
popupObserver = new MutationObserver(resizePopup);
|
|
|
|
|
container.appendChild(popup);
|
|
|
|
|
|
|
|
|
|
style = document.querySelector('#content > style');
|
|
|
|
|
style = document.getElementById('popupFilterer');
|
|
|
|
|
style.textContent = styleTemplate.replace('{{tabId}}', localTabId);
|
|
|
|
|
|
|
|
|
|
document.body.classList.add('popupOn');
|
|
|
|
@ -727,6 +838,8 @@ var popupManager = (function() {
|
|
|
|
|
uDom.onLoad(function() {
|
|
|
|
|
readLogBuffer();
|
|
|
|
|
|
|
|
|
|
uDom('#pageSelector').on('change', pageSelectorChanged);
|
|
|
|
|
uDom('#refresh').on('click', refreshTab);
|
|
|
|
|
uDom('#compactViewToggler').on('click', toggleCompactView);
|
|
|
|
|
uDom('#clean').on('click', cleanBuffer);
|
|
|
|
|
uDom('#clear').on('click', clearBuffer);
|
|
|
|
|