| 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> |
|---|