<!DOCTYPE html> <meta charset="utf-8"> <script type="text/javascript" src="/imp/static/jquery.js"></script> <style type="text/css"> html { overflow: auto; } html, body, div, iframe { margin: 0px; padding: 0px; height: 100%; border: none; } iframe { display: block; width: 100%; border: none; overflow-y: auto; overflow-x: hidden; } </style> <iframe id="content" name="content" src="/imp/static/loading.html" frameborder="0" marginheight="0" marginwidth="0" width="100%" height="100%" scrolling="auto" content="text/html;charset=UTF-8"> </iframe> <script type="text/javascript"> var buffer = window.location.pathname.split('/')[3]; var max_period = 60000; var min_period = 1000; var next_period = min_period; var alpha = 1.2; var current_id = '-1'; $('head').append($('<title/>').text(decodeURI(buffer))); var nextTimeout = function() { var next = next_period; next_period = Math.min(max_period, next_period * alpha); return next; }; var resetTimeout = function() { next_period = min_period; }; var frameToDocument = function(iframe) { return (iframe.contentDocument) ? iframe.contentDocument : iframe.Document; }; var printIframe = function(data) { var iframeJQ = $('#content'); var doc = frameToDocument(iframeJQ[0]); var iwindow = iframeJQ[0].contentWindow; var offX = iwindow.pageXOffset, offY = iwindow.pageYOffset; if (offY && offY >= $(doc.body).height() - $(iwindow).height()) { offY = null; // follow the end of the buffer } doc.open(); doc.write(data); doc.close(); iwindow.scrollTo(offX, offY != null ? offY : $(doc.body).height()); }; var setIframe = function(count, newText) { if(!count) { // error parsing client result printIframe('0', 'error parsing the response from emacs'); } else { current_id = count; printIframe(newText); } }; var refresh = function() { var url = "/imp/buffer/" + buffer; var gotData = function(data, status, xhr) { resetTimeout(); setIframe(xhr.getResponseHeader("X-Imp-Count"), data); refresh(); }; var errorRetry = function() { setTimeout(refresh, nextTimeout()); }; $.get(url + '?id=' + current_id, gotData).error(errorRetry); }; $(document).ready(function() { var iframeJQ = $('#content'); iframeJQ.load(function() { // now we need to tweak the stylesheet links so that firefox will // refresh them properly $('link', frameToDocument(iframeJQ[0])).each(function(index, el) { var href = $(el).attr('href'); // Only refresh impatient-mode hosted content if(href && !/^[a-zA-z]+:\/\//.exec(href)) { $(el).attr('href', $(el).attr('href') + '?' + new Date().getTime()); } }); }); refresh(); }); </script>