GeckoDev Wikiの遺跡

旧ページに設置してたGeckoDev Wikiに書いたもので気合が入ってたのだけをサルベージ。情報としては大変古い(たぶん2008年くらいまでの情報)。今思えばなんだか間違ってる記述 もあり。

引っかかったところ

Embeddingなどで引っかかったところを書いていきます。

nsIProfile::SetCurrentProfile

nsIProfile::SetCurrentProfileでNS_ERROR_FAILUREが帰ってくる問題。

http://mxr.mozilla.org/mozilla1.8/source/profile/src/nsProfile.cpp#1291

Mozilla1.8系ではnsIPrefConverterのdo_GetServiceが失敗していることが原因。 prefs.converted-to-utf8をtrueにしておくことでとりあえず回避できるが、根本的な解決にはなっていない気がする。 Gecko1.9ではnsIPrefConverterが呼ばれていないようだ。もしかしたら原因が違うのかも。

nsIPromptService::Prompt

Prompt(nsIDOMWindow *aParent, const PRUnichar *aDialogTitle, const PRUnichar *aText, PRUnichar **aValue, const PRUnichar *aCheckMsg, PRBool *aCheckState, PRBool *_retval)

のaCheckStateはたいていNULLなので、NS_ENSURE_ARG_POINTER(aCheckState);とかやってるとはま る。

wchar_tとPRUnichar

Windowsではwchar_tとPRUnicharは2バイトなので問題ありませんが、Linuxではwchar_tは4バイトなので、そのま まキャストしても使えません。iconv(3)で変換してやる必要があります。

nsBlockFrame

定義

http://mxr.mozilla.org/seamonkey/source/layout/generic/nsBlockFrame.h

概要

ブロック・インラインフレームのための基本となるクラス。

ブロックフレームは、絶対配置されたフレームを保持する名前付きリスト(Absolute-list)を持っている。

@see nsGkAtoms::absoluteList

参考リンク

http://developer.mozilla.org/en/docs/Block_and_Line_Layout_Cheat_Sheet

AutoComplete

<browser>要素のコンストラクタで、pageshow イベントのイベントハンドラを登録する

onPageShow でattachFormFill()を呼ぶ。

attachFormFill()は 以下のとおり。

  if (!this.mFormFillAttached && this.hasAttribute("autocompletepopup")) {
// hoop up the form fill autocomplete controller
var controller = Components.classes["@mozilla.org/satchel/form-fill-controller;1"].
getService(Components.interfaces.nsIFormFillController);
var popup = document.getElementById(this.getAttribute("autocompletepopup"));
if (popup) {
controller.attachToBrowser(this.docShell, popup.QueryInterface(Components.interfaces.nsIAutoCompletePopup));
this.mFormFillAttached = true;
}
}

まだFormFillControllerがattachされていなくて、autocompletepopup属性が設定されてい る<browser>に対してattachが行われる。attachToBrowser のIDL定義は次のとおり。

  /*
* Start controlling form fill behavior for the given browser
*
* @param docShell - The docShell to attach to
* @param popup - The popup to show when autocomplete results are available
*/
void attachToBrowser(in nsIDocShell docShell, in nsIAutoCompletePopup popup);

nsIAutoCompletePopupってなんじゃらほい。引き続き読み進む。nsFormFillController.cppに 実際のattachToBrowserがある。ここでDocShellからDOMWindowを得て、DOMWindowのfocus, blur, pagehide, mousedown, click, input, unload, compositionstart, compositionend, contextmenuイベントを監視するDOMWindow でfocusイベントが発生すると、イベントの発生元がinput type="text"であるかどうかを調べ、かつautocompleteがoffになっていないことを確かめる。そして、StartControllingInputを 呼ぶ。StartControllingInputでは、inputが属するDocShellに対応するPopupをmFocusedPopupにセット し、キー入力の監視を開始する。また、mControllerにinputをセットする。Inputイベントが発生すると、mControllerのHandleText関 数が呼ばれる。HandleTextは、テキストのいかなる変更が加えられたときに呼ばれるものである。HandleText内で、いろいろな条件を満た すと、StartSearchTimerが 呼ばれ、タイマーがスタートする。タイマーが発動すると、nsAutoCompleteController::Notifyが 呼ばれる。ここでやっとStartSearch()が 呼ばれる。検索が開始され、成功するとonSearchResultイ ベントが発生する。検索結果はProseccResultで 処理される。

眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い眠い

リンクの中クリック検出

