1

再起動のないアドオンで nsICommandLineHandler を実装する方法はありますか?

https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/platform/xpcom.htmlから可能と思われますが、このコード (exports.main 内から実行) は機能していません私のため:

var { Class } = require('sdk/core/heritage');
var { Unknown, Factory } = require('sdk/platform/xpcom');
var { Cc, Ci } = require('chrome');

var contractId = '@mozilla.org/commandlinehandler/general-startup;1?type=webappfind';

// Define a component
var CommandLineHandler = Class({
  extends: Unknown,
  get wrappedJSObject() this,

  classDescription: "webAppFinder",
  /* Not used by SDK, so commenting out
  _xpcom_categories: [{  
    category: "command-line-handler",  
    // category names are sorted alphabetically. Typical command-line handlers use a  
    // category that begins with the letter "m".  
    entry: "m-webappfind"  
  }],
  */
  helpInfo : "  -webappfind               Open My Application\n",
  // nsICommandLineHandler
  handle : function clh_handle(cmdLine) {
    try {
        console.log('good so far'); // Doesn't actually reach here
        var fileStr = cmdLine.handleFlagWithParam("webappfind", false);
        if (fileStr) {
          console.log('made it');
        }
    }
    catch (e) {
        Cu.reportError("incorrect parameter passed to -webappfind on the command line.");
    }

    if (cmdLine.handleFlag("webappfind", false)) { // no argument
        cmdLine.preventDefault = true;
        throw 'A valid ID must be provided to webappfind';
    }
  },
  hello: function() {return 'Hello World';}
});

// Create and register the factory
var factory = Factory({
  contract: contractId,
//  id: '{7f397cba-7a9a-4a05-9ca7-a5b8d7438c6c}', // Despite the docs saying one can add both, this doesn't work
  Component: CommandLineHandler
});

その後、次のコードが機能します...

// XPCOM clients can retrieve and use this new
// component in the normal way
var wrapper = Cc[contractId].createInstance(Ci.nsISupports);
var helloWorld = wrapper.wrappedJSObject;
console.log(helloWorld.hello());

...しかし、Firefox は次のエラーのようにコマンド ライン引数を受け入れません。

エラー: 警告: 認識されないコマンド ライン フラグ -webappfind

ソースファイル: resource://app/components/nsBrowserContentHandler.js 行: 765

アップデート

@nmaier のアドバイスに従ってカテゴリを追加したため、後で次の行を追加しました。

var catMan = Cc['@mozilla.org/categorymanager;1'].getService(Ci.nsICategoryManager); //
catMan.addCategoryEntry('command-line-handler', 'm-webappfind' /*contractId*/, contractId, false, true);

しかし、コマンドラインから呼び出すと、次の 3 つのエラーが発生します。

エラー: [例外...「メソッド呼び出し時の「失敗」: [nsIFactory::createInstance]」nsresult:「0x80004005 (NS_ERROR_FAILURE)」場所:「ネイティブ フレーム :: :: :: 行 0」データ: no]

コントラクト ID '@mozilla.org/commandlinehandler/general-startup;1?type=webappfind' はエントリ 'm-webappfind' のコマンド ライン ハンドラとして登録されましたが、作成できませんでした。

エラー: 警告: 認識されないコマンド ライン フラグ -webappfind

ソースファイル: resource://app/components/nsBrowserContentHandler.js 行: 765

4

1 に答える 1

1

SDK はカテゴリを登録しません。

カテゴリに関するコメントは、 https ://stackoverflow.com/a/18366485/484441 で確認できます 。

それでも、最初のコマンド ラインが処理される前に、ブートストラップされた拡張機能が実際に開始されるかどうかはわかりません。試行錯誤、というか…

編集: あなたのコンポーネントはインターフェースを指定していないため、サポートするのはnsISupports. SDK モジュールのドキュメントには、interfaces: [ 'nsICommandLineHandler' ]プロパティを追加する必要があると記載されています。

于 2013-08-24T21:31:26.373 に答える