|
| 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 | + __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 | + |
| 307 | +function simpleEscape(originalString) { |
| 308 | + return originalString.replace("&","&") |
| 309 | + .replace("<","<") |
| 310 | + .replace(">",">") |
| 311 | + .replace("\"","""); |
| 312 | +} |
| 313 | + |
| 314 | +window.onunload = function() { |
| 315 | +}; |
| 316 | + |
| 317 | +// Lightweight metrics |
| 318 | +window.fireOnModuleLoadStart = function(className) { |
| 319 | + $stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:className}); |
| 320 | +}; |
| 321 | + |
| 322 | +window.__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 |
| 331 | +var query = parent.location.search; |
| 332 | +if (!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 |
| 340 | +var idx = query.indexOf("gwt.codesvr="); |
| 341 | +if (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 | +} |
| 349 | +if (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 | + |
| 362 | +query = window.location.search.substring(1); |
| 363 | +if (query && $wnd[query]) setTimeout($wnd[query].onScriptLoad, 1); |
| 364 | +--></script></body></html> |
0 commit comments