505 lines
18 KiB
HTML
505 lines
18 KiB
HTML
<!--
|
|
|
|
VM Console tab
|
|
Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
|
|
|
|
$Id: tabVMConsoleRDP.html 595 2015-04-17 09:50:36Z imoore76 $
|
|
|
|
-->
|
|
<div id='vboxTabVMUnavailable' style='display: none' class='translate'>Virtual machine is not running or is not configured to accept RDP connections.</div>
|
|
<div id='vboxRDPFormContainer' style='padding-top: 8px; display: none'>
|
|
<form name="vboxRDPForm" id="vboxRDPForm">
|
|
<div class='vboxInvisible' id='vboxRDPConnParams'>
|
|
|
|
<span id='vboxConsoleLoginInfo'>
|
|
<span class='translate'>User name</span>: <input class='vboxRDPSet' type=text size=20 name=logonUsername value="">
|
|
<span class='translate'>Password</span>: <input class='vboxRDPSet' type=password size=20 name=logonPassword value="">
|
|
</span>
|
|
|
|
<span class='translate'>Requested desktop size</span>:
|
|
<select id='vboxRDPSize' name='vboxRDPSizeSelect'>
|
|
<option value='800x600'>800x600</option>
|
|
<option value='1024x768'>1024x768</option>
|
|
<option value='1280x1024'>1280x1024</option>
|
|
</select>
|
|
|
|
</div>
|
|
<p>
|
|
<input name=connectionButton type=button value="Connect" onclick="vboxRDPConnect();" />
|
|
<input type='text' id='vboxConsoleAddr' name='serverAddress' class='vboxRDPSet' value='' />
|
|
<!-- and hardcore web dev guys across the world frown ... //-->
|
|
|
|
<input name=cadButton id='vboxConsoleCADButton' style='display: none' type=button value="Ctrl-Alt-Del" onClick="vboxRDPsendCAD()" />
|
|
<input id='vboxVRDPDetachBtn' style='display: none' name='detach' type='button' value='Detach' onClick="vboxRDPDetach();" />
|
|
<span id='vboxRDPStatus'></span>
|
|
</p>
|
|
</form>
|
|
</div>
|
|
|
|
<div id="FlashRDPContainer" style='width: 100%;'>
|
|
<div id="FlashRDP" style='width: 100%;'></div>
|
|
</div>
|
|
|
|
|
|
<script type="text/javascript">
|
|
|
|
var vboxRDPFlashLoaded = false;
|
|
var vboxConsoleDetached = (vboxConsoleDetached || false);
|
|
var vboxRDPFlashListenersAdded = false;
|
|
|
|
$('#vboxRDPForm').on('submit',function(e){
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
return false;
|
|
});
|
|
|
|
// Custom resolutions
|
|
if($("#vboxPane").data('vboxConfig').consoleResolutions) {
|
|
var res = $("#vboxPane").data('vboxConfig').consoleResolutions;
|
|
// first one must be valid
|
|
if(res[0].split('x').length == 2) {
|
|
document.vboxRDPForm.vboxRDPSizeSelect.options.length = 0;
|
|
$(document.vboxRDPForm.vboxRDPSizeSelect).children().remove();
|
|
for(var i = 0; i < res.length; i++) {
|
|
document.vboxRDPForm.vboxRDPSizeSelect.options[i] = new Option(res[i],res[i]);
|
|
}
|
|
}
|
|
}
|
|
// Translations
|
|
$('#vboxTabVMConsole').find(".translate").html(function(i,h){return trans(h,'VBoxConsoleWgt');}).removeClass('translate');
|
|
$(document.vboxRDPForm.connectionButton).val(trans('Connect','VBoxConsoleWgt'));
|
|
$(document.vboxRDPForm.cadButton).val(trans("Send Ctrl-Alt-Del",'VBoxConsoleWgt'));
|
|
$(document.vboxRDPForm.vboxVRDPDetachBtn).val(trans("Detach",'VBoxConsoleWgt'));
|
|
$("#vboxRDPStatus").html(trans("Loading ...",'UIVMDesktop'));
|
|
if(vboxConsoleDetached) window.status = $("#vboxRDPStatus").text();
|
|
|
|
// Disable / enable tab on selection list changes
|
|
$('#vboxPane').on('vmSelectionListChanged', function(){
|
|
|
|
var vm = vboxChooser.getSingleSelected();
|
|
|
|
// Initially disable tab
|
|
$('#vboxTabVMConsole').parent().trigger('disableTab', ['vboxTabVMConsole']);
|
|
|
|
if(!vm || !vboxVMStates.isRunning(vm)) {
|
|
$('#vboxRDPFormContainer').css({'display':'none'});
|
|
$('#FlashRDPContainer').css({'visibility':'hidden'});
|
|
$('#vboxTabVMUnavailable').css({'display':'none'});
|
|
|
|
} else {
|
|
|
|
// VM is running, get runtime data
|
|
$.when(vboxVMDataMediator.getVMDataCombined(vm.id)).done(function(info) {
|
|
|
|
if(info.VRDEServerInfo && info.VRDEServerInfo.port > 0 && info.VRDEServer.VRDEExtPack.indexOf("VNC") == -1) {
|
|
|
|
$('#vboxRDPFormContainer').css({'display':''});
|
|
$('#FlashRDPContainer').css({'visibility':'visible'});
|
|
$('#vboxTabVMUnavailable').css({'display':'none'});
|
|
|
|
$('#vboxTabVMConsole').parent().trigger('enableTab', ['vboxTabVMConsole']);
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
// Update on console info change
|
|
}).on('vboxOnVRDEServerInfoChanged',function(e,eventData) {
|
|
|
|
// Shorthand
|
|
var vmid = eventData.machineId;
|
|
var VRDEServerInfo = eventData.enrichmentData;
|
|
|
|
var selVM = vboxChooser.getSingleSelected();
|
|
var enabled = (selVM && selVM.id == vmid && vboxVMStates.isRunning(selVM) && VRDEServerInfo && VRDEServerInfo.port > 0);
|
|
|
|
if(enabled) {
|
|
|
|
$.when(vboxVMDataMediator.getVMDataCombined(vmid)).done(function(info) {
|
|
|
|
enabled = (info.VRDEServerInfo && info.VRDEServerInfo.port > 0 && info.VRDEServer.VRDEExtPack.indexOf("VNC") == -1);
|
|
|
|
if(enabled) {
|
|
|
|
$('#vboxTabVMConsole').parent().trigger('enableTab', ['vboxTabVMConsole']);
|
|
|
|
$('#vboxRDPFormContainer').css({'display':''});
|
|
$('#FlashRDPContainer').css({'visibility':'visible'});
|
|
$('#vboxTabVMUnavailable').css({'display':'none'});
|
|
|
|
|
|
var chost = vboxGetVRDEHost(selVM);
|
|
chost+=':'+VRDEServerInfo.port;
|
|
|
|
if($(document.vboxRDPForm.serverAddress).val() != chost) {
|
|
|
|
// console host changed
|
|
vboxRDPDisconnect();
|
|
|
|
}
|
|
$(document.vboxRDPForm.serverAddress).val(chost);
|
|
} else {
|
|
$('#vboxTabVMConsole').parent().trigger('disableTab', ['vboxTabVMConsole']);
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
$('#vboxTabVMConsole').parent().trigger('disableTab', ['vboxTabVMConsole']);
|
|
}
|
|
|
|
// Update tab on machine state change
|
|
}).on('vboxOnMachineStateChanged', function(e, eventData){
|
|
|
|
var selVMId = vboxChooser.getSingleSelectedId();
|
|
var enabled = (selVMId == eventData.machineId && vboxVMStates.isRunning({'state':eventData.state}));
|
|
|
|
$('#vboxTabVMConsole').parent().trigger('disableTab', ['vboxTabVMConsole']);
|
|
|
|
if(enabled) {
|
|
|
|
// VM is running, get runtime data
|
|
$.when(vboxVMDataMediator.getVMRuntimeData(eventData.machineId)).done(function(vm) {
|
|
|
|
if(vm.VRDEServerInfo && vm.VRDEServerInfo.port > 0) {
|
|
|
|
$('#vboxTabVMConsole').parent().trigger('enableTab', ['vboxTabVMConsole']);
|
|
|
|
$('#vboxRDPFormContainer').css({'display':''});
|
|
$('#FlashRDPContainer').css({'visibility':'visible'});
|
|
$('#vboxTabVMUnavailable').css({'display':'none'});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// Clean up local data storage when a machine is unregistered
|
|
}).on('vboxMachineRegistered', function(e, eventData) {
|
|
|
|
if(!eventData.registered) {
|
|
vboxSetLocalDataItem('vbox'+eventData.machineId+'ConsoleSize','',true);
|
|
vboxSetLocalDataItem('vbox'+eventData.machineId+'ConsoleConnected','',true);
|
|
}
|
|
});
|
|
|
|
/*
|
|
* Populate console info values when this tab is shown
|
|
*/
|
|
|
|
$('#vboxTabVMConsole').on('show',function(){
|
|
|
|
var vm = vboxChooser.getSingleSelected();
|
|
|
|
if(!vm || !vboxVMStates.isRunning(vm)) {
|
|
$('#vboxRDPFormContainer').css({'display':'none'});
|
|
$('#FlashRDPContainer').css({'visibility':'hidden'});
|
|
$('#vboxTabVMUnavailable').css({'display':''});
|
|
return;
|
|
}
|
|
|
|
$('#vboxConsoleLoginInfo').hide();
|
|
|
|
/* Load runtime data. This will tell us if the VRDE server is actually active */
|
|
/* And details. This will give us info about the VRDEServer configuration */
|
|
$.when(vboxVMDataMediator.getVMRuntimeData(vm.id),vboxVMDataMediator.getVMDetails(vm.id))
|
|
.done(function(runtimeData, detailsData) {
|
|
|
|
/* Not active */
|
|
if(!(runtimeData.VRDEServerInfo && runtimeData.VRDEServerInfo.port > 0)) {
|
|
$('#vboxTabVMUnavailable').css({'display':''});
|
|
$('#vboxTabVMConsole').parent().trigger('disableTab',['vboxTabVMConsole']);
|
|
return;
|
|
}
|
|
|
|
// Hide login form if authtype is not set
|
|
if(detailsData.VRDEServer.authType != 'Null') {
|
|
$('#vboxConsoleLoginInfo').show();
|
|
}
|
|
$('#vboxConsoleLoginInfo').data('vboxVRDPauthType',detailsData.VRDEServer.authType);
|
|
|
|
/* Active */
|
|
$('#vboxRDPFormContainer').css({'display':''});
|
|
$('#FlashRDPContainer').css({'visibility':'visible'});
|
|
$('#vboxTabVMUnavailable').css({'display':'none'});
|
|
|
|
vboxRDPDisconnect();
|
|
$("#vboxRDPStatus").html('');
|
|
if(vboxConsoleDetached) window.status = $("#vboxRDPStatus").text();
|
|
|
|
var chost = vboxGetVRDEHost(detailsData);
|
|
chost+=':'+runtimeData.VRDEServerInfo.port;
|
|
$(document.vboxRDPForm.serverAddress).val(chost);
|
|
|
|
// Set default console size for this VM?
|
|
var cs = vboxGetLocalDataItem('vbox'+detailsData.id+'ConsoleSize');
|
|
if(cs) {
|
|
$(document.vboxRDPForm.vboxRDPSizeSelect).children('[value='+cs+']').first().prop('selected',true);
|
|
}
|
|
|
|
$('#vboxRDPFormContainer').css({'display':''});
|
|
|
|
vboxRDPLoad();
|
|
});
|
|
|
|
});
|
|
|
|
function vboxRDPLoad() {
|
|
|
|
var flashvars = {};
|
|
var params = {};
|
|
params.wmode="opaque";
|
|
params.menu="false";
|
|
params.bgcolor="#e9e9e9";
|
|
params.quality="low";
|
|
params.allowScriptAccess="always";
|
|
params.flashId="FlashRDP";
|
|
|
|
var attributes = {};
|
|
swfobject.embedSWF("rdpweb/RDPClientUI.swf", "FlashRDP", "100", "100", "9.0.0","", flashvars, params, attributes);
|
|
|
|
var ua = swfobject.ua;
|
|
|
|
// No flash installed
|
|
if(!ua || ua.pv[0] == '0') {
|
|
$('#vboxRDPFormContainer').css('display','none');
|
|
$("#FlashRDP").css('width','100%').html("The Adobe Flash plugin is not installed.");
|
|
}
|
|
}
|
|
|
|
function vboxRDPgetFlashProperty(name) {
|
|
var flash = RDPWebClient.getFlashById("FlashRDP");
|
|
try {
|
|
return flash.getProperty(name);
|
|
} catch (e) {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/*
|
|
* RDP client event handlers.
|
|
* They will be called when the flash movie is ready and some event occurs.
|
|
* Note: the function name must be the "flash_id" + "event name".
|
|
*/
|
|
function RDPWebEventLoaded(flashid) {
|
|
|
|
vboxRDPFlashLoaded = true;
|
|
$("#vboxRDPStatus").html(trans("Version",'UIVMDesktop') + ": " + vboxRDPgetFlashProperty("version"));
|
|
if(vboxConsoleDetached) window.status = $("#vboxRDPStatus").text();
|
|
|
|
var flash = RDPWebClient.getFlashById("FlashRDP");
|
|
|
|
// Apply keyboard layout
|
|
flash.setProperty("keyboardLayout", ($('#vboxPane').data('vboxConfig').consoleKeyboardLayout == 'DE' ? 'de' : 'en'));
|
|
|
|
// Only do this once
|
|
if(!vboxRDPFlashListenersAdded) {
|
|
|
|
if (window.addEventListener) {
|
|
window.addEventListener("contextmenu", function(event) { return RDPWebClient._MozillaContextMenu(event); }, true);
|
|
window.addEventListener("mousedown", function(event) { return RDPWebClient._MozillaMouse(event, true); }, true);
|
|
window.addEventListener("mouseup", function(event) { return RDPWebClient._MozillaMouse(event, false); }, true);
|
|
flash.addEventListener("mouseout", function(event) { return RDPWebClient._MozillaMouseOut(event); }, true);
|
|
} else {
|
|
document.oncontextmenu = function() { return RDPWebClient._IEContextMenu(); };
|
|
flash.parentNode.onmousedown = function() { return RDPWebClient._IEMouse(true); };
|
|
flash.parentNode.onmouseup = function() { return RDPWebClient._IEMouse(false); };
|
|
flash.onmouseout=function() {return RDPWebClient._IEMouseOut(); };
|
|
}
|
|
|
|
vboxRDPFlashListenersAdded = true;
|
|
|
|
}
|
|
|
|
// Connect if "detached"
|
|
if(vboxConsoleDetached) {
|
|
$('#vboxTabVMUnavailable').css({'display':'none'});
|
|
$('#vboxRDPFormContainer').css({'display':'none'});
|
|
$('#vboxRDPSize').val($(window.opener.document.getElementById('vboxRDPSize')).val());
|
|
$('#vboxRDPFormContainer').find(".vboxRDPSet").each(function(){
|
|
$(this).val(window.opener.document.forms['vboxRDPForm'][$(this).attr('name')].value);
|
|
});
|
|
$(window).on('resize',function(){
|
|
var flash = RDPWebClient.getFlashById("FlashRDP");
|
|
var wh = [ $(window).width()-2, $(window).height()-2 ];
|
|
$(flash).css({'height':wh[1]+'px','width':wh[0]+'px'});
|
|
$('#FlashRDP').css({'height':wh[1]+'px','width':wh[0]+'px'});
|
|
flash.setProperty("displayWidth", wh[0]);
|
|
flash.setProperty("displayHeight", wh[1]);
|
|
$(flash).css({'display':'none'});
|
|
$(flash).css({'display':'block'});
|
|
});
|
|
vboxRDPConnect();
|
|
} else {
|
|
|
|
$('#vboxRDPConnParams').show();
|
|
$('#vboxRDPFormContainer').css('display','');
|
|
|
|
// Did not explicitly disconnect from this VM and has no auth settings so reconnect
|
|
if(vboxGetLocalDataItem('vbox'+vboxChooser.getSingleSelectedId()+'ConsoleConnected') == 'true' && $('#vboxConsoleLoginInfo').data('vboxVRDPauthType') == 'Null') {
|
|
document.vboxRDPForm.connectionButton.click();
|
|
}
|
|
}
|
|
}
|
|
|
|
function RDPWebEventConnected(flashId) {
|
|
$("#vboxRDPStatus").data('vmConnected',true);
|
|
$("#vboxRDPStatus").html(trans("Connected to %1",'VBoxConsoleWgt').replace('%1',$(document.vboxRDPForm.serverAddress).val()));
|
|
if(vboxConsoleDetached) window.status = $("#vboxRDPStatus").text();
|
|
$('#vboxConsoleCADButton').show();
|
|
$('#vboxVRDPDetachBtn').show();
|
|
}
|
|
|
|
function RDPWebEventServerRedirect(flashId) {
|
|
$("#vboxRDPStatus").html(trans("Redirection by %1",'VBoxConsoleWgt').replace('%1',vboxRDPgetFlashProperty("serverAddress")));
|
|
if(vboxConsoleDetached) window.status = $("#vboxRDPStatus").text();
|
|
}
|
|
|
|
function RDPWebEventDisconnected(flashId) {
|
|
|
|
$("#vboxRDPStatus").data('vmConnected',false);
|
|
|
|
$('#vboxRDPConnParams').show();
|
|
$('#vboxVRDPDetachBtn').hide();
|
|
|
|
/* RDP connection has been lost */
|
|
$("#vboxRDPStatus").html(trans("Disconnect reason",'VBoxConsoleWgt')+":\n" + vboxRDPgetFlashProperty("lastError"));
|
|
if(vboxConsoleDetached) {
|
|
alert($("#vboxRDPStatus").text());
|
|
window.close();
|
|
}
|
|
document.vboxRDPForm.connectionButton.value = trans("Connect",'VBoxConsoleWgt');
|
|
document.vboxRDPForm.connectionButton.onclick=function() {
|
|
vboxSetLocalDataItem('vbox'+vboxChooser.getSingleSelectedId()+'ConsoleSize',$('#vboxRDPSize').val(),true);
|
|
vboxSetLocalDataItem('vbox'+vboxChooser.getSingleSelectedId()+'ConsoleConnected','true',true);
|
|
return vboxRDPConnect();
|
|
};
|
|
$('#vboxConsoleAddr').css('display','');
|
|
$('#vboxConsoleCADButton').hide();
|
|
|
|
$('#vboxRDPFormContainer').css({'display':''});
|
|
}
|
|
|
|
|
|
function vboxRDPConnect() {
|
|
|
|
vboxSetLocalDataItem('vbox'+vboxChooser.getSingleSelectedId()+'ConsoleSize',$('#vboxRDPSize').val(), true);
|
|
|
|
if (!vboxRDPFlashLoaded) return false;
|
|
|
|
var flash = RDPWebClient.getFlashById("FlashRDP");
|
|
if (!flash) return;
|
|
|
|
$('#vboxRDPConnParams').hide();
|
|
|
|
document.vboxRDPForm.connectionButton.value = trans("Disconnect",'VBoxConsoleWgt');
|
|
document.vboxRDPForm.connectionButton.onclick=function(){
|
|
vboxSetLocalDataItem('vbox'+vboxChooser.getSingleSelectedId()+'ConsoleConnected');
|
|
return vboxRDPDisconnect();
|
|
};
|
|
|
|
$('#vboxConsoleAddr').css('display','none');
|
|
$('#FlashRDPContainer').css({'visibility':'visible'});
|
|
|
|
|
|
var flash = RDPWebClient.getFlashById("FlashRDP");
|
|
|
|
var wh = null;
|
|
if(vboxConsoleDetached) {
|
|
wh = [ $(document).width()-2, $(document).height()-2 ];
|
|
} else {
|
|
wh = $('#vboxRDPSize').val().split('x');
|
|
}
|
|
$(flash).css({'height':wh[1]+'px','width':wh[0]+'px'});
|
|
flash.setProperty("displayWidth", wh[0]);
|
|
flash.setProperty("displayHeight", wh[1]);
|
|
|
|
/* Setup the client parameters. */
|
|
$('#vboxRDPFormContainer').find(".vboxRDPSet").each(function(){
|
|
flash.setProperty($(this).attr('name'),$(this).val());
|
|
});
|
|
|
|
$("#vboxRDPStatus").html(trans("Connecting to %1",'VBoxConsoleWgt').replace('%1',$(document.vboxRDPForm.serverAddress).val()) + "...");
|
|
if(vboxConsoleDetached) window.status = $("#vboxRDPStatus").html();
|
|
|
|
/* Establish the connection. */
|
|
flash.connect();
|
|
|
|
}
|
|
|
|
function vboxRDPDisconnect() {
|
|
var flash = RDPWebClient.getFlashById("FlashRDP");
|
|
if (flash) try { flash.disconnect(); } catch (err) {};
|
|
/* Restore the "Connect" form. And resize flash*/
|
|
document.vboxRDPForm.connectionButton.value = trans("Connect",'VBoxConsoleWgt');
|
|
document.vboxRDPForm.connectionButton.onclick=function() {
|
|
vboxSetLocalDataItem('vbox'+vboxChooser.getSingleSelectedId()+'ConsoleConnected','true',true);
|
|
vboxSetLocalDataItem('vbox'+vboxChooser.getSingleSelectedId()+'ConsoleSize',$('#vboxRDPSize').val(),true);
|
|
vboxRDPConnect();this.blur();
|
|
};
|
|
$('#vboxConsoleCADButton').hide();
|
|
$(flash).css({'height':'100px','width':'100px'});
|
|
$('#vboxConsoleAddr').css('display','');
|
|
|
|
}
|
|
|
|
function vboxRDPsendCAD() {
|
|
var flash = RDPWebClient.getFlashById("FlashRDP");
|
|
if (flash) flash.keyboardSendCAD();
|
|
}
|
|
|
|
function vboxRDPDetach() {
|
|
|
|
vboxRDPDisconnect();
|
|
|
|
var vmname = vboxChooser.getSingleSelected().name;
|
|
var wh = $('#vboxRDPSize').val().split('x');
|
|
var newwin = window.open('about:blank','vboxConsoleDetachedWin'+vmname.replace(/[^a-zA-Z0-9]/g,'_'),'toolbar=0,menubar=0,location=0,directories=0,status=true,resize=true,width='+(parseInt(wh[0])+20)+',height='+(parseInt(wh[1])+20)+'');
|
|
|
|
newwin.document.open();
|
|
newwin.document.write('<html><head><title>'+vmname + ' - ' + trans('Console','UIVMDesktop')+'</title></head><body style="margin: 0px; border: 0px; padding: 0px; overflow: hidden;"><div style="margin: 0px; border: 0px; padding: 0px" id="vboxPane"><img src="images/spinner.gif" /></div></body></html>');
|
|
newwin.document.close();
|
|
newwin.trans = function(t) { return t; };
|
|
var newHead = newwin.document.getElementsByTagName('HEAD')[0];
|
|
|
|
var headTags = document.getElementsByTagName('HEAD')[0].getElementsByTagName('SCRIPT');
|
|
for(var i = 0; i < headTags.length; i++) {
|
|
|
|
// Ignore runtime scripts
|
|
if(!$(headTags[i]).attr('src')) continue;
|
|
|
|
var script = newwin.document.createElement('script');
|
|
script.setAttribute('type','text/javascript');
|
|
script.setAttribute('src',$(headTags[i]).attr('src'));
|
|
newHead.appendChild(script);
|
|
}
|
|
// Load self
|
|
var script = newwin.document.createElement('script');
|
|
script.setAttribute('type','text/javascript');
|
|
script.text = "var vboxConsoleDetached = true;\
|
|
function vboxConsoleCheckLoad() {\
|
|
if(vboxLoader && jQuery) vboxConsoleDetachedOnload();\
|
|
else setTimeout(\"vboxConsoleCheckLoad()\",1000);\
|
|
}\
|
|
function vboxConsoleDetachedOnload(){\
|
|
l = new vboxLoader();\
|
|
l.add('getConfig',function(d){$('#vboxPane').data('vboxConfig',d.responseData);});\
|
|
l.addFile('panes/tabVMConsoleRDP.html',function(d){$('#vboxPane').children().remove();$('#vboxPane').append(d);$('#vboxTabVMConsole').css('display','');vboxRDPLoad();});\
|
|
l.run();};\
|
|
setTimeout(\"vboxConsoleCheckLoad()\",1000);";
|
|
newHead.appendChild(script);
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
<iframe style="height:0px;width:0px;visibility:hidden" src="about:blank">
|
|
this frame prevents back forward cache in Safari
|
|
</iframe>
|
|
|