CallBackery
view release on metacpan or search on metacpan
0.59.0 2026-08-20 08:58:50 +0200 Tobias Oetiker <tobi@oetiker.ch>
- New optional actionCfg property "noBusyIndicator" for download and
display actions. When set, the modal busy indicator ("Preparing
Download ...") is not shown while the download is being prepared, so
the gui stays usable for actions which take a long time to produce
their data. Default behaviour is unchanged.
0.58.4 2026-07-31 16:15:51 +0200 Tobias Oetiker <tobi@oetiker.ch>
- Frontend ui.Login: a login could be lost outright. The credentials
were copied into the hidden iframe form that exists only to make the
browser offer to save the password, and that copy ran before the
login call, unguarded. The iframe reloads /login every time the login
window appears, so whenever that fetch had not completed yet -- a
busy server is enough -- getElementById returned null, the handler
threw on it, and the login request was never sent. The form had
already disabled itself, so it just sat there greyed out with nothing
on screen to explain it, and only a reload got the user out of it.
The password manager hand-off now happens after a successful login
and is fully guarded, so it can miss the save prompt but can no
lib/CallBackery/qooxdoo/callbackery/source/class/callbackery/ui/Login.js view on Meta::CPAN
}
});
var rpc = callbackery.data.Server.getInstance();
login.addListener("execute", function(e) {
this.setEnabled(false);
var passwordValue;
if (! cfg.hide_password) {
passwordValue = password.getValue();
}
// The credentials are handed to the hidden iframe form in the
// handler, once the login actually succeeded. Nothing about the
// iframe happens before this call: it is a convenience for the
// browser's password manager and must never be able to stop a
// login. It used to run here, and whenever the iframe had not
// finished loading /login the null it returned threw before this
// line ever ran -- leaving the form disabled forever with no
// request sent and nothing on screen to say why.
rpc.callAsync(qx.lang.Function.bind(
this.__loginHandler, this, username.getValue(), passwordValue),
'login',
lib/CallBackery/qooxdoo/callbackery/source/class/callbackery/ui/Login.js view on Meta::CPAN
else if (urlCfg.app === 'passwordreset' && this.__passwordresetBtn){
this.__passwordresetBtn.fireEvent('tap');
}
},this);
},
events : { 'login' : 'qx.event.type.Event' },
members : {
/**
* Hand the credentials to the browser's password manager by filling
* the hidden iframe form and submitting it.
*
* Best effort by design. The iframe reloads /login on every appear,
* so its document can still be blank when this runs and
* getElementById then returns null. That is a missed save prompt and
* nothing more, so every step is guarded and the caller ignores the
* outcome -- this must never come between the user and their session.
*
* @param username {String} the user name to offer for saving
* @param password {String} the password to offer, may be undefined
lib/CallBackery/qooxdoo/callbackery/source/class/callbackery/ui/Login.js view on Meta::CPAN
this.debug('login iframe not ready, skipping the password save prompt');
return;
}
userField.value = username;
if (password !== undefined && passField) {
passField.value = password;
}
form.submit();
}
catch (e) {
this.debug('could not offer the credentials for saving: ' + e);
}
},
/**
* Handler for the login events
*
* @param username {String} the user name that was submitted.
* @param password {String} the password that was submitted, may be undefined.
* @param ret {Boolean} true if the login is ok and false if it is not ok.
* @param exc {Exception} any error found during the login process.
( run in 1.492 second using v1.01-cache-2.11-cpan-007c89162af )