XUL の tips

XBL Properties, XBL Methods にアクセスする:

レンダリング後に有効になる。XUL のイベントには詳しくないので正確なタイミングはよく分からない。

window.addEventListener('load', function(event){
    // ここで有効になる
}, false);

textbox type="autocomplete"

イベント発行の実装に問題がある。と思う。(chrome/toolkit.jar/content/global/autocomplete.xml/_fireEvent)
onsearchcomplete, ontextentered, ontextreverted は文字列でなければいけない。これらは .addEventListener() で登録したハンドラーは呼び出されない。

textbox type="autocomplete" を動的に設定する
window.addEventListener('DOMContentLoaded', function(event){
    var nodes = document.getElementsByTagName('textbox');
    for (var i = 0; i < nodes.length; i++){
        var node = nodes[i];
        node.type = 'autocomplete';
    }
}, false);
window.addEventListener('load', function(event){
    var nodes = document.getElementsByTagName('textbox');
    for (var i = 0; i < nodes.length; i++){
        var node = nodes[i];
        // XBL に触れるようになってる。実装依存な予感
    }
}, false);

chrome://foo/locale

chrome://foo/locale には普通に触れる。ここにスクリプト置いて参照するとかもできる。

xpath

DOM は救いがたいどうしようもないクソなので xpath を積極的に使う方が開発にかかる時間も精神的にも楽。
標準のインターフェースはクソなので autopagerize.user.js の getElementsByXPath() と getFirstElementByXPath() が好き。
XMLHttpRequest().responseXML とかでも使えるし、HTML も↓みたいに変換すれば使える。

function createHTMLDocument(text){
    var xml = <html xmlns="http://www.w3.org/1999/xhtml"></html>;
    var doc = Components.classes['@mozilla.org/xmlextras/domparser;1']
        .createInstance(Components.interfaces.nsIDOMParser)
        .parseFromString(xml.toXMLString(), 'application/xml');

    var uri = Components.classes['@mozilla.org/network/io-service;1']
        .getService(Components.interfaces.nsIIOService)
        .newURI('http://example.com/', null, null);

    var fragment = Components.classes['@mozilla.org/feed-unescapehtml;1']
        .getService(Components.interfaces.nsIScriptableUnescapeHTML)
        .parseFragment(text, false, uri, doc.createElement('xml'));
    doc.documentElement.appendChild(fragment);

    return doc;
}

IME の制御

以下の式やらキーワードで調べたが、現状ではスクリプトからは触れない。
ImmGetOpenStatus()
nsWindow::GetIMEOpenState
nsIDOMWindowUtils::IMEIsOpen
nsIDOMWindowUtils::IMEStatus
window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils)
window.getInterface(Components.interfaces.nsIDOMWindowUtils)

nsIKBStateControl::GetIMEOpenState
nsIKBStateControl::SetIMEOpenState
nsIMEStateManager