Firefoxで起きたちょっと面白い変化


※確か54->55のVerUp時に発覚したお話です。今更55の話かよとか言わないで

何がおきたの?

Firefoxにおいて、ある画面のsubmitが正常に動作しなくなったそうです。その画面はボタンを押されるとsubmitをtargetを変更しつつ二回行うことでタブを増やすような処理を行っていました。
なんとjQuery 1.6が使われていたぐらいには「れがしぃ」なコードです……

rubbish.js
// ※たしかこんな感じだった……はず
$(function(){
  var t = $("#test");
  $("#b").click(
  function(){
      t.attr("target", "_self");
      t.val(1);
      t.submit();  // こっちが実質的に機能してなかった
      t.attr("target", "_blank");
      t.val(2);
      window.setTimeout(function(){t.submit();}, 100);
      return false;
    }
  );
})

なお「submit連打はねーよ」とか「なんでform追加で作らないんだ」とか「なんだってメソッドチェーンすらしないんだ」とか「1つのfunctionでこれとか何考えてんだ」とかそういうツッコミは受け付けません。
もう俺がツッコんだ後だよ。

どうやって直したのさ。

どうも聞いた限りだと、こんな感じ。

usable-rubbish.js
$(function(){
  var t = $("#test");
  $("#b").click(
  function(){
      t.attr("target", "_blank");
      t.val(1);
      t.submit();

      window.setTimeout(function(){
        t.attr("target", "_self");
        t.val(2);
        t.submit();
      }, 100);

      return false;
    }
  );
})

要するに、setTimeoutで2回目のsubmit周辺をまるごと切り離しているのです。
もともとこのsetTimeoutはChromeのSubmit連打対策として導入したもの。色々いじっているうちに「ひょっとしてここに全部ぶち込めば話が済むのか?」となったんだとか。
ただし、ところでこれでどうして直ったんだ?という謎が残っています……

なお、ちょっと聞いたところによると、「Firefox 55からマルチタスクな処理が強化されたからそのせいじゃないかなー?」とのこと。
確かにここらへんにそれっぽいことが書いてあるんだけど、つまり「submitは非同期な感じの処理になったんだよ!!」ということなんだろうか (その結果targetの書き換えが先に走ったとすれば説明がつく……よね?) 。

まとめ

連続Submitはどうあがいてもバグの味しかしないぞ!
投げっぱなしジャーマンでどっとはらい。

実際ちょっと原因が気になるので、どなたかご存知であればお教えください……