From 60239ecdcd604915647bac03ecee8589e6a3b9e8 Mon Sep 17 00:00:00 2001 From: jeanNimb <57364169+jeanNimb@users.noreply.github.com> Date: Fri, 29 Jul 2022 14:08:41 +0200 Subject: [PATCH 01/13] GH #236: removed usage of moment.js from resultbrowser.js * removed usage of moment.js from resultbrowser.js * GTM time now shows also milliseconds Co-authored-by: Benjamin Ortmann --- resultbrowser/src/index.html | 1 - resultbrowser/src/js/moment-2.24.0.js | 1 - resultbrowser/src/js/resultbrowser.js | 445 +++++++++++++------------- 3 files changed, 225 insertions(+), 222 deletions(-) delete mode 100644 resultbrowser/src/js/moment-2.24.0.js diff --git a/resultbrowser/src/index.html b/resultbrowser/src/index.html index 1b57f4c27..1810b98ad 100644 --- a/resultbrowser/src/index.html +++ b/resultbrowser/src/index.html @@ -8,7 +8,6 @@ - diff --git a/resultbrowser/src/js/moment-2.24.0.js b/resultbrowser/src/js/moment-2.24.0.js deleted file mode 100644 index 5787a4085..000000000 --- a/resultbrowser/src/js/moment-2.24.0.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function h(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n>>0,s=0;sSe(e)?(r=e+1,o-Se(e)):(r=e,o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(Se(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),C("week","w"),C("isoWeek","W"),F("week",5),F("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=D(e)});function je(e,t){return e.slice(t,7).concat(e.slice(0,t))}I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),C("day","d"),C("weekday","e"),C("isoWeekday","E"),F("day",11),F("weekday",11),F("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=D(e)});var Ze="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var $e="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var qe=ae;var Je=ae;var Be=ae;function Qe(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=he(o[t]),u[t]=he(u[t]),l[t]=he(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Xe(){return this.hours()%12||12}function Ke(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function et(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Xe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Xe.apply(this)+L(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Xe.apply(this)+L(this.minutes(),2)+L(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+L(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+L(this.minutes(),2)+L(this.seconds(),2)}),Ke("a",!0),Ke("A",!1),C("hour","h"),F("hour",13),ue("a",et),ue("A",et),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=D(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=D(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i))});var tt,nt=Te("Hours",!0),st={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ce,monthsShort:He,week:{dow:0,doy:6},weekdays:Ze,weekdaysMin:$e,weekdaysShort:ze,meridiemParse:/[ap]\.?m?\.?/i},it={},rt={};function at(e){return e?e.toLowerCase().replace("_","-"):e}function ot(e){var t=null;if(!it[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=tt._abbr,require("./locale/"+e),ut(t)}catch(e){}return it[e]}function ut(e,t){var n;return e&&((n=l(t)?ht(e):lt(e,t))?tt=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),tt._abbr}function lt(e,t){if(null===t)return delete it[e],null;var n,s=st;if(t.abbr=e,null!=it[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=it[e]._config;else if(null!=t.parentLocale)if(null!=it[t.parentLocale])s=it[t.parentLocale]._config;else{if(null==(n=ot(t.parentLocale)))return rt[t.parentLocale]||(rt[t.parentLocale]=[]),rt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return it[e]=new P(x(s,t)),rt[e]&&rt[e].forEach(function(e){lt(e.name,e.config)}),ut(e),it[e]}function ht(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return tt;if(!o(e)){if(t=ot(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r=t&&a(i,n,!0)>=t-1)break;t--}r++}return tt}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11Pe(n[me],n[_e])?ye:n[ge]<0||24Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ct(e._a[me],s[me]),(e._dayOfYear>Se(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[ve]&&0===e._a[pe]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var mt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yt=/Z|[+-]\d\d(?::?\d\d)?/,gt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],vt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function wt(e){var t,n,s,i,r,a,o=e._i,u=mt.exec(o)||_t.exec(o);if(u){for(g(e).iso=!0,t=0,n=gt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},mn.isUtc=Et,mn.isUTC=Et,mn.zoneAbbr=function(){return this._isUTC?"UTC":""},mn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},mn.dates=n("dates accessor is deprecated. Use date instead.",un),mn.months=n("months accessor is deprecated. Use month instead",Ue),mn.years=n("years accessor is deprecated. Use year instead",Oe),mn.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),mn.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Ot(e))._a){var t=e._isUTC?y(e._a):bt(e._a);this._isDSTShifted=this.isValid()&&0').appendTo('head'); - cachedScript(protocol+'//xlt.xceptance.com/static/highlightjs/7.5/highlight.min.js').fail(function(){ + $('').appendTo('head'); + cachedScript(protocol + '//xlt.xceptance.com/static/highlightjs/7.5/highlight.min.js').fail(function () { extras.highlight = false; }); - cachedScript(protocol+'//xlt.xceptance.com/static/beautify/20140610-bdf3c2e743/beautify-min.js').fail(function(){ + cachedScript(protocol + '//xlt.xceptance.com/static/beautify/20140610-bdf3c2e743/beautify-min.js').fail(function () { extras.beautify.js = false; }); - cachedScript(protocol+'//xlt.xceptance.com/static/beautify/20140610-bdf3c2e743/beautify-html-min.js').fail(function(){ + cachedScript(protocol + '//xlt.xceptance.com/static/beautify/20140610-bdf3c2e743/beautify-html-min.js').fail(function () { extras.beautify.html = false; }); - cachedScript(protocol+'//xlt.xceptance.com/static/beautify/20140610-bdf3c2e743/beautify-css-min.js').fail(function(){ + cachedScript(protocol + '//xlt.xceptance.com/static/beautify/20140610-bdf3c2e743/beautify-css-min.js').fail(function () { extras.beautify.css = false; }); - localTimeZone = (function(){ + localTimeZone = (function () { var dateString = new Date().toString(), zone = dateString.match(/\(([^\(]+)\)$/) || dateString.match(/(GMT[-+0-9]*)/); @@ -95,8 +95,8 @@ // Check for presence of HAR file by simply loading it via AJAX // -> In case AJAX call fails, HAR file is assumed to be missing // and 'View as HAR' link will be visually hidden - $.ajax({ url: 'data.har', dataType: 'json' }).fail(function(){ - $('.har', $transaction).hide(); + $.ajax({ url: 'data.har', dataType: 'json' }).fail(function () { + $('.har', $transaction).hide(); }); initEvents(); @@ -104,76 +104,76 @@ function initEvents() { var $highlight = $('#highlightSyntax'), - $beautify = $('#beautify'); + $beautify = $('#beautify'); - if(extras.highlight) { - $highlight.click(function(){ - $requestText.each(function(i, e) { + if (extras.highlight) { + $highlight.click(function () { + $requestText.each(function (i, e) { hljs.highlightBlock(e) }); }).removeAttr('disabled'); } - if(extras.beautify.js || extras.beautify.css || extras.beautify.html) { - $beautify.click(function(){ + if (extras.beautify.js || extras.beautify.css || extras.beautify.html) { + $beautify.click(function () { var s = $requestText.text(); // CSS - if($requestText.hasClass('css')) { + if ($requestText.hasClass('css')) { try { s = css_beautify(s); } - catch(e){} + catch (e) { } } // Javascript / JSON - else if($requestText.hasClass('javascript')) { + else if ($requestText.hasClass('javascript')) { try { s = js_beautify(s); } - catch(e){} + catch (e) { } } // HTML - else if($requestText.hasClass('html') || $requestText.hasClass('xml')) { + else if ($requestText.hasClass('html') || $requestText.hasClass('xml')) { try { s = html_beautify(s, { - preserve_newlines : false, - wrap_line_length : 0 + preserve_newlines: false, + wrap_line_length: 0 }); } - catch(e){} + catch (e) { } } $requestText.text(s); }).removeAttr('disabled'); } - $('#selectResponseContent').unbind("click").click(function() { - document.getSelection().selectAllChildren($requestText.get(0)); + $('#selectResponseContent').unbind("click").click(function () { + document.getSelection().selectAllChildren($requestText.get(0)); }); // menu button $menuIcon.click(showMenu); - $(document).click(function(e){ + $(document).click(function (e) { var x = e.target; - if($(x).parents('#menu').length === 0 && x.id != "menu-icon") { - if($menu.hasClass("open")) { + if ($(x).parents('#menu').length === 0 && x.id != "menu-icon") { + if ($menu.hasClass("open")) { showMenu(); } } }); - $('#contentTypeFilter input').change(function(event, handler){ + $('#contentTypeFilter input').change(function (event, handler) { var checkbox = event.target; var type = checkbox.getAttribute('name'); filterRequestsByContentType(type); }); - $('#requestMethodFilter input').change(function(event, handler){ + $('#requestMethodFilter input').change(function (event, handler) { var checkbox = event.target; var type = checkbox.getAttribute('name'); filterRequestsByMethod(type); }); - $('#protocolFilter input').change(function(event, handler){ + $('#protocolFilter input').change(function (event, handler) { var checkbox = event.target; var type = checkbox.getAttribute('name'); filterRequestsByProtocol(type); @@ -183,13 +183,13 @@ $transaction.click(showTransaction); // JSON viewer - $('#jsonViewerActions .expandAll').click(function(event, handler) { jsonView.expandAll(); }); - $('#jsonViewerActions .collapseAll').click(function(event, handler) { jsonView.collapseAll(); }); + $('#jsonViewerActions .expandAll').click(function (event, handler) { jsonView.expandAll(); }); + $('#jsonViewerActions .collapseAll').click(function (event, handler) { jsonView.collapseAll(); }); $('#jsonViewerActions .search').keyup(search); $('#jsonViewerActions .ignoreCase').click(search); $('#jsonViewerActions .filter').click(search); - $('#jsonViewerActions .previous').click(function(event, handler) { jsonView.highlightNextMatch(false); }); - $('#jsonViewerActions .next').click(function(event, handler) { jsonView.highlightNextMatch(true); }); + $('#jsonViewerActions .previous').click(function (event, handler) { jsonView.highlightNextMatch(false); }); + $('#jsonViewerActions .next').click(function (event, handler) { jsonView.highlightNextMatch(true); }); } function search() { @@ -217,7 +217,7 @@ return $('
').text(value).html(); } - function trim(str){ + function trim(str) { str = str || ''; return str.replace(/^\s+|\s+$/g, ''); } @@ -231,9 +231,9 @@ $element.addClass("active"); // update and show action content iframe - var data = $element.data("json"), + var data = $element.data("json"), actionFile = data.fileName; - if(actionFile) { + if (actionFile) { $actionContent.attr('src', actionFile); toggleContent($actionContent); } @@ -242,7 +242,7 @@ } } - if(!$element.hasClass("current")) { + if (!$element.hasClass("current")) { $(".current", $actionlist).removeClass("current"); $element.addClass("current"); } @@ -263,9 +263,9 @@ function createRequestsForAction(actionElement) { // build requests element - var requests = $('
    '), + var requests = $('
      '), $actionElement = $(actionElement), - action = $actionElement.data('json'), + action = $actionElement.data('json'), actionRequests = action && action.requests || []; $actionElement.append(requests); @@ -274,7 +274,7 @@ requests.hide(); // ok, we have to add the data from the json object to it - for ( var i = 0, l = actionRequests.length; i < l; i++) { + for (var i = 0, l = actionRequests.length; i < l; i++) { var request = actionRequests[i]; var name = request.name; var contentTypeClass = determineContentTypeClass(request.mimeType, request.responseCode); @@ -282,21 +282,21 @@ var title = "[" + request.responseCode + "] " + request.url; var requestElement = $('
    • ' + htmlEncode(name) + '
    • '); + + ' ' + htmlEncode(request.requestMethod) + ' ' + htmlEncode(protocolClass) + '">' + htmlEncode(name) + ''); // store the json object for later requestElement.data("json", request) - // attach listeners at action's name - .children('.name') - // setup onclick to show request content - .click( function(event) { - showRequest(this.parentNode); - event.stopPropagation(); - }) - // setup ondblclick to do nothing - .dblclick( function(event) { - event.stopPropagation(); - }); + // attach listeners at action's name + .children('.name') + // setup onclick to show request content + .click(function (event) { + showRequest(this.parentNode); + event.stopPropagation(); + }) + // setup ondblclick to do nothing + .dblclick(function (event) { + event.stopPropagation(); + }); // insert into DOM requests.append(requestElement); @@ -328,10 +328,10 @@ function determineProtocolClass(url) { // url starts with 'https' - if(url.lastIndexOf('https', 0) === 0) { + if (url.lastIndexOf('https', 0) === 0) { return "HTTPS"; } - else if(url.lastIndexOf('http', 0) === 0) { + else if (url.lastIndexOf('http', 0) === 0) { return "HTTP"; } else { @@ -351,22 +351,22 @@ table.append(tableRow); } else { - for(var i = 0; i < kvLength; i++) { - var kv = keyValueArray[i], - name = htmlEncode(kv.name_), + for (var i = 0; i < kvLength; i++) { + var kv = keyValueArray[i], + name = htmlEncode(kv.name_), value = kv.value_ || ''; - if(isRequestHeaderTable && name.toLowerCase() === "cookie") { - value = value.split(";").map(function(e){ + if (isRequestHeaderTable && name.toLowerCase() === "cookie") { + value = value.split(";").map(function (e) { var idx = e.indexOf('='), cname = idx < 0 ? e : e.substring(0, idx), - cvalue = idx < 0 || idx > e.length-1 ? '' : e.substring(idx+1); - return [ cname, cvalue ].map(trim).map(htmlEncode); - }) - .sort(function(a,b){ return a=a[0].toLowerCase(),b=b[0].toLowerCase(),a'+e[0]+'='+e[1]+'
      '; + cvalue = idx < 0 || idx > e.length - 1 ? '' : e.substring(idx + 1); + return [cname, cvalue].map(trim).map(htmlEncode); }) - .join(''); + .sort(function (a, b) { return a = a[0].toLowerCase(), b = b[0].toLowerCase(), a < b ? -1 : b < a ? 1 : 0 }) + .map(function (e) { + return '
      ' + e[0] + '=' + e[1] + '
      '; + }) + .join(''); } else { value = htmlEncode(value); @@ -420,30 +420,30 @@ $('#beautify, #selectResponseContent, #highlightSyntax').prop('disabled', true); // check if we have no response or it was empty - if(requestData._noContent) { + if (requestData._noContent) { $requestText.text('').show(); } else { // update the text, load it from file $.ajax({ - url : requestData.fileName, - dataType : 'text', - success : function(data) { - var subMime = requestData.mimeType.substring(requestData.mimeType.indexOf('/')+1), + url: requestData.fileName, + dataType: 'text', + success: function (data) { + var subMime = requestData.mimeType.substring(requestData.mimeType.indexOf('/') + 1), lang = /x?html/.test(subMime) ? 'html' : /xml/.test(subMime) ? 'xml' : /(javascript|json)$/.test(subMime) ? 'javascript' : /^css$/.test(subMime) ? 'css' : undefined, - canBeautify = lang && (( /(ht|x)ml/.test(lang) && extras.beautify.html ) || ( 'javascript' === lang && extras.beautify.js) || ('css' === lang && extras.beautify.css)); + canBeautify = lang && ((/(ht|x)ml/.test(lang) && extras.beautify.html) || ('javascript' === lang && extras.beautify.js) || ('css' === lang && extras.beautify.css)); $('#beautify').prop('disabled', !canBeautify); $('#selectResponseContent').prop('disabled', false); $('#highlightSyntax').prop('disabled', !extras.highlight); - $requestText.text(data).removeClass().addClass(lang ? ('language-'+lang+' '+lang) : 'text').show(); + $requestText.text(data).removeClass().addClass(lang ? ('language-' + lang + ' ' + lang) : 'text').show(); // feed the json viewer if the mime type indicates json-ish content (e.g. "application/json" or "application/<...>+json") if (/^application\/(.+\+)?json$/.test(requestData.mimeType)) { jsonView.format(data, '#jsonViewerContent'); } }, - error : function(xhr,textStatus,errorThrown) { + error: function (xhr, textStatus, errorThrown) { $requestText.hide(); $('#errorMessage .filename').text(requestData.fileName); $('#errorMessage').show(); @@ -454,7 +454,7 @@ } // update the request information tab - $("#url").empty().append($('').attr('href', requestData.url).attr('target','_blank').text(requestData.url)); + $("#url").empty().append($('').attr('href', requestData.url).attr('target', '_blank').text(requestData.url)); $("#requestmethod").text(requestData.requestMethod); // start time @@ -469,7 +469,7 @@ // show either the request body or the POST parameters var bodyRaw = requestData.requestBodyRaw || ''; - if(bodyRaw.length > 0) { + if (bodyRaw.length > 0) { // request body $('textarea', $requestBodySmall).text(bodyRaw); $requestBodySmall.show(); @@ -480,7 +480,7 @@ var isPost = requestData.requestMethod === "POST"; $postRequestParam.toggle(isPost); $requestBodySmall.hide(); - } + } // update the request content tab $("#requestbody").text(requestData.requestBodyRaw || ''); @@ -495,53 +495,58 @@ toggleContent($requestContent); } - if(!$action.hasClass("current")) { + if (!$action.hasClass("current")) { $(".current", $actionlist).removeClass("current"); $action.addClass("current"); } } - function parseStatusLine(status){ - var statusMessage = "n/a"; + function parseStatusLine(status) { + var statusMessage = "n/a"; - if(status) { - var match = status.match(/(\d{3})[- ]+(.+)/); + if (status) { + var match = status.match(/(\d{3})[- ]+(.+)/); - if(match) { - statusMessage = (match.length > 1 ? match[1] : "n/a"); - statusMessage += (" - "+ (match.length > 2 ? match[2] : "n/a")); + if (match) { + statusMessage = (match.length > 1 ? match[1] : "n/a"); + statusMessage += (" - " + (match.length > 2 ? match[2] : "n/a")); + } } - } - return statusMessage; + return statusMessage; } function formatDate(date, toGmt) { - var d = moment(date), - tz = toGmt ? "UTC" : localTimeZone; + let year, month, day, hours, minutes, seconds, appendix; - if(toGmt) { - d.utc(); + if (toGmt) { + year = date.getUTCFullYear(); + month = String(date.getUTCMonth() + 1).padStart(2, 0); + day = String(date.getUTCDate()).padStart(2, 0); + hours = String(date.getUTCHours()).padStart(2, 0); + minutes = String(date.getUTCMinutes()).padStart(2, 0); + seconds = String(date.getUTCSeconds()).padStart(2, 0); + appendix = `.${date.getUTCMilliseconds()} [GMT]`; } - - var result = d.format(); - - result = result.replace("T", " "); - result = result.replace(/\+.*/, ("."+d.format("SSS"))); - - if(tz) { - result = result + " [" + tz + "]"; + else { + year = date.getFullYear(); + month = String(date.getMonth() + 1).padStart(2, 0); + day = String(date.getDate()).padStart(2, 0); + hours = String(date.getHours()).padStart(2, 0); + minutes = String(date.getMinutes()).padStart(2, 0); + seconds = String(date.getSeconds()).padStart(2, 0); + appendix = `.${date.getMilliseconds()} [${localTimeZone}]`; } - return result; + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}${appendix}`; } function centerErrorMessage() { var content = $content, - height = Math.floor(0.333 * content.height()), - width = content.width() - 700; + height = Math.floor(0.333 * content.height()), + width = content.width() - 700; - $('#errorMessage, #errorNoPage').css({ position: 'absolute', left: width/2 + 'px', top: height/2 + 'px' }); + $('#errorMessage, #errorNoPage').css({ position: 'absolute', left: width / 2 + 'px', top: height / 2 + 'px' }); } /* @@ -549,12 +554,12 @@ */ function resizeContent() { var height = $window.height(), // get the current viewport size - leftPos = parseInt($content.css('left').replace(/px/,'')); // and left position of content area + leftPos = parseInt($content.css('left').replace(/px/, '')); // and left position of content area // resize navigation resizeNav(height); // .. and content area - $content.height(height).width($window.width()-leftPos); + $content.height(height).width($window.width() - leftPos); // finally, center error message centerErrorMessage(); @@ -562,34 +567,34 @@ function resizeNav(winHeight) { winHeight = winHeight || $window.height(); - $actionlist.height(winHeight-navTopOffset-15 - $transaction.height()); + $actionlist.height(winHeight - navTopOffset - 15 - $transaction.height()); $leftSideMenu.height(winHeight); $('.vsplitbar').height(winHeight); } function preprocessRequests(requests) { - function kvSort(a,b) { + function kvSort(a, b) { var aName = a.name_, bName = b.name_; - if(aName < bName) return -1; - if(aName > bName) return 1; + if (aName < bName) return -1; + if (aName > bName) return 1; return 0; } function checkHasNoContent(rqData) { rqData = rqData || {}; - var headers = rqData.responseHeaders || [], + var headers = rqData.responseHeaders || [], respCode = rqData.responseCode || 0; // check for redirect (response file is empty and will cause an error when trying to be read in) // and zero content length response header as well - if(/30[0-8]|20[45]/.test(respCode) || !rqData.fileName) { + if (/30[0-8]|20[45]/.test(respCode) || !rqData.fileName) { return true; } - for(var i = 0, l = headers.length, h; i < l; i++) { + for (var i = 0, l = headers.length, h; i < l; i++) { h = headers[i]; - if(h.name_ === "Content-Length") { + if (h.name_ === "Content-Length") { return h.value_ === "0"; } } @@ -601,15 +606,15 @@ param = param || ''; var kv = param.split('=').map(decodeQPNameOrValue), - r = null; - if(kv && kv.length > 0) { - r = { - name_ : kv[0], - value_ : kv.length > 1 ? kv.slice(1).join('=') : '' - }; - } + r = null; + if (kv && kv.length > 0) { + r = { + name_: kv[0], + value_: kv.length > 1 ? kv.slice(1).join('=') : '' + }; + } - return r; + return r; } function decodeQPNameOrValue(nameOrValue) { @@ -617,12 +622,12 @@ try { nameOrValue = decodeURIComponent(nameOrValue); } - catch(e) { - if(typeof(window.unescape) === 'function') { + catch (e) { + if (typeof (window.unescape) === 'function') { try { nameOrValue = window.unescape(nameOrValue); } - catch(e2){} + catch (e2) { } } } return nameOrValue; @@ -632,16 +637,16 @@ str = str || ''; var params = []; - if(str.length > 0) { + if (str.length > 0) { params = str.split('&') - // transform into decoded name/value pairs - .map(decodeQueryParam) - // filter out nulls and empty names - .filter(function(e) { - return !!e && e.name_.length; - }) - // and sort it - .sort(kvSort); + // transform into decoded name/value pairs + .map(decodeQueryParam) + // filter out nulls and empty names + .filter(function (e) { + return !!e && e.name_.length; + }) + // and sort it + .sort(kvSort); } return params; } @@ -652,23 +657,23 @@ var body = rqData.requestBodyRaw || '', method = rqData.requestMethod, params = rqData.requestParameters, - isUrlEncoded = rqData.requestHeaders.some(function(e){ + isUrlEncoded = rqData.requestHeaders.some(function (e) { var n = e.name_.toLowerCase(), v = (e.value_ || '').toLowerCase(); return n === 'content-type' && v === 'application/x-www-form-urlencoded'; }); - if(method === 'POST' && isUrlEncoded && body.length > 0) { + if (method === 'POST' && isUrlEncoded && body.length > 0) { body = body.split('\n'); - body = body[body.length-1]; + body = body[body.length - 1]; - parseParams(body).forEach(function(p){ + parseParams(body).forEach(function (p) { params.push(p) }); } } var l = requests && requests.length; - for(var i = 0, r; i < l; i++) { + for (var i = 0, r; i < l; i++) { r = requests[i]; r._noContent = checkHasNoContent(r); parsePostBodyIfNecessary(r); @@ -681,8 +686,8 @@ idx = url.indexOf('?'), hIdx = url.indexOf('#'), params = []; - if(idx > 0 && (hIdx < 0 || idx < hIdx)) { - var qs = url.substring(idx+1, (hIdx < 0 ? url.length : hIdx)); + if (idx > 0 && (hIdx < 0 || idx < hIdx)) { + var qs = url.substring(idx + 1, (hIdx < 0 ? url.length : hIdx)); params = parseParams(qs); } @@ -692,23 +697,23 @@ } var filters = { - type : { - variants : ["contentTypeCSS", "contentTypeImage", "httpError", "contentTypeJS", "httpRedirect", "contentTypeOther"], - category : "#contentTypeFilter", - requestMarker : "contentTypeFiltered", - all : "all" + type: { + variants: ["contentTypeCSS", "contentTypeImage", "httpError", "contentTypeJS", "httpRedirect", "contentTypeOther"], + category: "#contentTypeFilter", + requestMarker: "contentTypeFiltered", + all: "all" }, - method : { - variants : ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE", "CONNECT", "PATCH"], - category : "#requestMethodFilter", - requestMarker : "methodFiltered", - all : "all" + method: { + variants: ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE", "CONNECT", "PATCH"], + category: "#requestMethodFilter", + requestMarker: "methodFiltered", + all: "all" }, - protocol : { - variants : ["HTTP", "HTTPS"], - category : "#protocolFilter", - requestMarker : "protocolFiltered", - all : "all" + protocol: { + variants: ["HTTP", "HTTPS"], + category: "#protocolFilter", + requestMarker: "protocolFiltered", + all: "all" } }; @@ -725,25 +730,25 @@ } function filterRequests(selection, filter) { - if(!selection) { - filter.variants.forEach(function(type) { + if (!selection) { + filter.variants.forEach(function (type) { filterRequests(type, filter); }); } else { - var checked = $(filter.category+" .filter-"+selection+" input").prop('checked'); - if(filter.all && selection==filter.all) { - filter.variants.forEach(function(type) { + var checked = $(filter.category + " .filter-" + selection + " input").prop('checked'); + if (filter.all && selection == filter.all) { + filter.variants.forEach(function (type) { // set all other checkboxes accordingly - $(filter.category+" .filter-"+type+" input").prop('checked', checked); + $(filter.category + " .filter-" + type + " input").prop('checked', checked); // update requests filterRequests(type, filter); }); } else { - var requests = $("#actionlist .requests .request ."+selection).parent(); - if(checked) { + var requests = $("#actionlist .requests .request ." + selection).parent(); + if (checked) { requests.removeClass(filter.requestMarker); } else { @@ -751,11 +756,11 @@ } } - if(filter.all) { - var checkALL = checked && !filter.variants.some(function(variant){ - return !$(filter.category + " .filter-" + variant + " input").prop('checked'); + if (filter.all) { + var checkALL = checked && !filter.variants.some(function (variant) { + return !$(filter.category + " .filter-" + variant + " input").prop('checked'); }); - $(filter.category+" .filter-"+filter.all+" input").prop('checked', checkALL); + $(filter.category + " .filter-" + filter.all + " input").prop('checked', checkALL); } } } @@ -763,18 +768,18 @@ function showMenu() { var open = "open"; - if($menu.hasClass(open)) { + if ($menu.hasClass(open)) { $menu.hide(); } else { - var menuIconPos = $menuIcon.position(); - $menu.css({ - position: "absolute", - top: (menuIconPos.top + $menuIcon.outerHeight())+"px", - left: (menuIconPos.left + 7)+"px", - "z-index": 200001, - }) - .show(); + var menuIconPos = $menuIcon.position(); + $menu.css({ + position: "absolute", + top: (menuIconPos.top + $menuIcon.outerHeight()) + "px", + left: (menuIconPos.left + 7) + "px", + "z-index": 200001, + }) + .show(); } $menu.toggleClass(open); @@ -783,7 +788,7 @@ function loadJSON() { // get the json data from the external file var transaction = jsonData, - actions = transaction.actions; + actions = transaction.actions; document.title = transaction.user + " - XLT Result Browser"; @@ -792,32 +797,32 @@ var $actions = $('
        '); $actions.hide(); - for ( var i = 0, l = actions.length; i < l; i++) { + for (var i = 0, l = actions.length; i < l; i++) { var action = actions[i]; var $actionElement = $('
      • ' + htmlEncode(action.name) + '
      • '); // store the json object for later $actionElement.data("json", action) - // attach listeners at action's name - .children('.name') - // setup onclick to show action content - .click( function(event) { - showAction(this.parentNode); - }) - // setup ondblclick to show/hide requests - .dblclick( function(event) { - expandCollapseAction(this.parentNode); - }); + // attach listeners at action's name + .children('.name') + // setup onclick to show action content + .click(function (event) { + showAction(this.parentNode); + }) + // setup ondblclick to show/hide requests + .dblclick(function (event) { + expandCollapseAction(this.parentNode); + }); // setup click to show/hide requests - $('.expander', $actionElement).click( function(event) { + $('.expander', $actionElement).click(function (event) { expandCollapseAction(this.parentNode); }) - // setup ondblclick to do nothing since a dblclick causes the following event sequence to be dispatched: - // dblclick ::= click -> click -> dblclick - .dblclick( function(event) { - event.stopPropagation(); - }); + // setup ondblclick to do nothing since a dblclick causes the following event sequence to be dispatched: + // dblclick ::= click -> click -> dblclick + .dblclick(function (event) { + event.stopPropagation(); + }); // insert into DOM $actions.append($actionElement); @@ -837,7 +842,7 @@ } // the on load setup - $(document).ready( function() { + $(document).ready(function () { init(); var $progress = $('#progressmeter'); @@ -849,13 +854,13 @@ // take care of the size of the content display area to // adjust it to the window size - $(window).bind("resize", function(event) { + $(window).bind("resize", function (event) { resizeContent(); }); // setup onclick for the tabbed panel in the request content // area - $('.tabs-nav li', $requestContent).click( function(event) { + $('.tabs-nav li', $requestContent).click(function (event) { activateTab(this); }); @@ -871,7 +876,7 @@ $('li.action > span.name', $actionlist).eq(0).click(); } finally { - $progress.hide(200); + $progress.hide(200); } }); From be82d4091236ebf6f0434ccab399bf4383f9d63a Mon Sep 17 00:00:00 2001 From: jeanNimb <57364169+jeanNimb@users.noreply.github.com> Date: Wed, 3 Aug 2022 08:16:20 +0200 Subject: [PATCH 02/13] 235 resultbrowser replace jquery with native browser api (#241) * formatting file correctly * exchanged access to $transaction element * refactor complete (needs to remove jquery in index.html) * proposal for getting beautify and highlight scripts * removed optional chaining due to bundling errors * removed unused variables * removed jquery from index.html * clean up of refactored code * added licence text to split.min.js content * removed unnecessary TODOs * added lang attribute to html tags * fixed flashing on page load and insert accidentally removed resultbrowser.js * merge conflicts resolved * spaces between child combinators * split.min.js ends with new line * removed unnecessary lookup for element * removed unnecessary moment.js script tag in index.html * inserted final new line at end of file * exchanged let for const, if possible * imporved variable naming * formatting of index.html * usage of array prototype forEach for iterating over Nodelist * exchanged forEach() with Array.prototype.forEach() * formatting index.html * added alias names for common functions * exchange usage of disable property by disable attribute * generalised function for button disabling * attach listener for highlight and beutify only if function is available * usage of Array.prototype.filter() for filtering Nodelists * minor changes of MR 241 * default.css ends now with new line * removed unnecessary :scope pseudo selector * MR 241 Co-authored-by: Benjamin Ortmann --- resultbrowser/src/css/default.css | 119 ++-- resultbrowser/src/harviewer.html | 17 +- resultbrowser/src/index.html | 338 +++++----- resultbrowser/src/js/resultbrowser.js | 841 ++++++++++++++---------- resultbrowser/src/js/simple-splitter.js | 8 - resultbrowser/src/js/split.min.js | 14 + 6 files changed, 766 insertions(+), 571 deletions(-) delete mode 100644 resultbrowser/src/js/simple-splitter.js create mode 100644 resultbrowser/src/js/split.min.js diff --git a/resultbrowser/src/css/default.css b/resultbrowser/src/css/default.css index 983fd37d2..a49d81667 100644 --- a/resultbrowser/src/css/default.css +++ b/resultbrowser/src/css/default.css @@ -3,7 +3,8 @@ margin: 0px; } -html { /* get rid of the default vertical scroll bar in IE */ +html { + /* get rid of the default vertical scroll bar in IE */ overflow: auto; } @@ -15,7 +16,7 @@ body { } #wrapper { - height: 100vh !important; + height: 100vh !important; } @@ -23,42 +24,37 @@ body { * The header */ #header { - width: 100%; - position:fixed; -} - -#header h1 { - font-size: 16px; - color: white; + background-color: #A50000; } #header .logo { padding: 5px; - background-color: #A50000; } #header .logo img { - float: left; background-color: white; margin-right: 10px; padding: 5px; box-shadow: 0 0 2px 1px white; } +#header .logo h1 { + font-size: 16px; + color: white; +} + /* * The progress meter look and feel */ #progressmeter { - display: none; background-image: url(data-url:../images/progress.gif); width: 24px; height: 24px; - float: right; margin: 2px; } #progressmeter p { - display: none; + padding: 9px; } @@ -75,7 +71,6 @@ body { #menu { padding: 0px; margin: 0px; - display: none; font-size: small; border: 1px solid gray; background-color: white; @@ -109,7 +104,7 @@ body { } #menu .menu-group-head { - background-color:#E5E5E5; + background-color: #E5E5E5; padding: 0.5em 1em 0.5em 0.5em; margin-left: -0.5em; } @@ -124,7 +119,7 @@ body { margin-bottom: 1em; } -#menu li .selectable { +#menu li .selectable { margin-right: 0.3em; } @@ -178,9 +173,7 @@ body { * The navigation with actions and requests */ #navigation { - position:absolute; font-size: 12px; - /*z-index: -1;*/ width: 100%; margin: 0px; padding: 0px; @@ -290,20 +283,24 @@ body { } #leftSideMenu { - width: 275px; + background-color: white; + min-width: 280px; } #content { background-color: white; - position:fixed !important; - top: 0px; - left: 256px; - height:100%; + height: 100%; } -#actioncontent, #postrequestparameters, #requestBodySmall { - display: none; +#actioncontent { + height: 100%; +} + +#postrequestparameters, +#requestBodySmall { + width: 100%; + height: 100%; } #requestBodySmall > textarea { @@ -319,11 +316,7 @@ body { white-space: pre-wrap; } -#requestcontent { /* take the whole space of parent */ - width: 100%; - height: 100%; - display: none; -} +#requestcontent {} h1 { font-size: 14pt; @@ -429,10 +422,6 @@ table.key-value-table td.value .csep { } .tabs .tabs-nav { - position: absolute; - top: 0px; - left: 0px; - right: 0px; height: auto; overflow: visible; border-bottom: 1px solid #aaa; @@ -466,20 +455,19 @@ table.key-value-table td.value .csep { } .tabs .tabs-panel { - display: block; background: white; - position: absolute; - top: 40px; - bottom: 0px; - left: 0px; - right: 0px; overflow: auto; padding: 10px; } +.errorContent { + display: flex; + align-items: center; + justify-content: center; +} + .error { width: 700px; - position: absolute; background-color: #a50000; padding: 25px; border-radius: 15px; @@ -505,7 +493,7 @@ table.key-value-table td.value .csep { padding: 2px 0; } -#errorMessage .filename{ +#errorMessage .filename { font-weight: bold; } @@ -516,6 +504,42 @@ table.key-value-table td.value .csep { border-top: 41px solid #a50000; } +#mainContent {} + +.hide { + display: none !important; +} + +#contentBody {} + +.heightFull { + height: 100%; +} + +.widthFull { + width: 100%; +} + +.flexContainer { + display: flex; +} + +.flexFlowColumn { + flex-flow: column; +} + +.gutter { + background-color: rgb(169, 169, 169); +} + +.gutter.gutter-horizontal { + cursor: col-resize; +} + +.visibilityHidden { + visibility: hidden !important; +} + /******************************************************************************************** @@ -524,11 +548,7 @@ table.key-value-table td.value .csep { * ********************************************************************************************/ -#jsonViewer { - height: 100%; - display: flex; - flex-direction: column; -} +#jsonViewer {} #jsonViewerActions { font-size: 13px; @@ -563,7 +583,7 @@ table.key-value-table td.value .csep { * Miscellaneous * ********************************************************************************************/ - + .unselectable { user-select: none; -moz-user-select: -moz-none; @@ -573,7 +593,6 @@ table.key-value-table td.value .csep { } #responseContentActions { - display: block; position: fixed; top: 10px; right: 30px; diff --git a/resultbrowser/src/harviewer.html b/resultbrowser/src/harviewer.html index b2815b104..bb7570381 100644 --- a/resultbrowser/src/harviewer.html +++ b/resultbrowser/src/harviewer.html @@ -1,16 +1,19 @@ - - + + + HTTP Archive Viewer - - + + +
        - + + (function () { require(['harPreview'], function () { /* nothing */ }); })(); + + diff --git a/resultbrowser/src/index.html b/resultbrowser/src/index.html index 1810b98ad..321b99d4d 100644 --- a/resultbrowser/src/index.html +++ b/resultbrowser/src/index.html @@ -1,185 +1,213 @@ - + + XLT Result Browser + - + + + + + - + - + +
        -
        - -
        +
        +
        + + +
        + + -
        - - - - -
        - -
        -

        No result page has been set for this action.

        -

        This usually happens for one of the following reasons:

        -
          -
        • You neither set the result page explicitly via setHtmlPage() nor called one of the loadPage methods.
        • -
        • This action is the last action and XLT received the response of an asynchronous request triggered by JavaScript after this action has finished. In this case you might either + +
          + +
          +

          No result page has been set for this action.

          +

          This usually happens for one of the following reasons:

            -
          • increase the time that XLT waits for background JavaScript jobs to complete via property com.xceptance.xlt.js.backgroundActivity.waitingTime and/or
          • -
          • configure XLT to execute AJAX calls synchronously via property com.xceptance.xlt.js.ajax.executionMode.
          • +
          • + You neither set the result page explicitly via setHtmlPage() nor called one + of the loadPage methods. +
          • +
          • + This action is the last action and XLT received the response of an asynchronous request + triggered by JavaScript after this action has finished. In this case you might either +
              +
            • + increase the time that XLT waits for background JavaScript jobs to complete via + property com.xceptance.xlt.js.backgroundActivity.waitingTime and/or +
            • +
            • + configure XLT to execute AJAX calls synchronously via property + com.xceptance.xlt.js.ajax.executionMode. +
            • +
            +
          -
        • -
        -
        -
        - - -
        -
          -
        • Request/Response Information
        • -
        • Request Body (Raw)
        • -
        • Response Content
        • -
        • JSON
        • -
        -
        -

        Request

        -

        General Request Information

        - - - - - - - - - - - - - -
        URL
        Request Method
        Start Time -
        - -
        -

        Request Headers

        - - -
        -

        URL Query Parameters

        - - -
        -
        -

        POST Parameters

        - - -
        -
        -
        -

        Request Body (Raw)

        - -
        -

        Response

        -

        General Response Information

        - - - - - - - - - - - - - -
        Protocol
        Status
        Load Time
        -

        Response Headers

        - - -
        -
        -
        -
        
        -                
        -
        -
        - - - +
        - -
        -
        -

        Failed to load ''.

        -

        You see this message for one of the following reasons:

        -
          -
        • The file mentioned above does not exist or is not readable.
        • -
        • Your browser forbids to load local files via AJAX. For example, this is the case for Chrome, Safari and Opera.
        • + + +
          +
            +
          • Request/Response Information
          • +
          • Request Body (Raw)
          • +
          • Response Content
          • +
          • JSON
          -
          -
        -
        -
        -
        -
        - -  | Search: - -    -    -  | 0 Match(es) | JSON Path: +
        +

        Request

        +

        General Request Information

        + + + + + + + + + + + + + +
        URL
        Request Method
        Start Time +
        + +
        +

        Request Headers

        + + +
        +

        URL Query Parameters

        + + +
        +
        +

        POST Parameters

        + + +
        +
        +
        +

        Request Body (Raw)

        + +
        +

        Response

        +

        General Response Information

        + + + + + + + + + + + + + +
        Protocol
        Status
        Load Time
        +

        Response Headers

        + + +
        +
        +
        +
        
        +                        
        +
        +
        + + + +
        + +
        +
        +
        +

        Failed to load ''.

        +

        You see this message for one of the following reasons:

        +
          +
        • The file mentioned above does not exist or is not readable.
        • +
        • + Your browser forbids to load local files via AJAX. For example, this is the case for + Chrome, Safari and Opera. +
        • +
        +
        +
        +
        +
        +
        +
        +
        + +  | Search: + +    +    +  | 0 Match(es) | JSON Path: +
        +
        -
        -
        - -
        -
        -

        Stored Test Parameters and Result Data

        - - -
        -

        Hint: Copied table rows can simply be pasted to properties files. No need to explicitly insert a '=' between key and value to make it work.

        + +
        +
        +

        Stored Test Parameters and Result Data

        + + +
        +

        + + Hint: Copied table rows can simply be pasted to properties files. No need to + explicitly insert a '=' between key and value to make it work. + +

        +
        +
        -
        - -