--- title: SpecialPowers slug: Mozilla/Projects/Mochitest/SpecialPowers tags: - Mochistest - NeedsContent - QA - 'QA:Tools' - Reference translation_of: Mozilla/Projects/Mochitest/SpecialPowers ---
SpecialPowers は Mochitest のテストで利用可能な API 群の 1 つです。Mochitest は通常の Web ページとしてかけるようにする予定です。しかし、セキュリティ的な理由から権限の無い通常の Web ページではテストできないものもあります。そういった場合に SpecialPowers API を使う事で通常の Web ページでは触れることのできない操作をすることができます。
void pushPrefEnv(inPrefs, callback); |
void popPrefEnv(callback); |
void flushPrefEnv(callback); |
bool getBoolPref(aPrefName); |
int getIntPref(aPrefName); |
string getCharPref(aPrefName); |
any getComplexValue(aPrefName); |
void setBoolPref(aPrefName, aValue); |
void setIntPref(aPrefName, aValue); |
void setCharPref(aPrefName, aValue); |
void setComplexValue(aPrefName, aValue); |
void clearUserPref(aPrefName); |
void pushPermissions(inPermissions, callback); |
void popPermissions(callback); |
void flushPermissions(callback); |
void addPermission(type, allow, arg); |
void removePermission(type, arg); |
bool hasPermission(type, arg); |
bool testPermission(type, value, arg); |
void setFullscreenAllowed(document); |
void removeFullscreenAllowed(document); |
TBD
TBD
Object wrap(Object); |
Cc |
Ci |
Cr |
Cu |
TBD
bool isMainProcess(); |
string getMozFullPath(file); |
bool isWindowPrivate(aWindow); |
bool isBackButtonEnabled(aWindow); |
int assertionCount(); |
void removeExpectedCrashDumpFiles(aExpectingProcessCrash); |
string[] findUnexpectedCrashDumpFiles(); |
TBD
TBD
TBD
TBD
TBD
TBD
TBD
TBD
TBD
XMLHttpRequest createSystemXHR(); |
void quit(); |
DOMWindowUtils getDOMWindowUtils(window); |
void executeSoon(aFun, aWindow); |
object getDOMRequestService(); |
void openDialog(aWindow, aArg); |
string sanityCheck(); |
| Attribute | Type | Description |
|---|---|---|
DOMWindowUtils |
||
Services |
内部的に、このメソッドがどのように使われているかは {{ interface("nsIPrefBranch") }} のドキュメントを参照してください。
getBoolPref(aPrefName)boolean 型として aPrefName のプリファレンス値を取得します。
getIntPref(aPrefName)integer 型として aPrefName のプリファレンス値を取得します。
getCharPref(aPrefName)string 型として aPrefName のプリファレンス値を取得します。
getComplexValue(aPrefName)XPCOM オブジェクトとして aPrefName のプリファレンス値を取得します。
setBoolPref(aPrefName, aValue)boolean 型の aValue を aPrefName をキーとしてプリファレンスへ設定します。
setIntPref(aPrefName, aValue)integer 型の aValue を aPrefName をキーとしてプリファレンスへ設定します。
setCharPref(aPrefName, aValue)string 型の aValue を aPrefName をキーとしてプリファレンスへ設定します。
setComplexValue(aPrefName, aValue)XPCOM オブジェクトの aValue を aPrefName をキーとしてプリファレンスへ設定します。
clearUserPref(aPrefName)aPrefName のプリファレンス値を初期値に戻します。
TBD
addChromeEventListener(type, listener, capture, allowUntrusted)TabChildGlobal オブジェクトにイベントリスナーを登録します。
removeChromeEventListener(type, listener, capture)TabChildGlobal オブジェクトからイベントリスナーを除去します。
gc()強制的にガベージコレクションを発生させます。
Object wrap(Object)chrome オブジェクトにアクセスするために chrome オブジェクトをラップします。(例えば) XPCOM コンポーネントを返すメソッドの戻り値にアクセスするためには必要です。
CcComponents.classes の値を取得できます。これは chrome コード内で取得できるものと同じです。
CiComponents.interfaces の値を取得できます。これは chrome コード内で取得できるものと同じです。
CrComponents.results の値を取得できます。これは chrome コード内で取得できるものと同じです。
CuComponents.utils の値を取得できます。これは chrome コード内で取得できるものと同じです。
TBD
TBD
TBD
MockFilePickerこれは読み込み・保存のコードをテストするために、標準 File Picker をスクリプトで制御可能にするものに置換します。これを使うと、以下のコードをテストすることができます。
var MockFilePicker = SpecialPowers.MockFilePicker; MockFilePicker.reset(); // You must call reset before each test
このパッチ ではMockFilePicker の使い方と XPCShell テストの使い方の良い例です。 testing/mochitest/MockFilePicker.jsm のコードが参考になるでしょう。
TBD
TBD
TBD
TBD
TBD
loadChromeScript()TBD
TBD
createSystemXHR()完全な "system privileges" を持った XMLHttpRequest を生成して返します。言い換えれば以下の事が可能になります。
referer (sic) ヘッダー無しでリクエストを要求できます。もし referer ヘッダーを設定したい場合は、xhr.setRequestHeader を使って手動で設定する必要があります。しかし、xhr オブジェクトをパースしたドキュメントや xhr.responseXML からアクセスしたドキュメントは null principal として生成されています。そのため、ドキュメントでできることに制限があります。
sanityCheck()"foo" という文字列を返します。
もし現在定義されていない権限が必要な関数をテストしたい場合、SpecialPowers オブジェクトに新しい API を追加することができます。
プロセス外 (out-of-process) のコンテンツをサポートするために、SpecialPowers の実装は以下の 2 つのファイルに分離されています。
両方のファイルは chrome 権限で実行されます。しかし XPCOM API は恐らくコンテンツプロセスでは利用できないでそう。もし特殊な API でそれを利用する場合は Electrolysis や Mobile チームに相談するべきです。プロセス間メッセージの仕組みについての情報を知りたい場合、 Message Manager のドキュメントを参照してください。
{{ interface("nsIScreenManager") }} インターフェイスの numberOfScreens をアクセス可能にする修正を例にしてみましょう。このインターフェイスはコンテンツアプリではアクセス不可能ですので、サンプルコードでそれを可能にしてみましょう。まず初めに、コンテンツで利用できるように SpecialPowers に新しい API を定義した方が良いでしょう。このオブジェクトは {{ Source("testing/specialpowers/content/specialpowers.js", "the content script") }} に定義します。
__exposedProps__ property のようにアンダースコア("_") から始まるプロパティを定義することでプロパティを隠すことができます。アンダースコアから始まる関数もプライベートになります。最初にSpecialPowers に numberOfScreens のゲッターを追加しましょう。単純に chrome プロセスにブロッキングメッセージを送信し、応答として値を返すだけです。
var SpecialPowers = {
// existing APIs
//...
// Provide nsIScreenManager.numberOfScreens
get numberOfScreens() {
// You could pass additional parameters in the second parameter, consult the message manager documentation for more details.
// Ideally this would be a memoizing getter, that's somewhat out of scope for this document.
return sendSyncMessage("SPNumberOfScreens", {})[0];
}
};
このとき、対応するメッセージのハンドラーを {{ Source("testing/specialpowers/components/SpecialPowersObserver.js", "chrome observer script") }} に定義する必要があります。SpecialPowersObserver.observe 関数の中で、以下の実在するメッセージを登録します。
// Register for any messages our API needs us to handle
messageManager.addMessageListener("SPPrefService", this);
messageManager.addMessageListener("SPNumberOfScreens", this);
そして、SpecialPowersObserver.receiveMessage 関数の中で、新しいメッセージの分岐を追加し結果を返します。
receiveMessage: function(aMessage) {
switch(aMessage.name) {
case "SPPrefService":
// existing code...
case "SPNumberOfScreens":
var screenManager = Components.classes["@mozilla.org/gfx/screenmanager;1"]
.getService(Components.interfaces.nsIScreenManager);}
return screenManager.numberOfScreens;
default:
これで終わりです。
この修正を反映させるために、testing/mochitest ディレクトリを再ビルドする必要があるでしょう。これで Mochitest でSpecialPowers.numberOfScreens を利用することができるようになります。