event.targetを見ているだけでは、<a href="hoge"><span>スパーン?</span></a>という感じのリンクに対応できない ので、以下のようにする必要がある。window.addEventListenerで"click"を監視しておくこと。監視の方法はnominaまとめの コードを参照。XLink未対応。

//evtはnsIDOMEvent
nsCOMPtr<nsIDOMMouseEvent> mevt = do_QueryInterface(evt);
if(!mevt) return;
PRUint16 mouse;
mevt->GetButton(&mouse);
if(mouse!=1) return; //1ならば中ボタン
nsCOMPtr<nsIDOMEventTarget> tgt;
evt->GetTarget(getter_AddRefs(tgt));
if(!tgt) return;
nsCOMPtr<nsIDOMNode> node = do_QueryInterface(tgt);
if(!node) return;
nsCOMPtr<nsIDOMHTMLAnchorElement> anchor;
nsCOMPtr<nsIDOMHTMLAreaElement> area;
while(node){
anchor = do_QueryInterface(node);
if(anchor) break;
area = do_QueryInterface(node);
if(area) break;
nsCOMPtr<nsIDOMNode> tmp;
node->GetParentNode(getter_AddRefs(tmp));
node = tmp;
}
if(!anchor && !area) return;
nsEmbedString href;
if(anchor){
PRBool retval;
anchor->HasAttribute(NS_LITERAL_STRING("name"),&retval);
if(retval) return;
anchor->GetHref(href);
}
else if(area)
area->GetHref(href);
//ここまで来たらhrefにURIが入っている

ブラウザの機能とインターフェースの対応表

機能名 インターフェース
広告ブロック nsIContentPolicy
ブラウザウィンドウごとの画像・プラグイン等読み込み制御 nsIWebBrowserSetup・nsIDocShell
文字の大きさ変更 nsIMarkupDocumentViewer
文字エンコーディング変更 nsIMarkupDocumentViewer
DOMノードのある位置までスクロール nsIMarkupDocumentViewer
戻る履歴の保存・再現 nsISHistory
JavaScriptのロード mozIJSSubScriptLoader
ユーザースタイルシートの個別ロード nsIStyleSheetService
キャッシュ関連 nsICache で始まる香具師ら
サーバを立てる nsIServerSocket(bbs2chreaderも参考になる)
デザインモード nsIDOMNSHTMLDocument

XRE

古いです

nsXULAppAPI.h  

nsXREAppData構造体

apprunnerを開始するために必要なアプリケーション固有のデータ。

statusはFROZEN。追加フィールドが構造体の最後に将来的に追加される可能性有り。nsXREAppDataのバージョンの実行時検出はsizeフィールドを調べることで行われ得る。

この構造体がXRE_CreateAppDataにより確保され、操作されるとき、文字列フィールドはNS_Alloc で確保され、インターフェースへのポインタは強い参照になる。

PRUint32 size

この変数はsizeof(nsXULAppData)にセットされる。この構造体は将来のリリースで拡張されるかもしれないので、これがバイナリ互 換性の維持を保証する。

nsILocalFile* directory

アプリケーションが実行されるディレクトリ。XULRunnerとアプリケーションが同じディレクトリにインストールされた時はNULLでもよい。

const char *vendor

アプリケーションベンダの名前。ASCIIでなければならず、通常は「Mozilla」のように大文字と小文字が混ざる。NULLであってもよい が、これをセットすることが強く推奨される。空文字列であってはならない。

const char *name

アプリケーションの名前。ASCIIでなければならず、通常は「Firefox」のように大文字と小文字が混ざる。必須(=NULLでも空文字列で もいけない)。

const char *version

「0.8.0+」のようなメジャーバージョンを示す。NULLであってもよいが、拡張マネージャやアップデート機構のような、より進んだ機能のため には必要である。空文字列であってはいけない。

const char *buildID

「2004051604」のような、アプリケーションのビルド識別子

const char *ID

アプリケーションのUUID。互換性のある拡張機能を判断するために拡張マネージャによって使われる。オプショナルだが、拡張マネージャやアップ デート機構のような、より進んだ機能のためには必要である。

これは伝統的には"{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}"の形式だが、新規のアプリケーションに は、"appname@vendor.tld"というような、より読みやすい形式が推奨される。次に示す記号のみが許される。

a-z A-Z 0-9 - . @ _ { } *

const char *copyright

コマンドラインオプション -h で表示される著作情報。

例:Copyright (c) 2003 mozilla.org

PRUint21 flags

次章で示すNS_XRE_*定数の組み合わせ。

nsILocalFile* xreDirectory

XREのある場所。XRE_mainは自動的にこれを見つけることはできない。

