ClearCode - 株式会社クリアコード

UxUによるGreasemonkeyスクリプトのテスト

概要

テストケースの実行コンテキストではGM_xmlhttpRequest()などの代表的なGM関数を利用できます。ヘルパーメソッドutils.include()などを使用してGreasemonkeyスクリプトを読み込むことで、Greasemonkeyスクリプト内で定義された関数などのテストを行えます。

また、実際のWebページ上でのスクリプトの動作をテストするために、テスト用のページを読み込んでその上でスクリプトを動作させることもできます。以下は、sample1.user.jssample2.user.jsのテストの例です。

var description = 'Greasemonkey test';

// ページの読み込み完了を待つため、非同期型のテストにする。
var isAsync = true;

var sandbox;

function setUp() {
  // まず、テスト用のページを読み込む。
  yield Do(greasemonkey.load('http://www.clear-code.com/'));
  // サンドボックス内にGreasemonkeyスクリプトを読み込む。
  // greasemonkey.loadScript()の返り値はそのスクリプト用に
  // 生成されたサンドボックス。
  sandbox = greasemonkey.loadScript('sample1.user.js');
  greasemonkey.loadScript('sample2.user.js');
}

function tearDown() {
  // テスト用ページ、サンドボックスを破棄
  yield Do(greasemonkey.unload());
}

function testDefined() {
  // スクリプト内で定義された関数や変数は、
  // そのスクリプト用に作成されたサンドボックスの
  // プロパティとしてアクセスできる。
  assert.isDefined(sandbox.setAndGetValue);
}

function testGetTitleAndURI() {
  // サンドボックスは、スクリプト名を指定して
  // 必要な時点で取得することもできる。
  var anotherSandbox = greasemonkey.getSandboxFor('sample2.user.js');
  assert.isTrue(anotherSandbox.getDocumentTitleAndURI());
}

function testGMFunction() {
  // イベントリスナを登録してGM関数の処理をハンドリングできる。
  var listener = {
      key   : null,
      value : null,
      onGM_setValueCall : function(aEvent) {
        // GM_setValueが呼ばれた時にここに来る。
        this.key = aEvent.key;
        this.value = aEvent.value;
      }
    };
  greasemonkey.addListener(listener);

  sandbox.setAndGetValue();
  assert.equals('testKey', listener.key);
  assert.equals('testValue', listener.value);
}

function testPageLoading() {
  assert.isNull(sandbox.loadedPageTitle);
  // GM_xmlhttpRequestを使用する関数を実行し、
  // 読み込みの完了を待って次に進む
  yield Do(greasemonkey.doAndWaitLoad(function() {
             sandbox.loadAndGetPageTitle();
           }));
  assert.equals('サービス -ClearCode Inc.', sandbox.loadedPageTitle);
}

テストケースで利用可能なヘルパーメソッド

Object greasemonkey.load(in String aURI)
テスト用のブラウザフレーム内に、指定したURIを読み込みます。実行すると、valueプロパティにfalseがセットされたオブジェクトを返します。ロード完了後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。なお、前回読み込まれたページに対して読み込まれたスクリプト用のサンドボックスやイベントリスナはすべて破棄されます。
Object greasemonkey.unload()
テスト用のブラウザフレーム内に読み込まれたページを破棄し、スクリプト用のサンドボックスやイベントリスナをすべて破棄します。実行すると、valueプロパティにfalseがセットされたオブジェクトを返します。ページの破棄完了後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。
Object greasemonkey.open(in String aURI)
テスト用のブラウザウィンドウを開き、指定したURIを読み込みます。実行すると、valueプロパティにfalseがセットされたオブジェクトを返します。ウィンドウが開かれてページが読み込まれた後、返り値として返したオブジェクトのvalueプロパティをtrueにセットします。なお、前回読み込まれたページに対して読み込まれたスクリプト用のサンドボックスやイベントリスナはすべて破棄されます。
void greasemonkey.close()
テスト用のブラウザウィンドウを閉じ、スクリプト用のサンドボックスやイベントリスナをすべて破棄します。ウィンドウが開かれていない場合は何もしません。
Object greasemonkey.loadScript(in String aURI)
指定したURIのスクリプトに対してサンドボックスを生成し、そのサンドボックスを実行コンテキストとしてスクリプトを評価します。返り値は生成されたサンドボックスです。
Object greasemonkey.getSandboxFor(in String aURI)
指定したURIのスクリプトに対して生成されたサンドボックスを取得します。
Object greasemonkey.doAndWaitLoad(in Function aFunction, [in Object aContext])
渡された関数を実行し、valueプロパティにfalseがセットされたオブジェクトを返します。GM_xmlhttpRequest()による通信が完了すると、返り値として返したオブジェクトのvalueプロパティがtrueになります。渡された関数内やこのヘルパーメソッドの実行の直前にGM_xmlhttpRequest()が呼ばれていない場合、UxUはタイムアウトするまで待った後にテスト失敗と見なします。
void greasemonkey.addListener(in Object aEventListener)
イベントリスナ(後述)を登録します。
void greasemonkey.removeListener(in Object aEventListener)
登録済みのイベントリスナ(後述)を削除します。

