Home | History | Annotate | Download | only in data
      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 }
    317