whistle
Version:
HTTP, HTTP2, HTTPS, Websocket debugging proxy
342 lines (326 loc) • 11.7 kB
HTML
<style>html {background: #fff;}</style>
<script>
;(function() {
var config = window.whistleInspectorConfig;
var activeList = [];
var stateList = [1];
var getActiveSession;
var getSelectedSessionList;
var listenersList = [];
var frameChangeListeners = [];
var composeListeners = [];
var tabChangeListeners = [];
var curFrames = null;
var firstFrame;
var lastFrame;
var selected = true;
var composerItem;
var frameTimer;
function initState(flag) {
stateList[1] = flag;
stateList[2] = flag;
stateList[3] = flag;
}
function updateState(item) {
if (!item || item.lost || item.endTime) {
return initState(1);
}
initState();
if (item.responseTime) {
stateList[2] = 1;
}
if (item.requestTime) {
stateList[1] = 1;
}
}
function emitTabChange(_selected) {
if (selected !== _selected) {
selected = _selected;
tabChangeListeners.forEach(function(l) {
l(selected);
});
}
}
function emitFrameChange() {
var curItem = getActiveSession();
var frames = curItem && curItem.frames || null;
var hasChanged;
var listenersLen = frameChangeListeners.length;
if (curFrames !== frames) {
curFrames = frames;
hasChanged = listenersLen;
} else if (curFrames && listenersLen) {
var curLen = curFrames.length;
var len = frames.length;
hasChanged = curLen !== len || firstFrame != frames[0] || lastFrame != frames[len - 1];
}
if (hasChanged) {
if (curFrames) {
firstFrame = curFrames[0];
lastFrame = curFrames[curFrames.length - 1];
} else {
firstFrame = lastFrame = undefined;
}
frameChangeListeners.forEach(function(l) {
l(curFrames);
});
}
frameTimer = setTimeout(emitFrameChange, 1000);
}
function emitListeners(item, state) {
if (stateList[state] && item !== activeList[state]) {
activeList[state] = item;
var listeners = listenersList[state];
listeners.forEach(function(l) {
l(item);
});
}
}
function emitAll(item, hide, comItem) {
if (comItem) {
composerItem = comItem;
composeListeners.forEach(function(l) {
l(comItem);
});
return;
}
if (frameTimer) {
clearTimeout(frameTimer);
frameTimer = null;
}
if (hide) {
return emitTabChange(false);
}
emitTabChange(true);
updateState(item);
emitListeners(item, 0);
emitListeners(item, 1);
emitListeners(item, 2);
emitListeners(item, 3);
emitFrameChange();
}
window.__pushWhistle5b6af7b9884e1165SessionActive__ = emitAll;
function getAddEventHandler(state) {
state = state || 0;
listenersList[state] = [];
return function(l) {
if (typeof l !== 'function') {
return;
}
var item = getActiveSession();
emitAll(item);
activeList[state] = item;
if (stateList[state]) {
l(item);
}
var listeners = listenersList[state];
listeners.indexOf(l) === -1 && listeners.push(l);
};
}
function getRemoveEventListener(state) {
state = state || 0;
return function(l) {
var listeners = listenersList[state];
var index = listeners.indexOf(l);
index !== -1 && listeners.splice(index, 1);
};
}
function getRemoveEventListeners(state) {
state = state || 0;
return function(l) {
listenersList[state] = [];
};
}
var toast = {};
var addSessionActiveListener = getAddEventHandler();
var removeSessionActiveListener = getRemoveEventListener();
var removeSessionActiveListeners = getRemoveEventListeners();
var addSessionRequestListener = getAddEventHandler(1);
var removeSessionRequestListener = getRemoveEventListener(1);
var removeSessionRequestListeners = getRemoveEventListeners(1);
var addSessionResponseListener = getAddEventHandler(2);
var removeSessionResponseListener = getRemoveEventListener(2);
var removeSessionResponseListeners = getRemoveEventListeners(2);
var addSessionCompleteListener = getAddEventHandler(3);
var removeSessionCompleteListener = getRemoveEventListener(3);
var removeSessionCompleteListeners = getRemoveEventListeners(3);
function on(type, l) {
if (typeof l !== 'function') {
return;
}
switch(type) {
case 'sessionActive':
return addSessionActiveListener(l);
case 'sessionRequest':
return addSessionRequestListener(l);
case 'sessionResponse':
return addSessionResponseListener(l);
case 'sessionComplete':
return addSessionCompleteListener(l);
case 'tabChange':
if (tabChangeListeners.indexOf(l) === -1) {
tabChangeListeners.push(l);
}
return;
case 'frameChange':
if (frameChangeListeners.indexOf(l) === -1) {
frameChangeListeners.push(l);
}
return;
case 'compose':
if (composeListeners.indexOf(l) === -1) {
composeListeners.push(l);
}
composerItem && l(composerItem);
return;
}
}
function off(type, l) {
switch(type) {
case 'sessionActive':
if (l) {
removeSessionActiveListener(l);
} else {
removeSessionActiveListeners();
}
return;
case 'sessionRequest':
if (l) {
removeSessionRequestListener(l);
} else {
removeSessionRequestListeners();
}
return;
case 'sessionResponse':
if (l) {
removeSessionResponseListener(l);
} else {
removeSessionResponseListeners();
}
return;
case 'sessionComplete':
if (l) {
removeSessionCompleteListener(l);
} else {
removeSessionCompleteListeners();
}
return;
case 'tabChange':
if (l) {
var index = tabChangeListeners.indexOf(l);
if (index !== -1) {
tabChangeListeners.splice(index, 1);
}
} else {
tabChangeListeners = [];
}
return;
case 'frameChange':
if (l) {
var index = frameChangeListeners.indexOf(l);
if (index !== -1) {
frameChangeListeners.splice(index, 1);
}
} else {
frameChangeListeners = [];
}
return;
case 'compose':
if (l) {
var index = composeListeners.indexOf(l);
if (index !== -1) {
composeListeners.splice(index, 1);
}
} else {
composeListeners = [];
}
return;
}
}
var whistleBridge = {
config: config,
toast: toast,
on: on,
off: off,
isSelected: function() {
return selected;
},
getFrames: function() {
return curFrames;
},
addSessionActiveListener: addSessionActiveListener,
removeSessionActiveListener: removeSessionActiveListener,
removeSessionActiveListeners: removeSessionActiveListeners,
addSessionRequestListener: addSessionRequestListener,
removeSessionRequestListener: removeSessionRequestListener,
removeSessionRequestListeners: removeSessionRequestListeners,
addSessionResponseListener: addSessionResponseListener,
removeSessionResponseListener: removeSessionResponseListener,
removeSessionResponseListeners: removeSessionResponseListeners,
addSessionCompleteListener: addSessionCompleteListener,
removeSessionCompleteListener: removeSessionCompleteListener,
removeSessionCompleteListeners: removeSessionCompleteListeners
};
try {
window.parent.onWhistleInspectorCustomTabReady(function(options) {
Object.keys(options.msgBox).forEach(function(name) {
toast[name] = options.msgBox[name];
});
getActiveSession = options.getActiveSession;
getSelectedSessionList = options.getSelectedSessionList;
whistleBridge.showOption = options.showOption;
whistleBridge.hideOption = options.hideOption;
whistleBridge.updateUI = options.updateUI;
whistleBridge.copyText = options.copyText;
whistleBridge.pageId = options.pageId;
whistleBridge.compose = options.compose;
whistleBridge.composeInterrupt = options.createComposeInterrupt();
whistleBridge.getWhistleId = options.getWhistleId;
whistleBridge.hasWhistleToken = options.hasWhistleToken;
whistleBridge.decodeBase64 = options.decodeBase64;
whistleBridge.joinBase64 = options.joinBase64;
whistleBridge.getReqId = options.getReqId;
whistleBridge.onComposeData = options.onComposeData;
whistleBridge.offComposeData = options.offComposeData;
whistleBridge.importSessions = options.importSessions;
whistleBridge.exportSessions = options.exportSessions;
whistleBridge.importMockData = options.importMockData;
whistleBridge.download = options.download;
whistleBridge.setNetworkSettings = options.setNetworkSettings;
whistleBridge.setRulesSettings = options.setRulesSettings;
whistleBridge.setValuesSettings = options.setValuesSettings;
whistleBridge.setComposerData = options.setComposerData;
whistleBridge.showHttpsSettings = options.showHttpsSettings;
whistleBridge.showCustomCerts = options.showCustomCerts;
whistleBridge.uploadCustomCerts = options.uploadCustomCerts;
whistleBridge.showNetwork = options.showNetwork;
whistleBridge.showRules = options.showRules;
whistleBridge.showValues = options.showValues;
whistleBridge.showPlugins = options.showPlugins;
whistleBridge.showService = options.showService;
whistleBridge.hideService = options.hideService;
whistleBridge.getInstalledPlugins = options.getInstalledPlugins;
whistleBridge.showInstallPlugins = options.showInstallPlugins;
whistleBridge.showUpdatePlugins = options.showUpdatePlugins;
whistleBridge.readFileAsText = options.readFileAsText;
whistleBridge.readFileAsBase64 = options.readFileAsBase64;
whistleBridge.getVersion = options.getVersion;
whistleBridge.request = options.request;
whistleBridge.createRequest = options.createRequest;
whistleBridge.parseRules = options.parseRules;
whistleBridge.showModal = options.showModal;
whistleBridge.getSelectedSessionList = getSelectedSessionList;
whistleBridge.getActiveSession = whistleBridge.getSession = whistleBridge.getSelectedSession = getActiveSession;
whistleBridge.importRules = options.importRules;
whistleBridge.importValues = options.importValues;
whistleBridge.getServerInfo = options.getServerInfo;
whistleBridge.alert = options.alert;
whistleBridge.confirm = options.confirm;
whistleBridge.syncData = options.syncData;
whistleBridge.syncRules = options.syncRules;
whistleBridge.syncValues = options.syncValues;
}, window);
} catch (e) {}
window.whistleBridge = whistleBridge;
})();
</script>