window.sizeToContent()がLinux版Firefoxで動作しない条件について

関連記事:
window.sizeToContent()がおかしい(当ブログ内)
ConQuery 1.7.3 改造版その3β3(Shadow912's Mozilla/Firefox 日本語版拡張置き場)

その後、window.sizeToContent()を1回呼び出しただけでは「検索の設定」ダイアログが適切にリサイズされず高さ1pxになる件について調べた所、未だ原因は掴めていないが、この現象が発生する条件(=有力な回避方法)を見つけた。

結論から書くと、dialog要素(id=cq-list)にwidth属性が設定されている場合に、ウィンドウの幅がその値に固定され、一回目のsizeToContent()でリサイズされなくなる。(このときheight属性が設定されていないとウィンドウの高さは1pxになり、指定されているとその高さ+1pxになる。つまり高さもリサイズされない。)
ただし、width(height)がmaxwidth(maxheight)より大きかったり、minwidth(minheight)より小さいなど、実現不可能な場合は、sizeToContent()が一回で適切にリサイズしてくれる。(widthとheightのいずれか一方が実現不可能ならOK。)
また、width(height)属性が、javascriptで設定されていても、xulで設定されていても動作は同じ様だ。

ConQueryではchrome://conquery/content/list.jsの以下の部分で、「extensions.conquery.Main.QueryConfigWidth」に設定された値を、cq-listのwidth属性に設定している。

document.getElementById("cq-list").setAttribute('width', cqrEnv.QueryConfigWidth);

この部分をコメントアウトするか、'width'を'minwidth'に変えてやればLinux版でもsizeToContent()が一回で済む。*1
特にminwidthを使う方法は、Windowsでの動作は変わらず(追記参照)、実装の元々の意図を実現する方法として好ましいのではないか。


ちなみにLinuxでは、sizeToContent()を二回呼び出す方法と、widthを削除もしくはminwidthに変える方法では動作が変わる。
例えば以下のようなlabelがやや長い検索プラグインの場合

<?xml version="1.0"  encoding="UTF-8"?>
<ConQueryPlugin xmlns="http://geek.net.ru/en/opensource/conquery/">
<ShortName>いろは歌</ShortName>
<Description>やや長い</Description>
<InputEncoding>UTF-8</InputEncoding>
<Url type="text/html" method="GET" template="http://www.example.com">
<Param name="url" value="{prompt}" label="いろはにほへと ちりぬるを わかよたれそ つねならむ"/>
<Param name="url" value="{searchTerms}" label="デフォルト"/>
</Url>
</ConQueryPlugin>


sizeToContent()二回では、グリッドの右側の列がつぶれてしまうが、widthを削除もしくはminwidthに変える方法ではグリッドの右側も長さをたもっている。


追記:
Windowsの場合も、width指定はグリッドの右側がつぶれてしまうが、widthを削除もしくはminwidthに変える方法では、グリッドの右側が長さを保っている。やはりminwidth指定が良さそう。

*1:他にlist.xulでminheight="2px"とか、せこい手もある。