Bild von Florian Koch
Software Engineer, Frontend Experte

Problem im Firefox mit Asp.NET unter Verwendung des JavaScript Strict-Modus ... und eine Lösung

firefox logo

Viele JavaScript-Entwickler setzen auf den mit ECMAScript 5 eingeführten Strict-Modus, da dieser den Entwickler zu einem saubereren Code-Stil zwingt. Dazu wird einfach ganz oben in eine Funktion

'use strict';
geschrieben und schon verdreifacht sich die Fehlerzahl, da der Browser weniger Code-Schludrigkeiten verzeiht. Im Strict-Modus treten viele Fehler schon beim Testen durch den Entwickler auf und nicht erst wenn der veraltete Browser eines Besuchers über ein Komma zu viel stolpert.
Oder eine falsche Variable überschrieben wird, da man das Keyword var vergessen hat.
Oder wenn man versucht ein Objektattribut zu deleten.
... Um nur ein paar Fälle zu nennen! :)

Firefox und das StackTrace


Dieser Modus bringt in Verbindung mit Asp.NET und Firefox jedoch ein Problemchen mit sich: Die häufig aufgerufene Asp.NET-Funktion __doPostBack() enthält einen Code, der ein StackTrace baut. Dazu wird das Attribut .caller verwendet, um die zuletzt aufgerufenen Funktionen zu durchlaufen. Leider ist dieses Attribut für Strict-Modus-Funktionen nicht erlaubt, und somit verabschiedet sich Firefox mit der Meldung

TypeError: access to strict mode caller function is censored


Wie ich auf das Problem aufmerksam wurde


Auf dieses Problem bin ich in einem Projekt gestoßen, als ich einen Asp:LinkButton per jQuery „anklicken“ musste. $button.click(); funktionierte dabei von vornherein nicht in allen Browsern, daher blieb nur noch eval($button.attr('href')); Da das jedoch die __doPostBack() Funktion im href-Attribut direkt ausführt, bricht Firefox wegen oben genanntem Problem im Strict-Modus zusammen.
Auch große und bekannte Projekte sind darüber bereits gestolpert, so findet sich ganz oben im jQuery Source folgender Kommentar:

[..]
// Support: Firefox 18+
// Can't be in strict mode, several libs including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
//"use strict";
Quelle: https://raw.githubusercontent.com/jquery/jquery/10399ddcf8a239acc27bdec9231b996b178224d3/src/intro.js


Die Lösung für das Asp.net + Firefox + Strict-Modus Problem!


Bei der Suche nach einer Lösung dafür, kam mir eine einfache und gut funktionierende Idee: Es genügt, den aufrufenden Code durch eine sich selbst aufrufende Funktion zu schicken. Dadurch verrennt sich der .caller-Loop in der Rekursion, endet bei der von Asp.NET definierten Rekursionstiefe von 30 und bricht den StackTrace ab.
Um das zu verdeutlichen, hier der Code-Ausschnitt:

// No 'use strict'; here. The following functions are loose.
window.aspNetUseStrictFirefoxFixer = function (callback, recursion) {
    if (recursion) {
        if ($.isFunction(callback)) {
            callback();
        }
    } else {
        aspNetUseStrictFirefoxFixer(callback, true);
    }
}
// simulates click on a link button (execute it's JS function)
$.fn.clickLinkButton = function () {
    var href = $(this).attr('href');
    window.aspNetUseStrictFirefoxFixer(function () {
        eval(href);
    });
}

Das ganze wird dann so aufgerufen:

'use strict';
[..]
$button.clickLinkButton();

Ich habe im Netz keine brauchbaren Lösungen dazu gefunden und hätte durch diesen Post einigen Arbeitsaufwand einsparen können.
Daher würde ich mich freuen, wenn das jemand nützlich findet,
happy coding!

Kommentare
Es wurden noch keine Kommentare zu diesem Eintrag geschrieben.
Kommentar hinzufügen
Vor und Zuname
E-Mail
E-Mail bei weiteren Kommentaren
Mein Kommentar