SafariとDOMParserとvideoタグ

Safari において、 DOMParser から生成した video タグを body に追加するとさまざまな不具合に遭遇する。

これをなんとか解決できないかと、いくつかのコードを書いて試してみた。

上記ではなんとか Safari にて正常に動作させることができた。ただ、アプリ内の WebView では動画の問題は解決できたものの、コントロールの問題は解決できていなかった。

さらに試して以下のようなコードであれば、動画とコントロールの両方を表示できた。

// この時点でDOMParserから生成されたvideoタグが既にbodyに追加されているものとする

const videos = document.querySelectorAll('video');

if (videos.length <= 0) {
return;
}

type HTMLVideoElementEx = HTMLVideoElement & {
[key: string]: string | boolean;
};

for (const video of videos) {
const videoElement = document.createElement('video') as HTMLVideoElementEx;

// HACK: videoタグの生成直後に追加するとコントロールが正常に描画される
document.body.appendChild(videoElement);

const attributes = video.attributes;

for (const attribute of attributes) {
const { name, value } = attribute;

if (name in videoElement) {
videoElement[name] =
typeof videoElement[name] === 'boolean' ? true : value;
} else {
videoElement.setAttribute(name, value);
}
}

videoElement.append(...video.childNodes);
video.replaceWith(videoElement);
}

こんなワークアラウンドを実行したくはないが、 Safari が修正されるまでは仕方がない。