| 1 | <html> | 
|---|
| 2 | <head><script> | 
|---|
| 3 | var $wnd = parent; | 
|---|
| 4 | var $doc = $wnd.document; | 
|---|
| 5 | var $moduleName, $moduleBase, $entry | 
|---|
| 6 | ,$stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null | 
|---|
| 7 | ,$sessionId = $wnd.__gwtStatsSessionId ? $wnd.__gwtStatsSessionId : null; | 
|---|
| 8 | // Lightweight metrics | 
|---|
| 9 | if ($stats) { | 
|---|
| 10 |   var moduleFuncName = location.search.substr(1); | 
|---|
| 11 |   var moduleFunc = $wnd[moduleFuncName]; | 
|---|
| 12 |   var moduleName = moduleFunc ? moduleFunc.moduleName : "unknown"; | 
|---|
| 13 |   $stats({moduleName:moduleName,sessionId:$sessionId,subSystem:'startup',evtGroup:'moduleStartup',millis:(new Date()).getTime(),type:'moduleEvalStart'}); | 
|---|
| 14 | } | 
|---|
| 15 | var $hostedHtmlVersion="2.1"; | 
|---|
| 16 |  | 
|---|
| 17 | var gwtOnLoad; | 
|---|
| 18 | var $hosted = "localhost:9997"; | 
|---|
| 19 |  | 
|---|
| 20 | function loadIframe(url) { | 
|---|
| 21 |   var topDoc = window.top.document; | 
|---|
| 22 |  | 
|---|
| 23 |   // create an iframe | 
|---|
| 24 |   var iframeDiv = topDoc.createElement("div"); | 
|---|
| 25 |   iframeDiv.innerHTML = "<iframe scrolling=no frameborder=0 src='" + url + "'>"; | 
|---|
| 26 |   var iframe = iframeDiv.firstChild; | 
|---|
| 27 |    | 
|---|
| 28 |   // mess with the iframe style a little | 
|---|
| 29 |   var iframeStyle = iframe.style; | 
|---|
| 30 |   iframeStyle.position = "absolute"; | 
|---|
| 31 |   iframeStyle.borderWidth = "0"; | 
|---|
| 32 |   iframeStyle.left = "0"; | 
|---|
| 33 |   iframeStyle.top = "0"; | 
|---|
| 34 |   iframeStyle.width = "100%"; | 
|---|
| 35 |   iframeStyle.backgroundColor = "#ffffff"; | 
|---|
| 36 |   iframeStyle.zIndex = "1"; | 
|---|
| 37 |   iframeStyle.height = "100%"; | 
|---|
| 38 |  | 
|---|
| 39 |   // update the top window's document's body's style | 
|---|
| 40 |   var hostBodyStyle = window.top.document.body.style;  | 
|---|
| 41 |   hostBodyStyle.margin = "0"; | 
|---|
| 42 |   hostBodyStyle.height = iframeStyle.height; | 
|---|
| 43 |   hostBodyStyle.overflow = "hidden"; | 
|---|
| 44 |  | 
|---|
| 45 |   // insert the iframe | 
|---|
| 46 |   topDoc.body.insertBefore(iframe, topDoc.body.firstChild); | 
|---|
| 47 | } | 
|---|
| 48 |  | 
|---|
| 49 | var ua = navigator.userAgent.toLowerCase(); | 
|---|
| 50 | if (ua.indexOf("gecko") != -1) { | 
|---|
| 51 |   // install eval wrapper on FF to avoid EvalError problem | 
|---|
| 52 |   var __eval = window.eval; | 
|---|
| 53 |   window.eval = function(s) { | 
|---|
| 54 |     return __eval(s); | 
|---|
| 55 |   } | 
|---|
| 56 | } | 
|---|
| 57 | if (ua.indexOf("chrome") != -1) { | 
|---|
| 58 |   // work around __gwt_ObjectId appearing in JS objects | 
|---|
| 59 |   var hop = Object.prototype.hasOwnProperty; | 
|---|
| 60 |   Object.prototype.hasOwnProperty = function(prop) { | 
|---|
| 61 |     return prop != "__gwt_ObjectId" && hop.call(this, prop); | 
|---|
| 62 |   }; | 
|---|
| 63 |   // do the same in our parent as well -- see issue 4486 | 
|---|
| 64 |   // NOTE: this will have to be changed when we support non-iframe-based DevMode  | 
|---|
| 65 |   var hop2 = parent.Object.prototype.hasOwnProperty; | 
|---|
| 66 |   parent.Object.prototype.hasOwnProperty = function(prop) { | 
|---|
| 67 |     return prop != "__gwt_ObjectId" && hop2.call(this, prop); | 
|---|
| 68 |   }; | 
|---|
| 69 | } | 
|---|
| 70 |  | 
|---|
| 71 | // wrapper to call JS methods, which we need both to be able to supply a | 
|---|
| 72 | // different this for method lookup and to get the exception back | 
|---|
| 73 | function __gwt_jsInvoke(thisObj, methodName) { | 
|---|
| 74 |   try { | 
|---|
| 75 |     var args = Array.prototype.slice.call(arguments, 2); | 
|---|
| 76 |     return [0, window[methodName].apply(thisObj, args)]; | 
|---|
| 77 |   } catch (e) { | 
|---|
| 78 |     return [1, e]; | 
|---|
| 79 |   } | 
|---|
| 80 | } | 
|---|
| 81 |  | 
|---|
| 82 | var __gwt_javaInvokes = []; | 
|---|
| 83 | function __gwt_makeJavaInvoke(argCount) { | 
|---|
| 84 |   return __gwt_javaInvokes[argCount] || __gwt_doMakeJavaInvoke(argCount); | 
|---|
| 85 | } | 
|---|
| 86 |  | 
|---|
| 87 | function __gwt_doMakeJavaInvoke(argCount) { | 
|---|
| 88 |   // IE6 won't eval() anonymous functions except as r-values | 
|---|
| 89 |   var argList = ""; | 
|---|
| 90 |   for (var i = 0; i < argCount; i++) { | 
|---|
| 91 |     argList += ",p" + i; | 
|---|
| 92 |   } | 
|---|
| 93 |   var argListNoComma = argList.substring(1); | 
|---|
| 94 |  | 
|---|
| 95 |   return eval( | 
|---|
| 96 |     "__gwt_javaInvokes[" + argCount + "] =\n" + | 
|---|
| 97 |     "  function(thisObj, dispId" + argList + ") {\n" + | 
|---|
| 98 |     "    var result = __static(dispId, thisObj" + argList + ");\n" + | 
|---|
| 99 |     "    if (result[0]) {\n" + | 
|---|
| 100 |     "      throw result[1];\n" + | 
|---|
| 101 |     "    } else {\n" + | 
|---|
| 102 |     "      return result[1];\n" + | 
|---|
| 103 |     "    }\n" + | 
|---|
| 104 |     "  }\n" | 
|---|
| 105 |   );  | 
|---|
| 106 | } | 
|---|
| 107 |  | 
|---|
| 108 | /* | 
|---|
| 109 |  * This is used to create tear-offs of Java methods.  Each function corresponds | 
|---|
| 110 |  * to exactly one dispId, and also embeds the argument count.  We get the "this" | 
|---|
| 111 |  * value from the context in which the function is being executed. | 
|---|
| 112 |  * Function-object identity is preserved by caching in a sparse array. | 
|---|
| 113 |  */ | 
|---|
| 114 | var __gwt_tearOffs = []; | 
|---|
| 115 | var __gwt_tearOffGenerators = []; | 
|---|
| 116 | function __gwt_makeTearOff(proxy, dispId, argCount) { | 
|---|
| 117 |   return __gwt_tearOffs[dispId] || __gwt_doMakeTearOff(dispId, argCount); | 
|---|
| 118 | } | 
|---|
| 119 |  | 
|---|
| 120 | function __gwt_doMakeTearOff(dispId, argCount) { | 
|---|
| 121 |   return __gwt_tearOffs[dispId] =  | 
|---|
| 122 |       (__gwt_tearOffGenerators[argCount] || __gwt_doMakeTearOffGenerator(argCount))(dispId); | 
|---|
| 123 | } | 
|---|
| 124 |  | 
|---|
| 125 | function __gwt_doMakeTearOffGenerator(argCount) { | 
|---|
| 126 |   // IE6 won't eval() anonymous functions except as r-values | 
|---|
| 127 |   var argList = ""; | 
|---|
| 128 |   for (var i = 0; i < argCount; i++) { | 
|---|
| 129 |     argList += ",p" + i; | 
|---|
| 130 |   } | 
|---|
| 131 |   var argListNoComma = argList.substring(1); | 
|---|
| 132 |  | 
|---|
| 133 |   return eval( | 
|---|
| 134 |     "__gwt_tearOffGenerators[" + argCount + "] =\n" + | 
|---|
| 135 |     "  function(dispId) {\n" + | 
|---|
| 136 |     "    return function(" + argListNoComma + ") {\n" + | 
|---|
| 137 |     "      var result = __static(dispId, this" + argList + ");\n" + | 
|---|
| 138 |     "      if (result[0]) {\n" + | 
|---|
| 139 |     "        throw result[1];\n" + | 
|---|
| 140 |     "      } else {\n" + | 
|---|
| 141 |     "        return result[1];\n" + | 
|---|
| 142 |     "      }\n" + | 
|---|
| 143 |     "    }\n" + | 
|---|
| 144 |     "  }\n" | 
|---|
| 145 |   );  | 
|---|
| 146 | } | 
|---|
| 147 |  | 
|---|
| 148 | function __gwt_makeResult(isException, result) { | 
|---|
| 149 |   return [isException, result]; | 
|---|
| 150 | } | 
|---|
| 151 |  | 
|---|
| 152 | function __gwt_disconnected() { | 
|---|
| 153 |   // Prevent double-invocation. | 
|---|
| 154 |   window.__gwt_disconnected = new Function(); | 
|---|
| 155 |   // Do it in a timeout so we can be sure we have a clean stack. | 
|---|
| 156 |   window.setTimeout(__gwt_disconnected_impl, 1); | 
|---|
| 157 | } | 
|---|
| 158 |  | 
|---|
| 159 | function __gwt_disconnected_impl() { | 
|---|
| 160 |   __gwt_displayGlassMessage('GWT Code Server Disconnected', | 
|---|
| 161 |       'Most likely, you closed GWT Development Mode. Or, you might have lost ' | 
|---|
| 162 |       + 'network connectivity. To fix this, try restarting GWT Development Mode and ' | 
|---|
| 163 |       + '<a style="color: #FFFFFF; font-weight: bold;" href="javascript:location.reload()">' | 
|---|
| 164 |       + 'REFRESH</a> this page.'); | 
|---|
| 165 | } | 
|---|
| 166 |  | 
|---|
| 167 | // Keep track of z-index to allow layering of multiple glass messages | 
|---|
| 168 | var __gwt_glassMessageZIndex = 2147483647; | 
|---|
| 169 |  | 
|---|
| 170 | // Note this method is also used by ModuleSpace.java | 
|---|
| 171 | function __gwt_displayGlassMessage(summary, details) { | 
|---|
| 172 |   var topWin = window.top; | 
|---|
| 173 |   var topDoc = topWin.document; | 
|---|
| 174 |   var outer = topDoc.createElement("div"); | 
|---|
| 175 |   // Do not insert whitespace or outer.firstChild will get a text node. | 
|---|
| 176 |   outer.innerHTML =  | 
|---|
| 177 |     '<div style="position:absolute;z-index:' + __gwt_glassMessageZIndex-- + | 
|---|
| 178 |     ';left:50px;top:50px;width:600px;color:#FFF;font-family:verdana;text-align:left;">' + | 
|---|
| 179 |     '<div style="font-size:30px;font-weight:bold;">' + summary + '</div>' + | 
|---|
| 180 |     '<div style="font-size:15px;">' + details + '</div>' + | 
|---|
| 181 |     '</div>' + | 
|---|
| 182 |     '<div style="position:absolute;z-index:' + __gwt_glassMessageZIndex-- + | 
|---|
| 183 |     ';left:0px;top:0px;right:0px;bottom:0px;filter:alpha(opacity=60);opacity:0.6;background-color:#000;"></div>' | 
|---|
| 184 |   ; | 
|---|
| 185 |   topDoc.body.appendChild(outer); | 
|---|
| 186 |   var glass = outer.firstChild; | 
|---|
| 187 |   var glassStyle = glass.style; | 
|---|
| 188 |  | 
|---|
| 189 |   // Scroll to the top and remove scrollbars. | 
|---|
| 190 |   topWin.scrollTo(0, 0); | 
|---|
| 191 |   if (topDoc.compatMode == "BackCompat") { | 
|---|
| 192 |     topDoc.body.style["overflow"] = "hidden"; | 
|---|
| 193 |   } else { | 
|---|
| 194 |     topDoc.documentElement.style["overflow"] = "hidden"; | 
|---|
| 195 |   } | 
|---|
| 196 |  | 
|---|
| 197 |   // Steal focus. | 
|---|
| 198 |   glass.focus(); | 
|---|
| 199 |  | 
|---|
| 200 |   if ((navigator.userAgent.indexOf("MSIE") >= 0) && (topDoc.compatMode == "BackCompat")) { | 
|---|
| 201 |     // IE quirks mode doesn't support right/bottom, but does support this. | 
|---|
| 202 |     glassStyle.width = "125%"; | 
|---|
| 203 |     glassStyle.height = "100%"; | 
|---|
| 204 |   } else if (navigator.userAgent.indexOf("MSIE 6") >= 0) { | 
|---|
| 205 |     // IE6 doesn't have a real standards mode, so we have to use hacks. | 
|---|
| 206 |     glassStyle.width = "125%"; // Get past scroll bar area. | 
|---|
| 207 |     // Nasty CSS; onresize would be better but the outer window won't let us add a listener IE. | 
|---|
| 208 |     glassStyle.setExpression("height", "document.documentElement.clientHeight"); | 
|---|
| 209 |   } | 
|---|
| 210 |  | 
|---|
| 211 |   $doc.title = summary + " [" + $doc.title + "]"; | 
|---|
| 212 | } | 
|---|
| 213 |  | 
|---|
| 214 | function findPluginObject() { | 
|---|
| 215 |   try { | 
|---|
| 216 |     return document.getElementById('pluginObject'); | 
|---|
| 217 |   } catch (e) { | 
|---|
| 218 |     return null; | 
|---|
| 219 |   } | 
|---|
| 220 | } | 
|---|
| 221 |  | 
|---|
| 222 | function findPluginEmbed() { | 
|---|
| 223 |   try { | 
|---|
| 224 |     return document.getElementById('pluginEmbed') | 
|---|
| 225 |   } catch (e) { | 
|---|
| 226 |     return null; | 
|---|
| 227 |   } | 
|---|
| 228 | } | 
|---|
| 229 |  | 
|---|
| 230 | function findPluginXPCOM() { | 
|---|
| 231 |   try { | 
|---|
| 232 |     return __gwt_HostedModePlugin; | 
|---|
| 233 |   } catch (e) { | 
|---|
| 234 |     return null; | 
|---|
| 235 |   } | 
|---|
| 236 | } | 
|---|
| 237 |  | 
|---|
| 238 | gwtOnLoad = function(errFn, modName, modBase){ | 
|---|
| 239 |   $moduleName = modName; | 
|---|
| 240 |   $moduleBase = modBase; | 
|---|
| 241 |  | 
|---|
| 242 |   // Note that the order is important | 
|---|
| 243 |   var pluginFinders = [ | 
|---|
| 244 |     findPluginXPCOM, | 
|---|
| 245 |     findPluginObject, | 
|---|
| 246 |     findPluginEmbed, | 
|---|
| 247 |   ]; | 
|---|
| 248 |   var topWin = window.top; | 
|---|
| 249 |   var url = topWin.location.href; | 
|---|
| 250 |   if (!topWin.__gwt_SessionID) { | 
|---|
| 251 |     var ASCII_EXCLAMATION = 33; | 
|---|
| 252 |     var ASCII_TILDE = 126; | 
|---|
| 253 |     var chars = []; | 
|---|
| 254 |     for (var i = 0; i < 16; ++i) { | 
|---|
| 255 |       chars.push(Math.floor(ASCII_EXCLAMATION | 
|---|
| 256 |           + Math.random() * (ASCII_TILDE - ASCII_EXCLAMATION + 1))); | 
|---|
| 257 |     } | 
|---|
| 258 |     topWin.__gwt_SessionID = String.fromCharCode.apply(null, chars); | 
|---|
| 259 |   } | 
|---|
| 260 |   var plugin = null; | 
|---|
| 261 |   for (var i = 0; i < pluginFinders.length; ++i) { | 
|---|
| 262 |     try { | 
|---|
| 263 |       var maybePlugin = pluginFinders[i](); | 
|---|
| 264 |       if (maybePlugin != null && maybePlugin.init(window)) { | 
|---|
| 265 |         plugin = maybePlugin; | 
|---|
| 266 |         break; | 
|---|
| 267 |       } | 
|---|
| 268 |     } catch (e) { | 
|---|
| 269 |     } | 
|---|
| 270 |   } | 
|---|
| 271 |   if (!plugin) { | 
|---|
| 272 |     // try searching for a v1 plugin for backwards compatibility | 
|---|
| 273 |     var found = false; | 
|---|
| 274 |     for (var i = 0; i < pluginFinders.length; ++i) { | 
|---|
| 275 |       try { | 
|---|
| 276 |         plugin = pluginFinders[i](); | 
|---|
| 277 |         if (plugin != null && plugin.connect($hosted, $moduleName, window)) { | 
|---|
| 278 |           return; | 
|---|
| 279 |         } | 
|---|
| 280 |       } catch (e) { | 
|---|
| 281 |       } | 
|---|
| 282 |     } | 
|---|
| 283 |     loadIframe("http://gwt.google.com/missing-plugin"); | 
|---|
| 284 |   } else { | 
|---|
| 285 |     if (plugin.connect(url, topWin.__gwt_SessionID, $hosted, $moduleName, | 
|---|
| 286 |         $hostedHtmlVersion)) { | 
|---|
| 287 |       window.onUnload = function() { | 
|---|
| 288 |         try { | 
|---|
| 289 |           // wrap in try/catch since plugins are not required to supply this | 
|---|
| 290 |           plugin.disconnect(); | 
|---|
| 291 |         } catch (e) { | 
|---|
| 292 |         } | 
|---|
| 293 |       }; | 
|---|
| 294 |     } else { | 
|---|
| 295 |       if (errFn) { | 
|---|
| 296 |         errFn(modName); | 
|---|
| 297 |       } else { | 
|---|
| 298 |         alert("Plugin failed to connect to Development Mode server at " + $hosted); | 
|---|
| 299 |         loadIframe("http://code.google.com/p/google-web-toolkit/wiki/TroubleshootingOOPHM"); | 
|---|
| 300 |       } | 
|---|
| 301 |     } | 
|---|
| 302 |   } | 
|---|
| 303 | } | 
|---|
| 304 |  | 
|---|
| 305 | window.onunload = function() { | 
|---|
| 306 | }; | 
|---|
| 307 |  | 
|---|
| 308 | // Lightweight metrics | 
|---|
| 309 | window.fireOnModuleLoadStart = function(className) { | 
|---|
| 310 |   $stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:className}); | 
|---|
| 311 | }; | 
|---|
| 312 |  | 
|---|
| 313 | window.__gwt_module_id = 0; | 
|---|
| 314 | </script></head> | 
|---|
| 315 | <body> | 
|---|
| 316 | <font face='arial' size='-1'>This html file is for Development Mode support.</font> | 
|---|
| 317 | <script><!-- | 
|---|
| 318 | // Lightweight metrics | 
|---|
| 319 | $stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'moduleEvalEnd'}); | 
|---|
| 320 |  | 
|---|
| 321 | // OOPHM currently only supports IFrameLinker | 
|---|
| 322 | var query = parent.location.search; | 
|---|
| 323 | if (!findPluginXPCOM()) { | 
|---|
| 324 |   document.write('<embed id="pluginEmbed" type="application/x-gwt-hosted-mode" width="10" height="10">'); | 
|---|
| 325 |   document.write('</embed>'); | 
|---|
| 326 |   document.write('<object id="pluginObject" CLASSID="CLSID:1D6156B6-002B-49E7-B5CA-C138FB843B4E">'); | 
|---|
| 327 |   document.write('</object>'); | 
|---|
| 328 | } | 
|---|
| 329 |  | 
|---|
| 330 | // look for the old query parameter if we don't find the new one | 
|---|
| 331 | var idx = query.indexOf("gwt.codesvr="); | 
|---|
| 332 | if (idx >= 0) { | 
|---|
| 333 |   idx += 12;  // "gwt.codesvr=".length() == 12 | 
|---|
| 334 | } else { | 
|---|
| 335 |   idx = query.indexOf("gwt.hosted="); | 
|---|
| 336 |   if (idx >= 0) { | 
|---|
| 337 |     idx += 11;  // "gwt.hosted=".length() == 11 | 
|---|
| 338 |   } | 
|---|
| 339 | } | 
|---|
| 340 | if (idx >= 0) { | 
|---|
| 341 |   var amp = query.indexOf("&", idx); | 
|---|
| 342 |   if (amp >= 0) { | 
|---|
| 343 |     $hosted = query.substring(idx, amp); | 
|---|
| 344 |   } else { | 
|---|
| 345 |     $hosted = query.substring(idx); | 
|---|
| 346 |   } | 
|---|
| 347 |  | 
|---|
| 348 |   // According to RFC 3986, some of this component's characters (e.g., ':') | 
|---|
| 349 |   // are reserved and *may* be escaped. | 
|---|
| 350 |   $hosted = decodeURIComponent($hosted); | 
|---|
| 351 | } | 
|---|
| 352 |  | 
|---|
| 353 | query = window.location.search.substring(1); | 
|---|
| 354 | if (query && $wnd[query]) setTimeout($wnd[query].onScriptLoad, 1); | 
|---|
| 355 | --></script></body></html> | 
|---|