2015-01-06 13:01:15 +00:00
|
|
|
|
/*******************************************************************************
|
|
|
|
|
|
|
2015-03-07 18:20:18 +00:00
|
|
|
|
sessbench - a browser extension to benchmark browser session.
|
2015-01-06 13:01:15 +00:00
|
|
|
|
Copyright (C) 2013 Raymond Hill
|
|
|
|
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
|
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
|
|
|
|
|
|
|
|
|
|
|
Home: https://github.com/gorhill/sessbench
|
|
|
|
|
|
|
|
|
|
|
|
TODO: cleanup/refactor
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/* global vAPI, uDom */
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
|
|
2015-03-20 19:14:56 +00:00
|
|
|
|
'use strict';
|
|
|
|
|
|
|
2015-01-06 13:01:15 +00:00
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var messager = vAPI.messaging.channel('devtool-log.js');
|
|
|
|
|
|
|
|
|
|
|
|
var inspectedTabId = '';
|
|
|
|
|
|
var doc = document;
|
|
|
|
|
|
var body = doc.body;
|
|
|
|
|
|
var tbody = doc.querySelector('#content tbody');
|
2015-04-25 13:33:43 +00:00
|
|
|
|
var row1Junkyard = [];
|
|
|
|
|
|
var row4Junkyard = [];
|
2015-03-03 00:48:28 +00:00
|
|
|
|
var reFilter = null;
|
2015-03-04 00:11:32 +00:00
|
|
|
|
var filterTargetTestResult = true;
|
|
|
|
|
|
var maxEntries = 0;
|
|
|
|
|
|
|
|
|
|
|
|
var prettyRequestTypes = {
|
|
|
|
|
|
'main_frame': 'doc',
|
|
|
|
|
|
'stylesheet': 'css',
|
|
|
|
|
|
'sub_frame': 'frame',
|
|
|
|
|
|
'xmlhttprequest': 'xhr'
|
|
|
|
|
|
};
|
2015-01-06 13:01:15 +00:00
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-03-20 19:14:56 +00:00
|
|
|
|
var escapeHTML = function(s) {
|
|
|
|
|
|
return s.replace(reEscapeLeftBracket, '<')
|
|
|
|
|
|
.replace(reEscapeRightBracket, '>');
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var reEscapeLeftBracket = /</g;
|
|
|
|
|
|
var reEscapeRightBracket = />/g;
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-01-06 13:01:15 +00:00
|
|
|
|
var renderURL = function(url, filter) {
|
|
|
|
|
|
if ( filter.charAt(0) !== 's' ) {
|
2015-03-20 19:14:56 +00:00
|
|
|
|
return escapeHTML(url);
|
2015-01-06 13:01:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
// make a regex out of the filter
|
|
|
|
|
|
var reText = filter.slice(3);
|
|
|
|
|
|
var pos = reText.indexOf('$');
|
|
|
|
|
|
if ( pos > 0 ) {
|
|
|
|
|
|
reText = reText.slice(0, pos);
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( reText === '*' ) {
|
|
|
|
|
|
reText = '\\*';
|
2015-01-23 16:32:49 +00:00
|
|
|
|
} else if ( reText.charAt(0) === '/' && reText.slice(-1) === '/' ) {
|
|
|
|
|
|
reText = reText.slice(1, -1);
|
2015-01-06 13:01:15 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
reText = reText
|
|
|
|
|
|
.replace(/\./g, '\\.')
|
|
|
|
|
|
.replace(/\?/g, '\\?')
|
|
|
|
|
|
.replace('||', '')
|
|
|
|
|
|
.replace(/\^/g, '.')
|
2015-03-01 13:57:43 +00:00
|
|
|
|
.replace(/^\|/g, '^')
|
2015-03-01 16:20:30 +00:00
|
|
|
|
.replace(/\|$/g, '$')
|
2015-01-06 13:01:15 +00:00
|
|
|
|
.replace(/\*/g, '.*')
|
|
|
|
|
|
;
|
|
|
|
|
|
}
|
|
|
|
|
|
var re = new RegExp(reText, 'gi');
|
|
|
|
|
|
var matches = re.exec(url);
|
|
|
|
|
|
var renderedURL = url;
|
|
|
|
|
|
|
|
|
|
|
|
if ( matches && matches[0].length ) {
|
2015-03-20 19:14:56 +00:00
|
|
|
|
renderedURL = escapeHTML(url.slice(0, matches.index)) +
|
2015-01-06 13:01:15 +00:00
|
|
|
|
'<b>' +
|
2015-03-20 19:14:56 +00:00
|
|
|
|
escapeHTML(url.slice(matches.index, re.lastIndex)) +
|
2015-01-06 13:01:15 +00:00
|
|
|
|
'</b>' +
|
2015-03-20 19:14:56 +00:00
|
|
|
|
escapeHTML(url.slice(re.lastIndex));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
renderedURL = escapeHTML(renderedURL);
|
2015-01-06 13:01:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return renderedURL;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var createRow = function() {
|
2015-04-25 13:33:43 +00:00
|
|
|
|
var tr = row4Junkyard.pop();
|
2015-01-06 13:01:15 +00:00
|
|
|
|
if ( tr ) {
|
|
|
|
|
|
tr.className = '';
|
|
|
|
|
|
return tr;
|
|
|
|
|
|
}
|
|
|
|
|
|
tr = doc.createElement('tr');
|
|
|
|
|
|
tr.appendChild(doc.createElement('td'));
|
|
|
|
|
|
tr.appendChild(doc.createElement('td'));
|
|
|
|
|
|
tr.appendChild(doc.createElement('td'));
|
2015-01-23 16:32:49 +00:00
|
|
|
|
tr.appendChild(doc.createElement('td'));
|
2015-01-06 13:01:15 +00:00
|
|
|
|
return tr;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-04-25 13:33:43 +00:00
|
|
|
|
var createGap = function(url) {
|
|
|
|
|
|
var tr = row1Junkyard.pop();
|
|
|
|
|
|
if ( !tr ) {
|
|
|
|
|
|
tr = doc.createElement('tr');
|
|
|
|
|
|
tr.classList.add('docBoundary');
|
|
|
|
|
|
tr.appendChild(doc.createElement('td'));
|
|
|
|
|
|
tr.cells[0].setAttribute('colspan', '4');
|
|
|
|
|
|
}
|
|
|
|
|
|
tr.cells[0].textContent = url;
|
2015-04-25 11:59:33 +00:00
|
|
|
|
tbody.insertBefore(tr, tbody.firstChild);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-01-06 13:01:15 +00:00
|
|
|
|
var renderLogEntry = function(entry) {
|
|
|
|
|
|
var tr = createRow();
|
2015-04-25 11:28:35 +00:00
|
|
|
|
|
2015-04-25 11:59:33 +00:00
|
|
|
|
// If the request is that of a root frame, insert a gap in the table
|
|
|
|
|
|
// in order to visually separate entries for different documents.
|
|
|
|
|
|
if ( entry.type === 'main_frame' ) {
|
2015-04-25 13:33:43 +00:00
|
|
|
|
createGap(entry.url);
|
2015-04-25 11:59:33 +00:00
|
|
|
|
tr.classList.add('maindoc');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-04-25 11:28:35 +00:00
|
|
|
|
// Cosmetic filter?
|
|
|
|
|
|
if ( entry.result.charAt(0) === 'c' ) {
|
|
|
|
|
|
tr.classList.add('cosmetic');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-06 13:01:15 +00:00
|
|
|
|
if ( entry.result.charAt(1) === 'b' ) {
|
|
|
|
|
|
tr.classList.add('blocked');
|
2015-03-04 00:11:32 +00:00
|
|
|
|
tr.cells[0].textContent = ' -\u00A0';
|
2015-01-06 13:01:15 +00:00
|
|
|
|
} else if ( entry.result.charAt(1) === 'a' ) {
|
|
|
|
|
|
tr.classList.add('allowed');
|
2015-01-16 17:15:12 +00:00
|
|
|
|
if ( entry.result.charAt(0) === 'm' ) {
|
|
|
|
|
|
tr.classList.add('mirrored');
|
|
|
|
|
|
}
|
2015-03-03 00:48:28 +00:00
|
|
|
|
tr.cells[0].textContent = ' +\u00A0';
|
2015-01-23 16:32:49 +00:00
|
|
|
|
} else {
|
2015-03-04 00:11:32 +00:00
|
|
|
|
tr.cells[0].textContent = '';
|
2015-01-06 13:01:15 +00:00
|
|
|
|
}
|
2015-04-25 11:28:35 +00:00
|
|
|
|
|
2015-01-07 23:56:03 +00:00
|
|
|
|
if ( entry.type === 'main_frame' ) {
|
|
|
|
|
|
tr.classList.add('maindoc');
|
|
|
|
|
|
}
|
2015-04-25 11:28:35 +00:00
|
|
|
|
|
2015-01-23 16:32:49 +00:00
|
|
|
|
var filterText = entry.result.slice(3);
|
|
|
|
|
|
if ( entry.result.lastIndexOf('sa', 0) === 0 ) {
|
|
|
|
|
|
filterText = '@@' + filterText;
|
|
|
|
|
|
}
|
2015-04-25 11:28:35 +00:00
|
|
|
|
|
2015-03-04 00:11:32 +00:00
|
|
|
|
tr.cells[1].textContent = filterText + '\t';
|
|
|
|
|
|
tr.cells[2].textContent = (prettyRequestTypes[entry.type] || entry.type) + '\t';
|
2015-01-23 16:32:49 +00:00
|
|
|
|
vAPI.insertHTML(tr.cells[3], renderURL(entry.url, entry.result));
|
2015-03-03 00:48:28 +00:00
|
|
|
|
applyFilterToRow(tr);
|
2015-01-06 13:01:15 +00:00
|
|
|
|
tbody.insertBefore(tr, tbody.firstChild);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-04-23 22:46:14 +00:00
|
|
|
|
var renderLogBuffer = function(response) {
|
|
|
|
|
|
body.classList.toggle('colorBlind', response.colorBlind);
|
|
|
|
|
|
|
|
|
|
|
|
var buffer = response.entries;
|
2015-01-26 19:07:55 +00:00
|
|
|
|
if ( buffer.length === 0 ) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-06 13:01:15 +00:00
|
|
|
|
// Preserve scroll position
|
|
|
|
|
|
var height = tbody.offsetHeight;
|
|
|
|
|
|
|
|
|
|
|
|
var n = buffer.length;
|
|
|
|
|
|
for ( var i = 0; i < n; i++ ) {
|
|
|
|
|
|
renderLogEntry(buffer[i]);
|
|
|
|
|
|
}
|
2015-01-26 19:07:55 +00:00
|
|
|
|
|
2015-03-03 10:40:48 +00:00
|
|
|
|
// Prevent logger from growing infinitely and eating all memory. For
|
|
|
|
|
|
// instance someone could forget that it is left opened for some
|
|
|
|
|
|
// dynamically refreshed pages.
|
2015-03-04 00:11:32 +00:00
|
|
|
|
truncateLog(maxEntries);
|
2015-03-03 10:40:48 +00:00
|
|
|
|
|
2015-01-26 19:07:55 +00:00
|
|
|
|
var yDelta = tbody.offsetHeight - height;
|
|
|
|
|
|
if ( yDelta === 0 ) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Chromium:
|
|
|
|
|
|
// body.scrollTop = good value
|
|
|
|
|
|
// body.parentNode.scrollTop = 0
|
2015-01-06 13:01:15 +00:00
|
|
|
|
if ( body.scrollTop !== 0 ) {
|
2015-01-26 19:07:55 +00:00
|
|
|
|
body.scrollTop += yDelta;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Firefox:
|
|
|
|
|
|
// body.scrollTop = 0
|
|
|
|
|
|
// body.parentNode.scrollTop = good value
|
|
|
|
|
|
var parentNode = body.parentNode;
|
|
|
|
|
|
if ( parentNode && parentNode.scrollTop !== 0 ) {
|
|
|
|
|
|
parentNode.scrollTop += yDelta;
|
2015-01-06 13:01:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-03-04 00:11:32 +00:00
|
|
|
|
var truncateLog = function(size) {
|
|
|
|
|
|
if ( size === 0 ) {
|
|
|
|
|
|
size = 25000;
|
|
|
|
|
|
}
|
|
|
|
|
|
size = Math.min(size, 25000);
|
2015-04-25 13:33:43 +00:00
|
|
|
|
var tr;
|
2015-03-04 00:11:32 +00:00
|
|
|
|
while ( tbody.childElementCount > size ) {
|
2015-04-25 13:33:43 +00:00
|
|
|
|
tr = tbody.lastElementChild;
|
|
|
|
|
|
// https://github.com/gorhill/uBlock/issues/123
|
|
|
|
|
|
// Triage according to row type.
|
|
|
|
|
|
if ( tr.cells.length === 1 ) {
|
|
|
|
|
|
row1Junkyard.push(tr);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
row4Junkyard.push(tr);
|
|
|
|
|
|
}
|
|
|
|
|
|
tbody.removeChild(tr);
|
2015-03-04 00:11:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-04-23 22:46:14 +00:00
|
|
|
|
var onBufferRead = function(response) {
|
|
|
|
|
|
renderLogBuffer(response);
|
2015-01-06 13:01:15 +00:00
|
|
|
|
setTimeout(readLogBuffer, 1000);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
// This can be called only once, at init time. After that, this will be called
|
|
|
|
|
|
// automatically. If called after init time, this will be messy, and this would
|
|
|
|
|
|
// require a bit more code to ensure no multi time out events.
|
|
|
|
|
|
|
|
|
|
|
|
var readLogBuffer = function() {
|
|
|
|
|
|
messager.send({ what: 'readLogBuffer', tabId: inspectedTabId }, onBufferRead);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var clearBuffer = function() {
|
2015-04-25 13:33:43 +00:00
|
|
|
|
var tr;
|
2015-01-07 16:36:23 +00:00
|
|
|
|
while ( tbody.firstChild !== null ) {
|
2015-04-25 13:33:43 +00:00
|
|
|
|
tr = tbody.lastElementChild;
|
|
|
|
|
|
// https://github.com/gorhill/uBlock/issues/123
|
|
|
|
|
|
// Triage according to row type.
|
|
|
|
|
|
if ( tr.cells.length === 1 ) {
|
|
|
|
|
|
row1Junkyard.push(tr);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
row4Junkyard.push(tr);
|
|
|
|
|
|
}
|
|
|
|
|
|
tbody.removeChild(tr);
|
2015-01-06 13:01:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var reloadTab = function() {
|
|
|
|
|
|
messager.send({ what: 'reloadTab', tabId: inspectedTabId });
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-03-03 00:48:28 +00:00
|
|
|
|
var applyFilterToRow = function(row) {
|
|
|
|
|
|
var re = reFilter;
|
2015-03-04 00:11:32 +00:00
|
|
|
|
if ( re === null || re.test(row.textContent) === filterTargetTestResult ) {
|
2015-03-03 00:48:28 +00:00
|
|
|
|
row.classList.remove('hidden');
|
|
|
|
|
|
} else {
|
|
|
|
|
|
row.classList.add('hidden');
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var applyFilter = function() {
|
|
|
|
|
|
if ( reFilter === null ) {
|
|
|
|
|
|
unapplyFilter();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
var row = document.querySelector('#content tr');
|
|
|
|
|
|
if ( row === null ) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
var re = reFilter;
|
2015-03-04 00:11:32 +00:00
|
|
|
|
var target = filterTargetTestResult;
|
2015-03-03 00:48:28 +00:00
|
|
|
|
while ( row !== null ) {
|
2015-03-04 00:11:32 +00:00
|
|
|
|
if ( re.test(row.textContent) === target ) {
|
2015-03-03 00:48:28 +00:00
|
|
|
|
row.classList.remove('hidden');
|
|
|
|
|
|
} else {
|
|
|
|
|
|
row.classList.add('hidden');
|
|
|
|
|
|
}
|
|
|
|
|
|
row = row.nextSibling;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var unapplyFilter = function() {
|
|
|
|
|
|
var row = document.querySelector('#content tr');
|
|
|
|
|
|
if ( row === null ) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
while ( row !== null ) {
|
|
|
|
|
|
row.classList.remove('hidden');
|
|
|
|
|
|
row = row.nextSibling;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var onFilterButton = function() {
|
2015-03-03 04:40:41 +00:00
|
|
|
|
uDom('body').toggleClass('filterOff');
|
2015-03-03 00:48:28 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var onFilterChanged = function() {
|
2015-03-04 00:11:32 +00:00
|
|
|
|
var filterExpression = uDom('#filterExpression');
|
|
|
|
|
|
var filterRaw = filterExpression.val().trim();
|
2015-03-03 00:48:28 +00:00
|
|
|
|
|
2015-03-04 00:11:32 +00:00
|
|
|
|
// Assume good filter expression
|
|
|
|
|
|
filterExpression.removeClass('bad');
|
|
|
|
|
|
|
|
|
|
|
|
// Invert resultset?
|
|
|
|
|
|
filterTargetTestResult = filterRaw.charAt(0) !== '!';
|
|
|
|
|
|
if ( filterTargetTestResult === false ) {
|
|
|
|
|
|
filterRaw = filterRaw.slice(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// No filter
|
2015-03-03 00:48:28 +00:00
|
|
|
|
if ( filterRaw === '') {
|
|
|
|
|
|
reFilter = null;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-03-04 00:11:32 +00:00
|
|
|
|
// Regex?
|
|
|
|
|
|
if ( filterRaw.length > 1 && filterRaw.charAt(0) === '/' && filterRaw.slice(-1) === '/' ) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
reFilter = new RegExp(filterRaw.slice(1, -1));
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
reFilter = null;
|
|
|
|
|
|
filterExpression.addClass('bad');
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Plain filtering
|
2015-03-03 00:48:28 +00:00
|
|
|
|
var filterParts = filterRaw
|
2015-03-04 00:21:24 +00:00
|
|
|
|
.replace(/^\s*-(\s+|$)/, '-\xA0 ')
|
|
|
|
|
|
.replace(/^\s*\\+(\s+|$)/, '+\xA0 ')
|
2015-03-04 00:11:32 +00:00
|
|
|
|
.split(/[ \f\n\r\t\v]+/);
|
2015-03-03 00:48:28 +00:00
|
|
|
|
var n = filterParts.length;
|
|
|
|
|
|
for ( var i = 0; i < n; i++ ) {
|
|
|
|
|
|
filterParts[i] = filterParts[i].replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
|
|
|
|
}
|
|
|
|
|
|
reFilter = new RegExp(filterParts.join('.*\\s+.*'));
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
var onFilterChangedAsync = (function() {
|
|
|
|
|
|
var timer = null;
|
|
|
|
|
|
|
|
|
|
|
|
var commit = function() {
|
|
|
|
|
|
timer = null;
|
|
|
|
|
|
onFilterChanged();
|
2015-03-04 00:11:32 +00:00
|
|
|
|
applyFilter();
|
2015-03-03 00:48:28 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var changed = function() {
|
|
|
|
|
|
if ( timer !== null ) {
|
|
|
|
|
|
clearTimeout(timer);
|
|
|
|
|
|
}
|
|
|
|
|
|
timer = setTimeout(commit, 750);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return changed;
|
|
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-03-04 00:11:32 +00:00
|
|
|
|
var onMaxEntriesChanged = function() {
|
|
|
|
|
|
var raw = uDom(this).val();
|
|
|
|
|
|
try {
|
|
|
|
|
|
maxEntries = parseInt(raw, 10);
|
|
|
|
|
|
if ( isNaN(maxEntries) ) {
|
|
|
|
|
|
maxEntries = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
maxEntries = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
messager.send({
|
|
|
|
|
|
what: 'userSettings',
|
|
|
|
|
|
name: 'requestLogMaxEntries',
|
|
|
|
|
|
value: maxEntries
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
truncateLog(maxEntries);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2015-01-06 13:01:15 +00:00
|
|
|
|
uDom.onLoad(function() {
|
|
|
|
|
|
// Extract the tab id of the page we need to pull the log
|
|
|
|
|
|
var matches = window.location.search.match(/[\?&]tabId=([^&]+)/);
|
|
|
|
|
|
if ( matches && matches.length === 2 ) {
|
|
|
|
|
|
inspectedTabId = matches[1];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-03-04 00:11:32 +00:00
|
|
|
|
var onSettingsReady = function(settings) {
|
|
|
|
|
|
maxEntries = settings.requestLogMaxEntries || 0;
|
|
|
|
|
|
uDom('#maxEntries').val(maxEntries || '');
|
|
|
|
|
|
};
|
|
|
|
|
|
messager.send({ what: 'getUserSettings' }, onSettingsReady);
|
|
|
|
|
|
|
2015-01-06 13:01:15 +00:00
|
|
|
|
readLogBuffer();
|
|
|
|
|
|
|
|
|
|
|
|
uDom('#reload').on('click', reloadTab);
|
|
|
|
|
|
uDom('#clear').on('click', clearBuffer);
|
2015-03-03 00:48:28 +00:00
|
|
|
|
uDom('#filterButton').on('click', onFilterButton);
|
|
|
|
|
|
uDom('#filterExpression').on('input', onFilterChangedAsync);
|
2015-03-04 00:11:32 +00:00
|
|
|
|
uDom('#maxEntries').on('change', onMaxEntriesChanged);
|
2015-01-06 13:01:15 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
})();
|