OperaでGmailのキーボードショートカットからメールを削除できない件

ちょっと気になったので調べてみた。

まずはおさらい。

  1. 表題のとおり、Opera だと Gmail のキーボードショートカットからメールを削除できない。
  2. メール削除のショートカットは # である。
  3. 1年ぐらい前に、Opera だけの隠し Gmail ショートカットとして、End キーを押すとメールを削除できるというのがあった。自分の日記でも紹介している。

次に、Gmailを開くときに、Opera のエラーコンソールを見つめてみると、こういうのが確認できる。

JavaScript
User Javascript thread
Opera has modified the JavaScript on mail.google.com (GMail deletes messages on End key presses
GMail: browser blocking prevents chat feature from appear...). See browser.js for details

強調したところ注目。browser.js が何やらやっているらしい。

さらにここで、Opera のキーコードを見てみる。

# のキーコード (keypress) が 35
End のキーコード (keypress) が 35


つまりそういうことでした。

browser.js を開いて、"mail.google" と検索。

// 244011, GMail deletes messages on End key presses
opera.addEventListener( 'BeforeEventListener.keypress', function(e){
	preventDefault.call=call;
	if(e.event.keyCode==35){
		preventDefault.call(e);
	}
}, false );

こういう部分が見つかる。

キーコードが 35 の時は preventDefault しちゃうと。(!)

こんなことよりもっと根本的な解決があるだろうに…

他のブラウザもだけど、別のキーが同じキーコードを吐くような状態を何故放っておくのだろうか。


で、browser.js を編集したら良いかなと思ったのだけど、browser.js って自分で編集すると動いてくれない? Opera が勝手に無効と判断するのだろうか?
有効・無効の確認テストでも無効と言ってくる。


UserJS を書こうにも、無名関数なので removeEventListener できないという。
createEvent しても keypress キーコードが 35 だったらpreventDefault されてしまうんだよね (未確認だけどたぶんそう)。
バグレポート送るしかないかー。

UserJS 作ったとしても、httpsGmail だったら一々確認されてしまうという手間があるので、やっぱ browser.js で直してくれるのがよいと思う。うん。



一応別の方法で修正 (?) してみた。修正でも何でもないけど。

// ==UserScript==
// @name Gmail delete shortcut
// @author edvakf
// @namespace http://d.hatena.ne.jp
// @version 1.1.0
// @include http://mail.google.com/mail/*
// ==/UserScript==
(function () {
    window.addEventListener( 'keypress', function(e){
        if(e.keyCode==8 && e.ctrlKey){
        var button=document.body.getElementsByTagName('button')[5];
/*          var buttons=document.getElementsByTagName('button');
            for(var i=0;i<buttons.length;i++){
                if(buttons[i].innerText=='Delete')break;
            }
            var button=buttons[i];
*/
            if(confirm(button.innerText+'?')){
                var evt = document.createEvent('HTMLEvents');
                evt.initEvent('click', true, true);
                button.dispatchEvent(evt);
            }
        }
    }, true );
}) ();

Ctrl+Backspace を押すと Delete ボタンにクリックイベントを投げるということで。

なぜ Ctrl+Backspace かというと、フォーカスが入力欄にあるとかそういう判断をするのが面倒なので、テキスト入力中に押しそうもないキーバインドにした。

やっつけです。あまり使用はおすすめしません。

Gmail Labs に Custom Shortcut というのがあるな。これで Move To Trash を # から別のキーに変えれば削除出来た。