mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
fhemweb.js: fix iOS bug for not queueing requests (Forum #116962)
git-svn-id: https://svn.fhem.de/fhem/trunk@23405 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
ed9370316e
commit
ee8a6c68a0
@ -179,6 +179,7 @@ FHEMWEB_Initialize($)
|
|||||||
hiddenroomRegexp
|
hiddenroomRegexp
|
||||||
httpHeader
|
httpHeader
|
||||||
iconPath
|
iconPath
|
||||||
|
jsLog:1,0
|
||||||
longpoll:0,1,websocket
|
longpoll:0,1,websocket
|
||||||
longpollSVG:1,0
|
longpollSVG:1,0
|
||||||
logDevice
|
logDevice
|
||||||
@ -420,10 +421,12 @@ FW_Read($$)
|
|||||||
my $idx = 0;
|
my $idx = 0;
|
||||||
$data = pack("C*", map { $_ ^ $m[$idx++ % 4] } unpack("C*", $data));
|
$data = pack("C*", map { $_ ^ $m[$idx++ % 4] } unpack("C*", $data));
|
||||||
}
|
}
|
||||||
$hash->{BUF} = "";
|
|
||||||
my $ret = FW_fC($data);
|
my $ret = FW_fC($data);
|
||||||
FW_addToWritebuffer($hash,
|
FW_addToWritebuffer($hash,
|
||||||
FW_longpollInfo("JSON", defined($ret) ? $ret : "")."\n");
|
FW_longpollInfo("JSON", defined($ret) ? $ret : "")."\n");
|
||||||
|
$hash->{BUF} = substr($hash->{BUF}, $i+$len);
|
||||||
|
FW_Read($hash, 1) if($hash->{BUF});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1198,6 +1201,7 @@ FW_dataAttr()
|
|||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
addParam("jsLog", 0).
|
||||||
addParam("confirmDelete", 1).
|
addParam("confirmDelete", 1).
|
||||||
addParam("confirmJSError", 1).
|
addParam("confirmJSError", 1).
|
||||||
addParam("addHtmlTitle", 1).
|
addParam("addHtmlTitle", 1).
|
||||||
@ -3966,6 +3970,12 @@ FW_log($$)
|
|||||||
each HTTP Header X can be accessed via %{X}i.
|
each HTTP Header X can be accessed via %{X}i.
|
||||||
</li><br>
|
</li><br>
|
||||||
|
|
||||||
|
<a name="jsLog"></a>
|
||||||
|
<li>jsLog [1|0]<br>
|
||||||
|
if set, and longpoll is websocket, send the browser console log
|
||||||
|
messages to the FHEM log. Useful for debugging tablet/phone problems.
|
||||||
|
</li><br>
|
||||||
|
|
||||||
<a name="longpoll"></a>
|
<a name="longpoll"></a>
|
||||||
<li>longpoll [0|1|websocket]<br>
|
<li>longpoll [0|1|websocket]<br>
|
||||||
If activated, the browser is notifed when device states, readings or
|
If activated, the browser is notifed when device states, readings or
|
||||||
@ -4726,6 +4736,13 @@ FW_log($$)
|
|||||||
</li><br>
|
</li><br>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="jsLog"></a>
|
||||||
|
<li>jsLog [1|0]<br>
|
||||||
|
falls gesetzt, und longpoll=websocket, dann werden Browser
|
||||||
|
Konsolenmeldungen in das FHEM-Log geschrieben. Nützlich bei der
|
||||||
|
Fehlersuche auf Tablets oder Handys.
|
||||||
|
</li><br>
|
||||||
|
|
||||||
<a name="longpoll"></a>
|
<a name="longpoll"></a>
|
||||||
<li>longpoll [0|1|websocket]<br>
|
<li>longpoll [0|1|websocket]<br>
|
||||||
Falls gesetzt, FHEMWEB benachrichtigt den Browser, wenn
|
Falls gesetzt, FHEMWEB benachrichtigt den Browser, wenn
|
||||||
|
@ -3,10 +3,13 @@ var FW_version={};
|
|||||||
FW_version["fhemweb.js"] = "$Id$";
|
FW_version["fhemweb.js"] = "$Id$";
|
||||||
|
|
||||||
var FW_serverGenerated;
|
var FW_serverGenerated;
|
||||||
|
var FW_jsLog;
|
||||||
var FW_serverFirstMsg = (new Date()).getTime()/1000;
|
var FW_serverFirstMsg = (new Date()).getTime()/1000;
|
||||||
var FW_serverLastMsg = FW_serverFirstMsg;
|
var FW_serverLastMsg = FW_serverFirstMsg;
|
||||||
var FW_isIE = (navigator.appVersion.indexOf("MSIE") > 0);
|
var FW_isIE = (navigator.appVersion.indexOf("MSIE") > 0);
|
||||||
var FW_isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/);
|
var FW_isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/) ||
|
||||||
|
(navigator.platform === 'MacIntel' &&
|
||||||
|
navigator.maxTouchPoints > 1); /* iPad OS 13+ */
|
||||||
var FW_scripts = {}, FW_links = {};
|
var FW_scripts = {}, FW_links = {};
|
||||||
var FW_docReady = false, FW_longpollType, FW_csrfToken, FW_csrfOk=true;
|
var FW_docReady = false, FW_longpollType, FW_csrfToken, FW_csrfOk=true;
|
||||||
var FW_root = "/fhem"; // root
|
var FW_root = "/fhem"; // root
|
||||||
@ -80,9 +83,11 @@ FW_jqueryReadyFn()
|
|||||||
if(FW_docReady) // loading fhemweb.js twice is hard to debug
|
if(FW_docReady) // loading fhemweb.js twice is hard to debug
|
||||||
return;
|
return;
|
||||||
FW_docReady = true;
|
FW_docReady = true;
|
||||||
FW_serverGenerated = $("body").attr("generated");
|
|
||||||
|
|
||||||
|
FW_serverGenerated = $("body").attr("generated");
|
||||||
|
FW_jsLog = $("body").attr("data-jsLog");
|
||||||
FW_longpollType = $("body").attr("longpoll");
|
FW_longpollType = $("body").attr("longpoll");
|
||||||
|
|
||||||
var ajs = $("body").attr("data-availableJs");
|
var ajs = $("body").attr("data-availableJs");
|
||||||
if(ajs) {
|
if(ajs) {
|
||||||
ajs = ajs.split(",");
|
ajs = ajs.split(",");
|
||||||
@ -500,16 +505,27 @@ FW_delayedStart()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var FW_logStack=[];
|
||||||
function
|
function
|
||||||
log(txt)
|
log(txt)
|
||||||
{
|
{
|
||||||
var d = new Date();
|
var d = new Date();
|
||||||
var ms = ("000"+(d.getMilliseconds()%1000));
|
var ms = ("000"+(d.getMilliseconds()%1000));
|
||||||
ms = ms.substr(ms.length-3,3);
|
ms = ms.substr(ms.length-3,3);
|
||||||
txt = d.toTimeString().substring(0,8)+"."+ms+" "+txt;
|
var lTxt = d.toTimeString().substring(0,8)+"."+ms+" "+txt;
|
||||||
if(typeof window.console != "undefined")
|
if(typeof window.console != "undefined")
|
||||||
|
console.log(lTxt);
|
||||||
|
|
||||||
|
if(FW_jsLog && FW_longpollType == "websocket") {
|
||||||
|
FW_logStack.push(txt);
|
||||||
|
if(FW_pollConn && FW_pollConn.readyState == FW_pollConn.OPEN) {
|
||||||
|
while(FW_logStack.length) {
|
||||||
|
txt = '{Log 1, "jsLog: '+FW_logStack.shift().replace(/"/g, "'")+'"}';
|
||||||
console.log(txt);
|
console.log(txt);
|
||||||
|
FW_pollConn.send(txt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function
|
function
|
||||||
@ -540,7 +556,7 @@ FW_csrfRefresh(callback)
|
|||||||
}
|
}
|
||||||
|
|
||||||
function
|
function
|
||||||
FW_cmd(arg, callback)
|
FW_cmd(arg, callback, rep)
|
||||||
{
|
{
|
||||||
if(arg.length < 120)
|
if(arg.length < 120)
|
||||||
log("FW_cmd:"+arg);
|
log("FW_cmd:"+arg);
|
||||||
@ -548,6 +564,8 @@ FW_cmd(arg, callback)
|
|||||||
log("FW_cmd:"+arg.substr(0,120)+"...");
|
log("FW_cmd:"+arg.substr(0,120)+"...");
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url:addcsrf(arg)+'&fw_id='+$("body").attr('fw_id'),
|
url:addcsrf(arg)+'&fw_id='+$("body").attr('fw_id'),
|
||||||
|
headers: { "cache-control": "no-cache" },
|
||||||
|
dataType: "text",
|
||||||
method:'POST',
|
method:'POST',
|
||||||
success: function(data, textStatus, req){
|
success: function(data, textStatus, req){
|
||||||
FW_csrfOk = true;
|
FW_csrfOk = true;
|
||||||
@ -557,9 +575,18 @@ FW_cmd(arg, callback)
|
|||||||
FW_errmsg(req.responseText, 5000);
|
FW_errmsg(req.responseText, 5000);
|
||||||
},
|
},
|
||||||
error:function(xhr, status, err) {
|
error:function(xhr, status, err) {
|
||||||
if(xhr.status == 400 && typeof FW_csrfToken != "undefined") {
|
// iOS 13+ is not queueing requests, have to do it myself. Forum #116962
|
||||||
|
if(xhr.status == 0 && xhr.readyState == 0 && (!rep || rep < 10)) {
|
||||||
|
rep = (rep ? rep+1 : 1);
|
||||||
|
log("FW_cmd retry #"+rep);
|
||||||
|
setTimeout(function(){FW_cmd(arg, callback, rep)}, 200);
|
||||||
|
|
||||||
|
} else if(xhr.status == 400 && typeof FW_csrfToken != "undefined") {
|
||||||
FW_csrfToken = "";
|
FW_csrfToken = "";
|
||||||
FW_csrfRefresh(function(){FW_cmd(arg, callback)});
|
FW_csrfRefresh(function(){FW_cmd(arg, callback)});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
log("FW_cmd error: "+status+"/"+JSON.stringify(xhr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1098,6 +1125,7 @@ FW_doUpdate(evt)
|
|||||||
var l = input.substr(FW_longpollOffset, nOff-FW_longpollOffset);
|
var l = input.substr(FW_longpollOffset, nOff-FW_longpollOffset);
|
||||||
FW_longpollOffset = nOff+1;
|
FW_longpollOffset = nOff+1;
|
||||||
|
|
||||||
|
if(l != '[""]') // jsLog answer
|
||||||
log("Rcvd: "+(l.length>132 ? l.substring(0,132)+"...("+l.length+")":l));
|
log("Rcvd: "+(l.length>132 ? l.substring(0,132)+"...("+l.length+")":l));
|
||||||
if(!l.length)
|
if(!l.length)
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user