| OLD | NEW |
| (Empty) |
| 1 // | |
| 2 // This script provides some mechanics for testing ChromeFrame | |
| 3 // | |
| 4 function onSuccess(name, id) { | |
| 5 appendStatus("Success reported!"); | |
| 6 onFinished(name, id, "OK"); | |
| 7 } | |
| 8 | |
| 9 function onFailure(name, id, status) { | |
| 10 appendStatus("Failure reported: " + status); | |
| 11 onFinished(name, id, status); | |
| 12 } | |
| 13 | |
| 14 function byId(id) { | |
| 15 return document.getElementById(id); | |
| 16 } | |
| 17 | |
| 18 function getXHRObject(){ | |
| 19 var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', | |
| 20 'Msxml2.XMLHTTP.4.0']; | |
| 21 var http = null; | |
| 22 try { | |
| 23 http = new XMLHttpRequest(); | |
| 24 } catch(e) { | |
| 25 } | |
| 26 | |
| 27 if (http) | |
| 28 return http; | |
| 29 | |
| 30 for (var i = 0; i < 3; ++i) { | |
| 31 var progid = XMLHTTP_PROGIDS[i]; | |
| 32 try { | |
| 33 http = new ActiveXObject(progid); | |
| 34 } catch(e) { | |
| 35 } | |
| 36 | |
| 37 if (http) | |
| 38 break; | |
| 39 } | |
| 40 return http; | |
| 41 } | |
| 42 | |
| 43 var reportURL = "/writefile/"; | |
| 44 | |
| 45 // Optionally send the server a notification that onload was fired. | |
| 46 // To be called from within window.onload. | |
| 47 function sendOnLoadEvent() { | |
| 48 writeToServer("OnLoadEvent", "loaded"); | |
| 49 } | |
| 50 | |
| 51 function writeToServer(name, result) { | |
| 52 var xhr = getXHRObject(); | |
| 53 if(!xhr) | |
| 54 return; | |
| 55 | |
| 56 // asynchronously POST the results | |
| 57 xhr.open("POST", reportURL + name, true); | |
| 58 xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); | |
| 59 try { | |
| 60 xhr.send(result); | |
| 61 } catch(e) { | |
| 62 appendStatus("XHR send failed. Error: " + e.description); | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 function postResult(name, result) { | |
| 67 writeToServer(name, result); | |
| 68 } | |
| 69 | |
| 70 // Finish running a test by setting the status | |
| 71 // and the cookie. | |
| 72 function onFinished(name, id, result) { | |
| 73 // set a cookie to report the results... | |
| 74 var cookie = name + "." + id + ".status=" + result + "; path=/"; | |
| 75 document.cookie = cookie; | |
| 76 | |
| 77 // ...and POST the status back to the server | |
| 78 postResult(name, result); | |
| 79 } | |
| 80 | |
| 81 function appendStatus(message) { | |
| 82 var statusPanel = byId("statusPanel"); | |
| 83 if (statusPanel) { | |
| 84 statusPanel.innerHTML += '<BR>' + message; | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 function readCookie(name) { | |
| 89 var cookie_name = name + "="; | |
| 90 var ca = document.cookie.split(';'); | |
| 91 | |
| 92 for(var i = 0 ; i < ca.length ; i++) { | |
| 93 var c = ca[i]; | |
| 94 while (c.charAt(0) == ' ') { | |
| 95 c = c.substring(1,c.length); | |
| 96 } | |
| 97 if (c.indexOf(cookie_name) == 0) { | |
| 98 return c.substring(cookie_name.length, c.length); | |
| 99 } | |
| 100 } | |
| 101 return null; | |
| 102 } | |
| 103 | |
| 104 function createCookie(name,value,days) { | |
| 105 var expires = ""; | |
| 106 if (days) { | |
| 107 var date = new Date(); | |
| 108 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); | |
| 109 expires = "; expires=" + date.toGMTString(); | |
| 110 } | |
| 111 document.cookie = name+"="+value+expires+"; path=/"; | |
| 112 } | |
| 113 | |
| 114 function eraseCookie(name) { | |
| 115 createCookie(name, "", -1); | |
| 116 } | |
| 117 | |
| 118 function isRunningInMSIE() { | |
| 119 if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) | |
| 120 return true; | |
| 121 | |
| 122 return false; | |
| 123 } | |
| 124 | |
| 125 function reloadUsingCFProtocol() { | |
| 126 var redirect_location = "gcf:"; | |
| 127 redirect_location += window.location; | |
| 128 window.location = redirect_location; | |
| 129 } | |
| 130 | |
| 131 function isRunningInChrome() { | |
| 132 var is_chrome_frame = /chromeframe/.test(navigator.userAgent.toLowerCase()); | |
| 133 if (is_chrome_frame) | |
| 134 return 0; | |
| 135 var is_chrome = /chrome/.test(navigator.userAgent.toLowerCase()); | |
| 136 return is_chrome; | |
| 137 } | |
| 138 | |
| 139 function TestIfRunningInChrome() { | |
| 140 var is_chrome = isRunningInChrome(); | |
| 141 if (!is_chrome) { | |
| 142 onFailure("ChromeFrameWindowOpen", "Window Open failed :-(", | |
| 143 "User agent = " + navigator.userAgent.toLowerCase()); | |
| 144 } | |
| 145 return is_chrome; | |
| 146 } | |
| 147 | |
| 148 // Returns the base document url. | |
| 149 function GetBaseUrlPath() { | |
| 150 var url = window.location.protocol + "//" + window.location.host + "/"; | |
| 151 return url; | |
| 152 } | |
| 153 | |
| 154 // Appends arguments passed in to the base document url and returns the same. | |
| 155 function AppendArgumentsToBaseUrl() { | |
| 156 var url = GetBaseUrlPath(); | |
| 157 for (arg_index = 0; arg_index < arguments.length; arg_index++) { | |
| 158 url += arguments[arg_index]; | |
| 159 } | |
| 160 return url; | |
| 161 } | |
| 162 | |
| 163 // Get the value of the first parameter from the query string which matches the | |
| 164 // given name. | |
| 165 function getURLParameter(name) { | |
| 166 name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); | |
| 167 var regexString = "[\\?&]" + name + "=([^&#]*)"; | |
| 168 var regex = new RegExp(regexString); | |
| 169 var results = regex.exec(window.location.href); | |
| 170 if (results == null) { | |
| 171 return ""; | |
| 172 } else { | |
| 173 return results[1]; | |
| 174 } | |
| 175 } | |
| 176 | |
| 177 // Create new URL by given html page name and querystring, based on current URL | |
| 178 // path. | |
| 179 function buildURL(pageName, queryString) { | |
| 180 var path = window.location.pathname; | |
| 181 var url = ""; | |
| 182 | |
| 183 url += window.location.protocol + "//" + window.location.host; | |
| 184 if (path.lastIndexOf("/") > 0) { | |
| 185 url += path.substring(0, path.lastIndexOf("/")) + "/" + pageName; | |
| 186 } else { | |
| 187 url += "/" + pageName; | |
| 188 } | |
| 189 url += ((queryString == "") ? "" : "?" + queryString); | |
| 190 return url; | |
| 191 } | |
| 192 | |
| 193 // Helper function for insertControl. | |
| 194 function generateControlHtml(configuration) { | |
| 195 var objectAttributes = new Object(); | |
| 196 var params = new Array(); | |
| 197 var embedAttributes = new Object(); | |
| 198 var param; | |
| 199 var html; | |
| 200 | |
| 201 function stringifyAttributes(attributeCollection) { | |
| 202 var result = new String(); | |
| 203 for (var attributeName in attributeCollection) { | |
| 204 result += ' ' + attributeName + '="' + | |
| 205 attributeCollection[attributeName] + '"'; | |
| 206 } | |
| 207 return result; | |
| 208 } | |
| 209 | |
| 210 function applyAttribute(attributeCollection, name, value, defaultValue) { | |
| 211 if (value === undefined) | |
| 212 value = defaultValue; | |
| 213 if (value !== null) | |
| 214 attributeCollection[name] = value; | |
| 215 } | |
| 216 | |
| 217 objectAttributes.classid="CLSID:E0A900DF-9611-4446-86BD-4B1D47E7DB2A"; | |
| 218 objectAttributes.codebase="http://www.google.com"; | |
| 219 applyAttribute(objectAttributes, "id", configuration.id, "ChromeFrame"); | |
| 220 applyAttribute(objectAttributes, "width", configuration.width, "500"); | |
| 221 applyAttribute(objectAttributes, "height", configuration.height, "500"); | |
| 222 | |
| 223 // Attributes provided by the caller override any defaults. | |
| 224 for (var attribute in configuration.objectAttributes) { | |
| 225 if (configuration.objectAttributes[attribute] === null) | |
| 226 delete objectAttributes[attribute]; | |
| 227 else | |
| 228 objectAttributes[attribute] = configuration.objectAttributes[attribute]; | |
| 229 } | |
| 230 | |
| 231 embedAttributes.type = "application/chromeframe"; | |
| 232 | |
| 233 // By default, embed id = object.id + "Plugin". null id means omit id. | |
| 234 if (embedAttributes.id === null) | |
| 235 delete embedAttributes.id; | |
| 236 else if (embedAttributes.id === undefined && objectAttributes.id !== null) | |
| 237 embedAttributes.id = objectAttributes.id + "Plugin"; | |
| 238 | |
| 239 // By default, embed name = object.id. null name means omit name. | |
| 240 if (embedAttributes.name === null) | |
| 241 delete embedAttributes.name; | |
| 242 else if (embedAttributes.name === undefined && objectAttributes.id !== null) | |
| 243 embedAttributes.name = objectAttributes.id; | |
| 244 | |
| 245 applyAttribute(embedAttributes, "width", configuration.width, "500"); | |
| 246 applyAttribute(embedAttributes, "height", configuration.height, "500"); | |
| 247 applyAttribute(embedAttributes, "src", configuration.src, null); | |
| 248 | |
| 249 for (var attribute in configuration.embedAttributes) { | |
| 250 if (configuration.embedAttributes[attribute] === null) | |
| 251 delete embedAttributes[attribute]; | |
| 252 else | |
| 253 embedAttributes[attribute] = configuration.embedAttributes[attribute]; | |
| 254 } | |
| 255 | |
| 256 if (embedAttributes.src !== undefined) { | |
| 257 param = new Object(); | |
| 258 param.name = "src"; | |
| 259 param.value = embedAttributes.src; | |
| 260 params.push(param); | |
| 261 } | |
| 262 | |
| 263 // All event handlers are params and attributes of the embed object. | |
| 264 for (var eventName in configuration.eventHandlers) { | |
| 265 param = new Object(); | |
| 266 param.name = eventName; | |
| 267 param.value = configuration.eventHandlers[eventName]; | |
| 268 params.push(param); | |
| 269 embedAttributes[eventName] = configuration.eventHandlers[eventName]; | |
| 270 } | |
| 271 | |
| 272 html = "<object" + stringifyAttributes(objectAttributes) + ">\r\n"; | |
| 273 for (var i = 0; i < params.length; ++i) { | |
| 274 html += " <param" + stringifyAttributes(params[i]) + ">\r\n"; | |
| 275 } | |
| 276 html += " <embed" + stringifyAttributes(embedAttributes) + "></embed>\r\n" | |
| 277 | |
| 278 html += "</object>"; | |
| 279 | |
| 280 return html; | |
| 281 } | |
| 282 | |
| 283 // Write the text for the Chrome Frame ActiveX control into an element. | |
| 284 // This works around a "feature" of IE versions released between April, 2006 | |
| 285 // and April, 2008 that required the user to click on an ActiveX control to | |
| 286 // "activate" it. See http://msdn.microsoft.com/en-us/library/ms537508.aspx. | |
| 287 // | |
| 288 // |elementId| identifies the element in the current document into which the | |
| 289 // control markup will be inserted. |configuration| is an Object used to | |
| 290 // configure the control as below. Values shown are defaults, which may be | |
| 291 // overridden by supplying null values. | |
| 292 // { | |
| 293 // "id": "ChromeFrame", // id of object tag, name of the embed tag, and | |
| 294 // // basis of id of the embed tag. | |
| 295 // "width": "500", // width of both object and embed tags. | |
| 296 // "height": "500", // height of both object and embed tags. | |
| 297 // "src": "url", // src of embed tag and of param to object tag. | |
| 298 // "eventHandlers": { // Applied to embed tag and params to object tag. | |
| 299 // "onclose": "...", | |
| 300 // "onload": "...", | |
| 301 // "onloaderror": "..." | |
| 302 // } | |
| 303 // "objectAttributes": { // Custom attributes for the object tag. Any | |
| 304 // "tabindex": "...", // properties explicitly set to null will override | |
| 305 // "border": "...", // defaults. | |
| 306 // "style": "..." | |
| 307 // }, | |
| 308 // "embedAttributes": { // Custom attributes for the embed tag; | |
| 309 // "privileged_mode": "...", // similar to above. | |
| 310 // "style": "..." | |
| 311 // } | |
| 312 // } | |
| 313 function insertControl(elementId, configuration) { | |
| 314 var e = document.getElementById(elementId); | |
| 315 e.innerHTML = generateControlHtml(configuration); | |
| 316 } | |
| OLD | NEW |