それ、うまいのか?

... 記憶の残滓

「はてなスクリーンショット」の修正についてのお願い

お願いしたいこと

平素より、「はてなスクリーンショット」を便利に使わせていただいております。
ですが、以下の問題点があります。

  • Firefox 44 から、全く機能しなくなった
  • Firefox 36 から、「ファイルに保存」が動作しない

この 2点について修正ができたと思うので、正式版に取り込んでいただきたい、というお願いです。

対象のバージョンは、「はてなスクリーンショット拡張 1.0.7.1-signed.1-let-fixed」になります。

Firefox 44 から動作しなくなったやつの対応

resources/modules/00-utils.jsm の末尾に以下の 38行を追加。

/*
   for Firefox 44 or later.

   c.f.
   https://blog.mozilla.org/addons/2015/10/14/breaking-changes-let-const-firefox-nightly-44/
   let and const bindings, unlike their legacy counterparts, are no longer properties on the global object.
 */
if (! EXPORTED_SYMBOLS.includes('Cc')) {   // Firefox 44 or later ?
   EXPORTED_SYMBOLS.push(
       'Cc',
       'Ci',
       'Cr',
       'Cu',
       'OS_TARGET',
       'IS_WIN',
       'IS_MAC',
       'IS_OSX',
       'Application',
       'PrefetchService',
       'DirectoryService',
       'ObserverService',
       'StorageService',
       'IOService',
       'HistoryService',
       'BookmarksService',
       'PrefService',
       'CookieManager',
       'CookieService',
       'PromptService',
       'CryptoHash',
       'XUL_NS',
       'XBL_NS',
       'XHTML_NS',
       'XML_NS',
       'XMLNS_NS',
       'getService'
   );
}

Firefox 36(多分)から、ファイルに保存が動作しなくなったやつの対応

chrome/content/browser/10-Manager.js の 273行目、saveURI メソッドの呼び出しを変更。

//              wbp.saveURI(uri, null, null, null, null, filePicker.file, privacyContext);
                wbp.saveURI(uri, null, null, null, null, null, filePicker.file, privacyContext);

修正内容についての補足

Firefox 44 から動作しなくなったやつの原因

00-utils.jsm には、以下のコードがあります。

var EXPORTED_SYMBOLS = [m for (m in new Iterator(this, true))
                          if (m[0] !== "_" && m !== "EXPORTED_SYMBOLS")];

該当ソースでグローバルスコープの変数を export するスニペットですが、Firefox 44 で加えられた修正のために期待通りの動作をしません。

ES6 global lexical bindings are not properties
The biggest incompatibility is that ES6 let and const bindings, unlike their legacy counterparts, are no longer properties on the global object. Instead, they are bindings in the global lexical scope directly below the global object.

https://blog.mozilla.org/addons/2015/10/14/breaking-changes-let-const-firefox-nightly-44/

let と const で宣言された変数が this のプロパティとして参照できなくなってしまったために const なオブジェクトが EXPORTED_SYMBOLS に追加されず、外部から参照できなくなりました。

明示的に列挙する必要があります。

Firefox 36(多分)から、ファイルに保存が動作しなくなったやつの原因
	void saveURI(
	  in nsIURI aURI,
	  in nsISupports aCacheKey,
	  in nsIURI aReferrer,
	  in long aReferrerPolicy,
	  in nsIInputStream aPostData,
	  in string aExtraHeaders,
	  in nsISupports aFile,
	  in nsILoadContext aPrivacyContext
	);
https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebBrowserPersist#saveURI%28%29

saveURI メソッドの第4引数 aReferrerPolicy が Gecko 36.0 で追加されたようです。
そのために、引数の数が合わず、以下のエラーが出ています。

NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIWebBrowserPersist.saveURI]   10-Manager.js:273:0

最後に

Firefox ではアドオンの署名を検証するために、ローカルで修正をすると設定で署名の検証をスキップさせなければならなくなります。
修正内容を公開することはできるのですが、「はてなスクリーンショット拡張」を使ってる方の全てが、他のアドオンの信頼性を個人の責任で判断できる方というわけではないと思います。

お手数をおかけしますが、正式版へのフィードバックをご検討いただけるよう、お願い申し上げます。