以上のユーティリティメソッドはグローバル関数としても利用できます。グローバル関数として利用する場合の名前は以下のようになります(引数等の利用法は全く同一です): greasemonkeyLoad(), greasemonkeyUnload(), greasemonkeyLoadScript(), greasemonkeyGetSandboxFor(), greasemonkeyAddListener(), greasemonkeyRemoveListener()

イベントリスナによるイベントの捕捉

greasemonkey.addListener()には、以下のようなオブジェクトをイベントリスナとして登録できます。

var listener = {
      onGM_xmlhttpRequestCall : function(aEvent) {
      },
      onGM_xmlhttpRequestBeforeLoad : function(aEvent) {
      },
      onGM_xmlhttpRequestLoad : function(aEvent) {
      }
    };

イベント名に対応するメソッドを定義する代わりに、handleEvent()でもイベントを捕捉できます。

var listener = {
      handleEvent : function(aEvent) {
        switch (aEvent.type)
        {
          case 'GM_xmlhttpRequestCall':
            break;
          case 'GM_xmlhttpRequestBeforeLoad':
            break;
          case 'GM_xmlhttpRequestLoad':
            break;
        }
      }
    };

イベントリスナが捕捉できるイベントは以下の通りです。

GM関数が発行するイベントの一覧
イベント名発行タイミング渡されるイベントオブジェクトが持つプロパティ
GM_logCall GM_log()が呼ばれた時。
type
イベント名
message
渡されたメッセージ
GM_getValueCall GM_getValue()が呼ばれた時。
type
イベント名
key
渡されたキー名
GM_setValueCall GM_setValue()が呼ばれた時。
type
イベント名
key
渡されたキー名
value
渡された値
GM_xmlhttpRequestCall GM_xmlhttpRequest()が呼ばれた時。
type
イベント名
details
引数として渡されたオブジェクト
GM_xmlhttpRequestBeforeLoad GM_xmlhttpRequest()による読み込みが完了し、loadイベントが発行された時。
type
イベント名
state
GM_xmlhttpRequest()の引数で定義されたイベントリスナにこれから渡される、読み込みの状態を格納したオブジェクト
GM_xmlhttpRequestLoad GM_xmlhttpRequest()による読み込みが完了し、loadイベントが発行され、Greasemonkeyスクリプトで定義されたイベントリスナによる処理が完了した時。
type
イベント名
state
イベントリスナに渡された、読み込みの状態を格納したオブジェクト
handled
イベントリスナによって処理が行われたかどうかを示す真偽値
GM_xmlhttpRequestBeforeError GM_xmlhttpRequest()による読み込みが中断され、errorイベントが発行された時。
type
イベント名
state
GM_xmlhttpRequest()の引数で定義されたイベントリスナにこれから渡される、読み込みの状態を格納したオブジェクト
GM_xmlhttpRequestError GM_xmlhttpRequest()による読み込みが中断され、errorイベントが発行され、Greasemonkeyスクリプトで定義されたイベントリスナによる処理が完了した時。
type
イベント名
state
イベントリスナに渡された、読み込みの状態を格納したオブジェクト
handled
イベントリスナによって処理が行われたかどうかを示す真偽値
GM_xmlhttpRequestBeforeReadystatechange GM_xmlhttpRequest()による読み込みが進行し、readystatechangeイベントが発行された時。
type
イベント名
state
GM_xmlhttpRequest()の引数で定義されたイベントリスナにこれから渡される、読み込みの状態を格納したオブジェクト
GM_xmlhttpRequestReadystatechange GM_xmlhttpRequest()による読み込みが進行し、readystatechangeイベントが発行され、Greasemonkeyスクリプトで定義されたイベントリスナによる処理が完了した時。
type
イベント名
state
イベントリスナに渡された、読み込みの状態を格納したオブジェクト
handled
イベントリスナによって処理が行われたかどうかを示す真偽値
GM_registerMenuCommandCall GM_registerMenuCommand()が呼ばれた時。
type
イベント名
name
コマンドの名前
function
コマンド(関数)
accelKey
アクセラレータキー
accelModifiers
アクセラレータキーのための修飾キー
accessKey
アクセスキー
GM_addStyleCall GM_addStyle()が呼ばれた時。
type
イベント名
document
スタイルの適用対象として指定されたDOMDocument
style
渡されたスタイル指定
GM_getResourceURLCall GM_getResourceURL()が呼ばれた時。
type
イベント名
GM_getResourceTextCall GM_getResourceText()が呼ばれた時。
type
イベント名
GM_openInTabCall GM_openInTab()が呼ばれた時。
type
イベント名
uri
渡されたURI

©2006-2008 ClearCode Inc.