const char *mixVersion / const char *maxVersion

互換性のある最小/最大のXREのバージョン。

const char *crashReporterURL

クラッシュレポートを送るURL。

const char *profile

プロファイルのディレクトリ。NULLでもよいが、空文字列であってはならない。ASCIIでなければならない。Pathは/と\で区切られる。

定数

NS_XRE_ENABLE_PROFILE_MIGRATOR = 2

プロファイルを作るとき、プロファイル移行ウィザードサービスが呼び出されるかを示す。

NS_XRE_ENABLE_EXTENSION_MANAGER = 4

拡張機能マネージャが起動時に初期化されるかを示す。

NS_XRE_ENABLE_CRASH_REPORTER = 8

Breakpadによるクラッシュ報告を使うかを示す。

XULAPPINFO_SERVICE_CONTRACTID = "@mozilla.org/xre/app-info;1"

nsIXULAppInfoのContractID。

XRE_USER_APP_DATA_DIR = "UAppData"

* A directory service key which provides the platform-correct "application
* data" directory as follows, where $name and $vendor are as defined above and
* $vendor is optional:
*
* Windows:
* HOME = Documents and Settings\$USER\Application Data
* UAppData = $HOME[\$vendor]\$name
*
* Unix:
* HOME = ~
* UAppData = $HOME/.[$vendor/]$name
*
* Mac:
* HOME = ~
* UAppData = $HOME/Library/Application Support/$name
*
* Note that the "profile" member above will change the value of UAppData as
* follows:
*
* Windows:
* UAppData = $HOME\$profile
*
* Unix:
* UAppData = $HOME/.$profile
*
* Mac:
* UAppData = $HOME/Library/Application Support/$profile

XRE_EXTENSIONS_DIR_LIST = "XREExtDL"

有効な拡張機能のリストを提供するディレクトリサービスキー。リストには互換性のあるプラットフォーム固有の拡張機能のサブディレクトリを含む。

註1
ディレクトリリストはアプリケーションがセーフモードで開始された時にはメンバに何も持たない。

XRE_EXECUTABLE_FILE = "XREExeF"

現在のプロセスを実行するために使われている実行ファイルのディレクトリサービスキーを提供する。これは下記で定義されるXRE_GetBinaryPath関数で返される値と同じである。

NS_APP_PROFILE_DIR_STARTUP = "ProfDS"

プロファイルディレクトリを定めるディレクトリサービスキー。NS_APP_USER_PROFILE_50_DIRと違い、これはプロファイルが 開始される前、またはシャットダウンされた後でも利用可能である。もしアプリケーションがプロファイルなしに実行されている場合(例えばプロファイル選択 ダイアログを表示しているとき)、このキーは利用できない。このキーはXUL apprunnerまたはXRE_InitEmbeddingに渡されるaAppDirProviderによって提供される。

NS_APP_PROFILE_LOCAL_DIR_STARTUP "ProfLDS"

プロファイルディレクトリを定めるディレクトリサービスキー。NS_APP_USER_PROFILE_LOCAL_50_DIRと違い、これはプ ロファイルが開始される前、またはシャットダウンされた後でも利用可能である。もしアプリケーションがプロファイルなしに実行されている場合(例えばプロ ファイル選択ダイアログを表示しているとき)、このキーは利用できない。このキーはXUL apprunnerまたはXRE_InitEmbeddingに渡されるaAppDirProviderによって提供される。

関数

XRE_main(int argc, char* argv[], const nsXREAppData* sAppData)

XULアプリケーションを開始する。ユーザがアプリケーションを終了しない限り返らない。

引数 argc/argv
アプリケーションに渡すコマンドライン引数。文字コードはOSネイティブなものを使う。
引数 aAppData
これから実行するアプリケーションに関する情報。
返り値
main()から返るときの、ネイティブな最適な返り値。
註1
もしバイナリがスタンドアロンなXPCOMglueとリンクされたときは、このメソッドの前にXPCOMGlueStartup()を呼ぶ必 要がある。
註2
bsmedbergによる注釈。「まだ誰もglueを使ってないけれど、潜在的な問題があるよ。Windowsでは、スタンドアロンな glueはSetCurrentDirectoryを呼ぶので、コマンドラインの相対パスがおかしくなる。」

XRE_GetFileFromPath(const char *aPath, nsILocalFile* *aResult)

カレントディレクトリからの相対パス、または絶対パスから、nsILocalFileオブジェクトを生成する。

XRE_GetBinaryPath(const char *argv0, nsILocalFile* *aResult)

