4 Provides an in-depth tool to analyze Ajax interactions with web servers.
5 Copyright (C) 2007 Steven Ray Schronk
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 // THREADSAFE ASYNCHRONOUS XMLHTTPRequest
25 // url = url to send to server
26 // pageElement = page element to replace when data arrives
27 // waitMessage = info to display while waiting for return from server
28 // if waitMessage not sent, content will not "blink"
29 // callBack = javascript function name to run after data has been returned from server
30 function getPage( url
, pageElement
, waitMessage
, callBack
) {
31 var timer
= new Date();
32 var t_start
= timer
.getTime();
33 //debugEvent(url, "get");
35 // DON'T DISTURB CONTENT UNLESS NESSISARY
36 if ( waitMessage
!= "" ) { document
.getElementById(pageElement
).innerHTML
= waitMessage
; }
38 // WE USE A JAVASCRIPT FEATURE HERE CALLED "INNER FUNCTIONS"
39 // USING THESE MEANS THE LOCAL VARIABLES RETAIN THEIR VALUES AFTER THE OUTER FUNCTION
40 // HAS RETURNED. THIS IS USEFUL FOR THREAD SAFETY, SO
41 // REASSIGNING THE ONREADYSTATECHANGE FUNCTION DOESN'T STOMP OVER EARLIER REQUESTS.
42 function ajaxBindCallback(){
43 if(ajaxRequest
.readyState
== 0) { window
.status
= "Waiting..."; }
44 if(ajaxRequest
.readyState
== 1) { window
.status
= "Loading Page..."; }
45 if(ajaxRequest
.readyState
== 2) { window
.status
= "Data Received...";}
46 if(ajaxRequest
.readyState
== 3) { window
.status
= "Interactive..."; }
47 if(ajaxRequest
.readyState
== 4) {
48 window
.status
= "Transaction Complete...";
50 // STOP TIMER AND FIND DIFFERENCE
51 // MUST CREATE NEW TIMER INSTANCE :)
52 var timer2
= new Date();
53 var t_end
= timer2
.getTime();
54 var t_diff
= t_end
- t_start
;
56 // TEST HTTP STATUS CODE - DISPLAY IN DUBUGGER AND STATUS
57 switch (ajaxRequest
.status
.toString()) {
59 window
.status
= "Page Loaded Sucessfully";
60 document
.getElementById(pageElement
).innerHTML
= ajaxRequest
.responseText
;
61 debugEvent(url
, "got", ajaxRequest
.responseText
, t_diff
);
64 window
.status
= "Forbidden...";
65 debugEvent(url
, "error_403", ajaxRequest
.responseText
, t_diff
);
68 window
.status
= "File Not Found...";
69 debugEvent(url
, "error_404", ajaxRequest
.responseText
, t_diff
);
72 window
.status
= "File Not Found...";
73 debugEvent(url
, "error_500", ajaxRequest
.responseText
, t_diff
);
76 window
.status
= "Unknown Ajax Error..."+ajaxRequest
.status
.toString();
80 var ajaxRequest
= null;
81 // BIND OUR CALLBACK THEN HIT THE SERVER...
82 if (window
.XMLHttpRequest
) {
83 ajaxRequest
= new XMLHttpRequest();
84 ajaxRequest
.onreadystatechange
= ajaxBindCallback
;
85 ajaxRequest
.open("GET", url
, true);
86 ajaxRequest
.send(null);
87 } else if (window
.ActiveXObject
) {
88 ajaxRequest
= new ActiveXObject("Microsoft.XMLHTTP");
90 ajaxRequest
.onreadystatechange
= ajaxBindCallback
;
91 ajaxRequest
.open("GET", url
, true);
95 if (callBack
!= null ) { eval(callBack
+'()'); }
98 function sendData(url
){
100 var timer
= new Date();
101 var t_start
= timer
.getTime();
102 // WE USE A JAVASCRIPT FEATURE HERE CALLED "INNER FUNCTIONS"
103 // USING THESE MEANS THE LOCAL VARIABLES RETAIN THEIR VALUES AFTER THE OUTER FUNCTION
104 // HAS RETURNED. THIS IS USEFUL FOR THREAD SAFETY, SO
105 // REASSIGNING THE ONREADYSTATECHANGE FUNCTION DOESN'T STOMP OVER EARLIER REQUESTS.
106 function ajaxBindCallback(){
107 if(ajaxRequest
.readyState
== 0) { window
.status
= "Waiting..."; }
108 if(ajaxRequest
.readyState
== 1) { window
.status
= "Loading Page..."; }
109 if(ajaxRequest
.readyState
== 2) { window
.status
= "Data Received...";}
110 if(ajaxRequest
.readyState
== 3) { window
.status
= "Interactive..."; }
111 if(ajaxRequest
.readyState
== 4) {
112 window
.status
= "Transaction Complete...";
114 // STOP TIMER AND FIND DIFFERENCE
115 // MUST CREATE NEW TIMER INSTANCE :)
116 var timer2
= new Date();
117 var t_end
= timer2
.getTime();
118 var t_diff
= t_end
- t_start
;
120 // TEST HTTP STATUS CODE - DISPLAY IN DUBUGGER AND STATUS
121 switch (ajaxRequest
.status
.toString()) {
123 debugEvent(url
, "got", ajaxRequest
.responseText
, t_diff
);
126 debugEvent(url
, "error_403", ajaxRequest
.responseText
, t_diff
);
129 debugEvent(url
, "error_404", ajaxRequest
.responseText
, t_diff
);
132 debugEvent(url
, "error_500", ajaxRequest
.responseText
, t_diff
);
137 var ajaxRequest
= null;
138 // BIND OUR CALLBACK THEN HIT THE SERVER...
139 if (window
.XMLHttpRequest
) {
140 ajaxRequest
= new XMLHttpRequest();
141 ajaxRequest
.onreadystatechange
= ajaxBindCallback
;
142 ajaxRequest
.open("GET", url
, true);
143 ajaxRequest
.send(null);
144 } else if (window
.ActiveXObject
) {
145 ajaxRequest
= new ActiveXObject("Microsoft.XMLHTTP");
147 ajaxRequest
.onreadystatechange
= ajaxBindCallback
;
148 ajaxRequest
.open("GET", url
, true);