No finta je v tom, že API cez ActiveX malo dve triedy, DSig.XadesSigAtl
a DSig.XmlPluginAtl
a bolo blokujúce, nové má jeden objekt, ditec.dSigXadesJs
, a je neblokujúce a postavené na callbackoch.
V JavaScript v princípe nie je možné spraviť blokujúci kód na základe neblokujúceho. Takže okrem toho, že prispôsobujem pôvodné API na dve triedy novej jednej (API je skoro to isté, len addXmlObject
nahradilo pôvodné CreateObject
+ AddObject
), robím celý kód asynchrónnym, takže prepisujem kód pôvodnej funkcii dsignerDoSign
tak, aby všetky volania API boli cez await
.
Aby sa dalo callbackové API použiť s async
/await
, funkciou promisify
prerábam použité metódy na Promise
: vytváram pár callbackov, v ktorých ten Promise
„dokončujem“.
Ďalší detail je to, že keď pôvodná funkcia dsignerDoSign
vracia true
(t.j. podpisovanie je úspešné), celý formulár sa odosiela na server, ktorý vyhodí nový formulár s tlačidlom „Podať“. Keďže nová asynchronná funckcia dsignerDoSign
len spúšťa kód „na pozadí“ a hneď vracia Promise
(ktorý je ekvivalentný true
), formulár sa hneď odošle ešte predtým, ako podpisovanie má šancu sa spustiť, takže hneď po vlastne spúšťaní kódu podpisovania v synchronnom kóde vraciam false
, aby sa formulár neodoslal, a potom, keď podpisovanie skončí, odosielam formulár ručne.
Ďalší problém bol, že ak v odoslanom formuláre nie je hodnota tlačidla s <input type="submit">
, server nič nespraví. Lenže ak použijem form.submit()
, táto hodnota sa tam nepridá, stáva sa to len pri stlačení tlačidla — alebo pri použití requestSubmit
, ktoré je také nové, že ešte nie je podporované v Firefox a len nedávno bolo pridané do Chromia. Takže musím znovu použiť hack: nastaviť onclick
aby vracal true
a nič iné nerobiť, a potom simulovať stlačenie tlačidla
Posledná finta je to, že skripty Greasemonkey bežia v samostatnom „pieskovisku“, tak aby som mohol injektovať funkcie do objektu window
, musím všetko zabaliť do window.eval
.