実行中のアプリケーションのパスを取得し、aResultに格納する。

引数 argv0
main()のargv[0]として渡される値。この値は*nixでのみ使われ、しかもそれはバイナリのパスを決定する他の方法がすべて失敗 した時のみである。

XRE_GetStaticComponents(nsStaticModuleInfo const **aStaticComponents, PRUint32 *aComponentCount)

libxulにビルトインされた静的コンポーネントを得る。

XRE_LockProfileDirectory, (nsILocalFile* aDirectory, nsISupports* *aLockObject)

プラットフォーム固有の手法でプロファイルディレクトリをロックする。

引数aDirectory
ロックするプロファイル。
引数aLockObject
opaqueなロックオブジェクト(訳注:何て意味?)。プロファイルディレクトリはこのXPCOMへの参照が保持される限りロックされる。

XRE_InitEmbedding

(nsILocalFile *aLibXULDirectory,
nsILocalFile *aAppDirectory,
nsIDirectoryServiceProvider *aAppDirProvider,
nsStaticModuleInfo const *aStaticComponents,
PRUint32 aStaticComponentCount)

libXULを組み込み用途に初期化する。

引数aLibXULDirectory
libXUL共有ライブラリが入っているディレクトリ。
引数aAppDirectory
アプリケーションのコンポーネントとリソースが入っているディレクトリ。この引数はNS_OS_CURRENT_PROCESS_DIRディ レクトリサービスにマップされるだろう。
引数aAppDirProvider
アプリケーションのディレクトリプロバイダ。このプロバイダは、基礎的に必要なGREのキーを提供するlibxulのプロバイダによって aggregateされるだろう(訳注:ちょっと訳文がおかしい)。
引数aStaticComponents
組み込みアプリケーションによって提供される静的コンポーネント。これはXRE_GetStaticComponentsからのコンポーネントを含んではいけない。もし静的コン ポーネントが無ければNULLである。
引数aStaticComponentCount
aStaticComponentsに含まれる静的コンポーネントの数。
註1
この関数はメインスレッドから呼ばれなければならない。
註2
現在、この関数はプロセスあたり1回しか呼んではいけない。XRE_InitEmbeddingで確保されたリソースを解放するにはXRE_TermEmbeddingを使う。

XRE_NotifyProfile()

toolkitに新しいプロファイルを伝える通知を出す。このメソッドは、もしプロファイルとともに実行したい場合にはXRE_InitEmbeddingが呼ばれた後に呼ぶべきである。通常組み込み者はこのメソッドを呼ぶ前 に、ディレクトリをロックするためにXRE_LockProfileDirectoryを呼ぶべきである。

* @note There are two possibilities for selecting a profile:
註1
プロファイルの選択には以下の2つの可能性がある。

1)XRE_InitEmbeddingを呼ぶ前にプロファイルを選択する。XRE_InitEmbedding.に渡されるaAppDirProviderオブジェクトは NS_APP_USER_PROFILE_50_DIRキーを提供すべきであり、次のキーも提供するかもしれない。

このシナリオでは、XRE_NotifyProfileはXRE_InitEmbeddingの後すぐ呼ばれるべきである。コンポーネント登録情報はプロファイルに 保存されるだろう。また、JSコンポーネントはfastloadキャッシュに保存されるかもしれない。

2)XRE_InitEmbeddingの後のあるタイミングで呼ぶ。このケースでは組み込み者は次のキーを提 供するディレクトリサービスプロバイダをインストールしなければならない。

コンポーネント登録情報はアプリケーションディレクトリに格納され、JSコンポーネントはfastloadには格納されないだろう。

XRE_TermEmbedding()

XRE_InitEmbeddingまたはXRE_InitEmbedding2で開始された組み込みを終了する。

XRE_CreateAppData(nsILocalFile* aINIFile, nsXREAppData **aAppData)

application.iniファイルからnsXREAppData構造体を新しく生成する。

引数aINIFile
パースするapplication.ini。
引数aAppData
新しく確保されるnsXREAppData構造体。これを確保したら、XRE_FreeAppDataで必ず解放する必要がある。

XRE_ParseAppData(nsILocalFile* aINIFile, nsXREAppData *aAppData)

すでに存在するnsXREAppDataに対して、INIファイル(application.iniまたは override.ini)をパースする。

引数aINIFile
パースするINIファイル
引数aAppData
パース結果を入れるnsXREAppData構造体。

XRE_FreeAppData(nsXREAppData *aAppData)

XRE_CreateAppDataで確保したnsXREAppData構造体を解放する。