source: trunk/playground/GWT-Examples/GWT-JSNI-example/war/gwt_jsni_example/hosted.html

Last change on this file was 481, checked in by lgiessmann, 14 years ago
File size: 11.2 KB
Line 
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        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
305window.onunload = function() {
306};
307
308// Lightweight metrics
309window.fireOnModuleLoadStart = function(className) {
310  $stats && $stats({moduleName:$moduleName, sessionId:$sessionId, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:className});
311};
312
313window.__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
322var query = parent.location.search;
323if (!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
331var idx = query.indexOf("gwt.codesvr=");
332if (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}
340if (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
353query = window.location.search.substring(1);
354if (query && $wnd[query]) setTimeout($wnd[query].onScriptLoad, 1);
355--></script></body></html>
Note: See TracBrowser for help on using the repository browser.