先日、Firefox を 35 ⇒ 36 にアップデートしたのですが、それ以降 Firefox Add-on の iMacros でブラウザのスクショを自動保存する SAVEAS コマンドでエラーとなる事象が発生しました。
そもそも iMacros とはなんぞやってことですが、簡単に言えば、EXCEL のマクロのようなもので、ブラウザの操作をマクロ(独自スクリプト)で自動実行してくれるブラウザ拡張機能(アドオン)です。もちろん手動でスクリプトを書いてもよいのですが、iMacros の良いところは、EXCEL のマクロのような「記録」「再生」機能があることです。iMacros を使えば、コマンドを書かなくとも EXCEL のマクロ記録のようにブラウザ操作の「記録」と「再生」を簡単に行えるようになります。
ブラウザはおそらく現在もっともよく使われるアプリケーションですが、ブラウザの操作のかなりの部分は単純な繰り返し作業ではないでしょうか。みなさんも日々同じサイトを開いたり、検索エンジンで毎日同じ語句をチェックしたり、あるいはウェブサイトテストで単純作業を繰り返していませんか? iMacros を使えば、一度記録するだけで、同じ操作をいつでも iMacros に実行させることが可能になります。
- 前置きはさておき、エラーは以下のような内容でした。
-
-
[cc]
NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments
[nsIWebBrowserPersist.saveURI], line 7 (Error code: -1001)
[/cc]
エラーメッセージは見ての通り、 nsIWebBrowserPersist.saveURI() メソッドで引数が足りない(満たしていない)というエラーなのですが、iMacros 自体はアップデートなどの変更はしていませんので、単純に Firefox 36 へのアップデートが問題かと。ちなみにFirefox 35 に戻すと正常に動作しました。iMacros のバーションは 8.8.9 です。
「Not enough arguments」ですから素直に Firefox 35 ⇒ 36 で saveURI() の引数が増えたと考えるのが妥当ですが、アップデートごときで果たしてメソッドの引数の数を増やすほどの仕様変更(暴挙)に出るかってほど、あまりにも乱暴すぎるので普通は下位互換を考慮に入れるずなのですがね。
早速 Google 先生のお世話になりますと、iMacros のコミュニティフォーラムの SAVE SCREENSHOT ERROR w/Firefox 36.0 というページがビンゴ!
このページのスレで、iMacros Wiki の Version Historyから iMacros を V8.9.1 にアップデートすれば直るらしい。
- 2015-03-04 V8.9.1 => Download now (To install: Download, and then drag-and-drop the .xpi file onto an open instance of Firefox.).
- Added Firefox 36 compatibility
- Fixes “NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIWebBrowserPersist.saveURI]”
- Fixes problem with JS code executed twice instead of once
しかし、Firefox 公式の iMacros Add-onサイト はいまだに V8.8.9 のまま。公式サイトであれば信頼できるのですが、アリアリの(なんでもできる) Add-on(xpi) ですから、セキュリティ上少々不安。
V8.9.1 は imacros.net の Wiki からのダウンロードですので信頼性という点ではあまり気にする必要はないとは思いますが、ここは Firefox 公式のお墨付き(Firefox 公式サイトからのダウンロード)が欲しいところです。ただ Firefox 公式サイトからのダウンロード&インストールでも「作者情報未検証」という警告は出ますので同じといえば同じなのですが(汗)検閲済ってことで。
とまあ技術屋性分で、Firefox 36 で saveURI() メソッドがどう変更になったのか一から調査してみることにしました(汗)
すると、 MDN(Mozilla Developer Network) にあっさり記載されていました。やはり aReferrerPolicy という第4引数が1つ増え、引数の数が7から8個に増えていました。
- ・saveURI()
As of Firefox 26, this method should no longer be used from add-on code. Please use Downloads.createDownload() instead.
As of Firefox 36, a new parameter aReferrerPolicy was added as the fourth argument, changing the number of parameters from 7 to 8 and shifting the order of the parameters in a backwards incompatible way.
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
);
要するに、 saveURI() メソッドはすでに Firefox 26 で deprecated になったので、今後は Downloads.createDownload() を使ってね!ってことですね。でもまあ百歩譲っても下位互換性は維持しておくべきのような気がしますが、すでに Firefox バーションも 26 ⇒ 36 で 10 バージョンも猶予したので Add-on 開発者もそろそろイイよね!って感じなんでしょうね。
ロジックは Javascript ですから、メソッドのオーバーロードが効きそうなので、追加した第4引数の aReferrerPolicy は一番最後(第8引数)にしておけばよかったのでしょうが、第3引数が aReferrer ですから、まあコードの美しさというか規約を優先したのでしょうね。no longer ですしね。
というオチでしたので、Firefox 公式が iMacros V8.9.1 に更新されるまで、V8.8.9 のソースコードを修正して凌ぐことにしました。
以下の
Firefoxのプロファイル の extensions フォルダ内に iMacros V8.8.9 の xpi ファイルかまたは展開されたフォルダがあります。
[cc]%APPDATA%\Mozilla\Firefox\Profiles\xxxxxxx.default\[/cc]
xpi ファイルはただの zip ファイルですのでリネームするなりし、その中の imacros.jar を探します。 imacros.jar 内の content フォルダ配下の MacroPlayer.js こそがエラー元の箇所になります。
以下のように MacroPlayer.js の wbp.saveURI() メソッドの第4引数に null を追加します。
diff -U 1 -u MacroPlayer.js.org MacroPlayer.js
--- MacroPlayer.js.org Fri Jan 30 09:59:38 2015
+++ MacroPlayer.js Fri Mar 20 21:19:24 2015
@@ -1372,3 +1372,3 @@
if (!wait) {
- wbp.saveURI(uri, null, null, null, "", file, pcontext || null);
+ wbp.saveURI(uri, null, null, null, null, "", file, pcontext || null);
return;
@@ -1415,3 +1415,3 @@
- wbp.saveURI(uri, null, null, null, "", file, pcontext || null);
+ wbp.saveURI(uri, null, null, null, null, "", file, pcontext || null);
};
@@ -1560,3 +1560,3 @@
- wbp.saveURI(source, null, null, null, null, file, pcontext || null);
+ wbp.saveURI(source, null, null, null, null, null, file, pcontext || null);
};
@@ -1988,3 +1988,3 @@
- wbp.saveURI(source, null, null, null, null, file, pcontext || null);
+ wbp.saveURI(source, null, null, null, null, null, file, pcontext || null);
};
以上で iMacros の SAVEAS コマンドが動作するようになりました。
2015/03/31 追記
本日付でFirefox 公式の iMacros Add-onサイト はV8.9.2に更新されました。このアップデートにより不具合も解消されます。