1<html> 2<head><script> 3var $wnd = parent; 4var $doc = $wnd.document; 5var $moduleName, $moduleBase, $entry 6,$stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null 7,$sessionId = $wnd.__gwtStatsSessionId ? $wnd.__gwtStatsSessionId : null; 8// Lightweight metrics 9if ($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} 15var $hostedHtmlVersion="2.1"; 16 17var gwtOnLoad; 18var $hosted = "localhost:9997"; 19 20function 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 49var ua = navigator.userAgent.toLowerCase(); 50if (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} 57if (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 73function __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 82var __gwt_javaInvokes = []; 83function __gwt_makeJavaInvoke(argCount) { 84 return __gwt_javaInvokes[argCount] || __gwt_doMakeJavaInvoke(argCount); 85} 86 87function __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 */ 114var __gwt_tearOffs = []; 115var __gwt_tearOffGenerators = []; 116function __gwt_makeTearOff(proxy, dispId, argCount) { 117 return __gwt_tearOffs[dispId] || __gwt_doMakeTearOff(dispId, argCount); 118} 119 120function __gwt_doMakeTearOff(dispId, argCount) { 121 return __gwt_tearOffs[dispId] = 122 (__gwt_tearOffGenerators[argCount] || __gwt_doMakeTearOffGenerator(argCount))(dispId); 123} 124 125function __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 148function __gwt_makeResult(isException, result) { 149 return [isException, result]; 150} 151 152function __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 159function __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 168var __gwt_glassMessageZIndex = 2147483647; 169 170// Note this method is also used by ModuleSpace.java 171function __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 214function findPluginObject() { 215 try { 216 return document.getElementById('pluginObject'); 217 } catch (e) { 218 return null; 219 } 220} 221 222function findPluginEmbed() { 223 try { 224 return document.getElementById('pluginEmbed') 225 } catch (e) { 226 return null; 227 } 228} 229 230function findPluginXPCOM() { 231 try { 232 return __gwt_HostedModePlugin; 233 } catch (e) { 234 return null; 235 } 236} 237 238gwtOnLoad = 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 __gwt_displayGlassMessage("Plugin failed to connect to Development Mode server at " + 299 simpleEscape($hosted), 300 "Follow the underlying troubleshooting instructions"); 301 loadIframe("http://code.google.com/p/google-web-toolkit/wiki/TroubleshootingOOPHM"); 302 } 303 } 304 } 305} 306 307function simpleEscape(originalString) { 308 return originalString.replace("&","&") 309 .replace("<","<") 310 .replace(">",">") 311 .replace("\"","""); 312} 313 314window.onunload = function() { 315}; 316 317// Lightweight metrics 318window.fireOnModuleLoadStart = function(className) { 319 $stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:className}); 320}; 321 322window.__gwt_module_id = 0; 323</script></head> 324<body> 325<font face='arial' size='-1'>This html file is for Development Mode support.</font> 326<script><!-- 327// Lightweight metrics 328$stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'moduleEvalEnd'}); 329 330// OOPHM currently only supports IFrameLinker 331var query = parent.location.search; 332if (!findPluginXPCOM()) { 333 document.write('<embed id="pluginEmbed" type="application/x-gwt-hosted-mode" width="10" height="10">'); 334 document.write('</embed>'); 335 document.write('<object id="pluginObject" CLASSID="CLSID:1D6156B6-002B-49E7-B5CA-C138FB843B4E">'); 336 document.write('</object>'); 337} 338 339// look for the old query parameter if we don't find the new one 340var idx = query.indexOf("gwt.codesvr="); 341if (idx >= 0) { 342 idx += 12; // "gwt.codesvr=".length() == 12 343} else { 344 idx = query.indexOf("gwt.hosted="); 345 if (idx >= 0) { 346 idx += 11; // "gwt.hosted=".length() == 11 347 } 348} 349if (idx >= 0) { 350 var amp = query.indexOf("&", idx); 351 if (amp >= 0) { 352 $hosted = query.substring(idx, amp); 353 } else { 354 $hosted = query.substring(idx); 355 } 356 357 // According to RFC 3986, some of this component's characters (e.g., ':') 358 // are reserved and *may* be escaped. 359 $hosted = decodeURIComponent($hosted); 360} 361 362query = window.location.search.substring(1); 363if (query && $wnd[query]) setTimeout($wnd[query].onScriptLoad, 1); 364--></script></body></html> 365