0

私は2日以上、この特定のレンガの壁に頭をぶつけてきました。Firefox拡張機能で使用するXPCOMサービスを作成しようとしていますが、Firefoxのエラーコンソールに次のエラーが表示されてコンポーネントを初期化できません。

Timestamp: 07/06/2012 09:23:28 Error: uncaught exception: [Exception... 
"Component returned failure code: 0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE)
[nsIJSCID.getService]"  nsresult: "0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE)"
location: "JS frame :: chrome://logger/content/logger.js :: <TOP_LEVEL> :: line 21"
data: no]

ted.mielczarek.orgの優れたボイラープレートジェネレーターを使用して、コンポーネントを最小限に抑えました。コンポーネントコードは次のとおりです...

const nsISupports = Components.interfaces.nsISupports;
const CLASS_ID = Components.ID("808e1607-caea-418c-b563-d9fe1df6ee08");
const CLASS_NAME = "Test component";
const CONTRACT_ID = "@test/loggerservice;1";

function LoggerService() {
  this.wrappedJSObject = this;
}

LoggerService.prototype = {
  QueryInterface: function(aIID)
  {
    if (!aIID.equals(nsISupports))
      throw Components.results.NS_ERROR_NO_INTERFACE;
    return this;
  }
}

モジュールとファクトリインターフェイスを作成するボイラープレートの残りの部分は変更されていません。

chrome.manifestファイルは次のようになります...

content   logger                 chrome/content/
skin      logger   classic/1.0   chrome/skin/
locale    logger   en-US         chrome/locale/en-US/

component {808e1607-caea-418c-b563-d9fe1df6ee08} components/loggerservice.js
contract @test/loggerservice;1 {808e1607-caea-418c-b563-d9fe1df6ee08}

overlay chrome://browser/content/browser.xul chrome://logger/content/logger-overlay.xul
style   chrome://global/content/customizeToolbar.xul chrome://logger/skin/overlay.css

最後に、logger-overlay.xulファイルにはスクリプトファイルが含まれています---次のコードを使用してコンポーネントlogger.jsへの参照を取得しようとします...LoggerService

this.loggerService = Components.classes["@test/logger;1"].getService().wrappedJSObject;

そして、Firefoxエラーコンソールで報告しているのはこの行です。

どれだけ簡単にできるかわかりません。洞察をいただければ幸いです。

4

1 に答える 1

2

これは素晴らしいボイラープレートジェネレーターですが、残念ながら時代遅れのものです。1つは、 XPCOMUtilsを使用する必要があります。これにより、ほとんどの定型文が削除されます。さらに重要なことに、このボイラープレイスジェネレーターはGecko 2.0でのXPCOMの変更に更新されておらず、NSGetModuleの代わりに関数を定義していますNSGetFactory。ただし、このようなモジュールコードは機能するはずです。

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

function LoggerService() {
  this.wrappedJSObject = this;
}

LoggerService.prototype = {
  classID: Components.ID("808e1607-caea-418c-b563-d9fe1df6ee08"),
  classDescription: "Test component",
  contractID: "@test/loggerservice;1",

  QueryInterface: XPCOMUtils.generateQI([])
}

if ("generateNSGetFactory" in XPCOMUtils)
  var NSGetFactory = XPCOMUtils.generateNSGetFactory([LoggerService]);  // 2.0+
else
  var NSGetModule = XPCOMUtils.generateNSGetModule([LoggerService]);    // 1.9.x

NSGetModule拡張機能がFirefox3.6と互換性がある必要がない場合は、コードを削除できます。classDescriptioncontractIDプロパティを削除することもできます。これらはchrome.manifestすでにで指定されています。

:ブラウジングセッション全体にわたって存在し、どこからでもアクセスできるオブジェクトのみが必要な場合は、JavaScriptコードモジュールの方が適しています。XPCOMボイラープレートやwrappedJSObjectハッキングはありません。

于 2012-06-07T12:03:44.433 に答える