Notiz an mich selber: JS-Security in Safari ist strenger als in Firefox

JavaScript schreiben und mit dem Firefox testen kann also irreführend sein! Heut habe ich über zwei Stunden Lebenszeit vergeudet, weil Firefox offenbar bestimmte JavaScript-Dinge anders regelt als Safari.

Beispiel: Ich hab einen Video-Embed-Code, der auf einer normalen HTML-Seite herumliegt. Ich möchte, dass sich auf Knopfdruck ein Popup öffnet, in das der besagte Embed-Code hineinkopiert werden soll. In Firefox kein Problem:

embedcode = document.getElementById('video');
newwindow = window.open('video-leer.html', 'fenstername');

Die Variable embedcode kann nun ohne Probleme auch im soeben geöffneten Popup verwendet werden – die Umgebung opener macht’s möglich:

document.getElementById('videocontainer').appendChild(opener.embedcode);

Theoretisch klappt das auch im Safari. Er sieht dort auch den opener.embedcode und kann erkennen, welche Art von Objekt es ist. Aber er schafft es nicht, das Objekt als Kind irgendwo anzuhängen! Des Rätsels Lösung liegt darin, dass embedcode kein Verweis auf den Embed-Code sein darf, sondern ein Clone! Offenbar ist es nicht möglich, in Safari ein Objekt aus einem anderen Fenster in das aktuelle Fenster hineinzukleben. Im Ausgangsdokument muss es also heißen:

embedcode = document.getElementById('video').cloneNode(true);

Erst dann klappt es sowohl in Firefox als auch in Safari.