はてなスクリーンショット拡張 (Firefox) への最後通告

はてなでは、サービスを便利にご利用いただけるツール群を「便利なツール」のページにて提供しておりましたが、現在のご利用状況を鑑み、来たる3月31日をもちましてこちらのページでのツールの提供を終了、一部のツールを廃止することといたしました。

「便利なツール」(拡張、ツールバー、アプリケーション)に掲載されているツールのうち一部の提供を終了します - はてなの日記 - 機能変更、お知らせなど

分かってはいたけれど、運営からの最後通告がとうとう出た。

まあ良い。
幸いにして、MIT License なので好きにさせてもらう。


そういえば、Firefox 46 で、アドオンの署名検証をスキップする xpinstall.signatures.required が効かなくなるという噂があった。
その検証がてらいくつか。

Firefox 46.0b1 (64bit β)

フォトライフにアップロードをメニューで選ぶと、http://www.hatena.ne.jp/tool/hatenascreenshot?ref=login に飛ばされる。
でも、クリップボードにコピーやファイルに保存は動く。
いったん、ログアウトして、もう一度ログインしたら、正しく動くようになった。

多分、紹介ページに飛ばされているのはこの辺りの処理だ。
./chrome/content/browser/10-Manager.js:

            openUILinkIn("http://www.hatena.ne.jp/tool/hatenascreenshot?ref=login", 'tab');

resources/modules/70-User.js をみるとログイン判定は Cookie を見ているらしいけれど、Firefox の起動直後だと うまく判定できてないケースがあるんだな、きっと。
他にも、フォトライフのアップロード先フォルダが「トップ」しか出ないことがある。

微妙。地雷の可能性がある。
とはいえ、xpinstall.signatures.required = false の指定が FF46 から無効になるという噂があったけど、どうやら動くみたいだ。
about:debugging で「アドオンのデバッグを有効化」のチェックを外しても動くなあ。

まあ、無効にするのを先延ばしにしてくれる分にはありがたいんだけど。

Firefox 47.0a2 (64bit) で動かなくなってる

こんなエラー。

10:38:42.572 TypeError: can't convert undefined to object           00-utils.jsm:9:22
    getService()                        00-utils.jsm:9
    <匿名関数>                          00-utils.jsm:26
    <匿名関数>                          autoloader.js:4

10:39:53.475 TypeError: hScreenshot.Manager is undefined            browser.xul:1:1
    1   : // エクスポートしたくないメンバの名前はアンダースコア(_)からはじめること。              
    2   :                                                                                         
    3   : const Cc = Components.classes;                                                          
    4   : const Ci = Components.interfaces;                                                       
    5   : const Cr = Components.results;                                                          
    6   : const Cu = Components.utils;                                                            
    7   :                                                                                         
    8   : let getService = function getService(name, i) {                                         
★  9   :     let interfaces = Array.concat(i);                                                   
    10  :     let service = Cc[name].getService(interfaces.shift());                              
    11  : //  interfaces.forEach(function(i) service.QueryInterface(i));                          
    12  :     interfaces.forEach(i => service.QueryInterface(i));                                 
    13  :     return service;                                                                     
    14  : };                                                                                      
    15  :                                                                                         
    16  : // See https://developer.mozilla.org/en/OS_TARGET for OS_TARGET values.                 
    17  : const OS_TARGET = getService('@mozilla.org/xre/app-info;1', Ci.nsIXULRuntime).OS;       
    18  : const IS_WIN = OS_TARGET.indexOf("WIN") === 0;                                          
    19  : const IS_MAC = OS_TARGET === "Darwin";                                                  
    20  : const IS_OSX = IS_MAC;                                                                  
    21  :                                                                                         
    22  : // ここら辺でサービスの取得などをしているが Services.jsm を使うと良さそう               
    23  : // https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Services.jsm
    24  :                                                                                         
    25  : const Application =                                                                     
★  26  :     getService("@mozilla.org/fuel/application;1", Ci.fuelIApplication);                 
    27  : const PrefetchService =                                                                 
    28  :     getService("@mozilla.org/prefetch-service;1", Ci.nsIPrefetchService);               
    29  : const DirectoryService =                                                                
    30  :     getService('@mozilla.org/file/directory_service;1', Ci.nsIProperties);              

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Toolkit_API/FUEL
https://bugzilla.mozilla.org/show_bug.cgi?id=1090880
FUEL が deprecated だった、ってやつ (FF40-) が、ついに削除されたらしい (FF47)。

Application を使ってるところを全てコメントアウトしてみる。
うん、動く。
Application を置き換えれば良いんだね。


Application の使い方は二種類。

var nowDebug = !!Application.prefs.get('extensions.hatenascreenshot.debug.log').value;
    ...
            Application.console.log((msg || '').toString());

コメントにあるように、Services.jsm を使ってみるか。
https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Services.jsm

//var nowDebug = !!Application.prefs.get('extensions.hatenascreenshot.debug.log').value;
var nowDebug = Services.prefs.getBoolPref('extensions.hatenascreenshot.debug.log');
    ...
//          Application.console.log((msg || '').toString());
            Services.console.logStringMessage((msg || '').toString());

extensions.hatenascreenshot.debug.log = true にしても、何もコンソールに出てこないなあ。
Application を使ってるところを削除しても良かったかな。

Console とか Log を使った方が良いのかもしらんけど。
https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_JavaScript
https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Log.jsm
https://developer.mozilla.org/en-US/docs/Web/API/console

まあ、気が向いたときに変更してみる。
とりあえず動いてくれれば良いのさ。


「正常に起動されていません」

何か、途中からブラウザツールボックスを開こうとすると「正常に起動されていません。SAFEモードで起動できるよ」
みたいなのが表示されるようになった。

00-utils.jsm をいじったのと、extensions.hatenascreenshot.debug.log を true にしたくらい。
元に戻しても消えない。
コンソールのログを見ても、大きく変わってないような。

他のソース(SessionManager?)でも、式クロージャのやつとか

12:06:41.784 expression closures are deprecated                 bootstrap.js:35:18

jar:file:///D:/Firefox%20profile/fx46_64_DEV/extensions/%7B1280606b-2510-4fe0-97ef-9b5a22eafe30%7D.xpi!/bootstrap.js

まあ良いか。
とりあえず動いているようだし、気にしない(ことにする)。

devtools

devtools の階層がなくなるよ、ってやつ。

DEPRECATION WARNING: This path to Console.jsm is deprecated.  Please use Cu.import("resource://gre/modules/Console.jsm") to load this module.
You may find more details about this deprecation at: https://bugzil.la/912121
resource://gre/modules/devtools/Console.jsm 19 null

アドオンのメンテナーって大変なんだなあ(実感)。

これまでの修正

修正履歴を全然 取ってないので、備忘録。
GitHub にあげるときには、きちんとする(つもり)。

  • WebBrowserPersist#saveURI の引数が増えてた (FF36)
  • let や const が this の属性で拾えなくなった (FF44)
  • クロージャが廃止 (FF45)
    • アロー関数での this の扱い
  • 古い配列内包の表記がエラー (FF46)
  • FUEL が削除された (FF47)