NN4 の 4KB問題

NN4.x には link タグでスタイルシートを document.write すると HTMLファイルの 4KB境界位置に余分な文字列を挿入するバグがあるようです。

そこで、この現象が正確にはどのようなものか分析してみましょう。

1. 正常ケース
<link rel="stylesheet" type="text/css" href="NN4_4kb.css">
を単に document.write する

2. テストケース1
正常ケースの document.write の内容を次のようにする
<link rel="stylesheet" type="text/css" href="NN4_4kb.css">\n
==> HTMLファイルの先頭から 4KB(0x1000)の位置に改行が挿入される

つまり、<link rel="stylesheet"... > に改行コードを付けると HTML が壊れることになります。

3. テストケース2
テストケース1の HTML で document.write する scriptタグの前に 4KB以上のデータを記述する

==> HTMLファイルの先頭から 8KB(0x2000)の位置に改行が挿入される
#> document.write は先頭から 4,731(0x127B)byte目から始まる

多分、壊れる位置は 4KB固定ではなく document.write した位置から 4KB で切り上げた位置が 壊れるようです。

4. テストケース3
テストケース1の HTML で document.write する scriptタグの中で document.write の直後に 4KB以上のデータを記述する

==> HTMLファイルの先頭から 8KB(0x2000)の位置に改行が挿入される
#> document.write は先頭から 516(0x0204)byte目から始まる

つまり正確には、壊れる位置は document.write の位置ではなく script タグの終了位置から切り上げた場所のようです

5. テストケース4
テストケース1の HTML で 改行を別途 document.write する

==> 正常(改行は挿入されない)

改行出力が問題ではなく linkタグ( stylesheet )の解釈上の問題であると想定されます

6. テストケース5
テストケース1の HTML で 改行の代わりに <link rel="index" href="index.htm"> を出力する

==> 一見正常に見えるが実際には 4KB(0x1000)の位置に改行の代わりに出力したコードが挿入される

正確には <link rel="stylesheet"... > の次の出力データの出力位置が 間違っていることが分かります。

補足

このような現象は必ず表示に現れるとは限りません。

この現象が発生しているかどうかを確認するには読み込んだ HTML のソースではなく document.write の出力を展開した表示用の HTML を見る必要があります。

NN4.x はこれらの動作の結果をキャッシュの形で保存しますので、 確認にはこれらのファイルの内容を見て判断します。

NN4.x のアドレスバーに "about:cache" を入力すればどのファイルが何のキャッシュかを 判断できます。この中で URL が wysiwyg で始まるファイルが表示に使用されたファイルです。

また、間違った挿入をする位置は表示に使用したファイルではなく 読み込んだ HTML ソース上でバイナリエディタなどを使用して確認する必要があります。

また、このような現象が発生する組合せは linkタグ以外にもあるようです。

これらの情報の元ネタは 春永浩敏さんからの情報 です。
#> ども、ありがとうございます。


(c) 2001 ShinSoft. All rights reserved.