◆ addEventListener 使う場合は 引数の returnValue をセットする
◆ 返り値が使われるのは window.onbeforeunload に関数セットしたとき
◆ Firefox だとページで全くイベント起きてないなら beforeunload でダイアログ出ない
  ◆ 関数は実行されていてダイアログが出ないだけ 

久々に使ったら変わってました

メッセージは書けなくなった

昔は
window.onbeforeunload = function(){
return "移動していい?"
}

と文字列を返せば メッセージが表示されてページを離れるか確認ダイアログがでました
ですが今では

beforeunload

固定メッセージになります

returnValue

window.onbeforeunload は単純に return で文字列を返せば確認ダイアログが出るようになります
文字は使われないので空文字でもよくて null/undefined 以外ならなんでもいいです

しかし addEventListener を使った場合は動きが違います
window.addEventListener("beforeunload", function(){
return "移動していい?"
}, false)
では何も起きません

引数の returnValue に onbeforeunload で return していた値を設定しないといけないです
window.addEventListener("beforeunload", function(eve){
    eve.returnValue = "移動していい?"
}, false)

Chrome は昔返り値でよかったのですが 34 から Firefox のほうに動きが合わされたようです
めったに使わないので 34 から変わっていたのに全然気づきませんでした

そもそも beforeunload って複数つけることがまずないので window.onbeforeunload しか使わないというのもあります
状況によってはすでに設定していたダイアログを出さずに遷移させたいこともあると思います
window のプロパティを使う場合はリスナ解除が null を代入するだけでよくて楽というメリットもあります

なんで returnValue のほうに合わせたの

なんでめんどうなプロパティ設定のほうになったのか ですが本当の理由はわかりませんけど たぶん addEventListener は複数セット出来るからかと思います
window.onbeforeunload だと 1 つなので返り値そのまま使って問題なしです
複数リスナがある addEventListener だと前のリスナでセットされた値を見て分岐したいこともあるので event の returnValue プロパティにセットするようにすれば そのプロパティが前のリスナで設定されていればその値が入っているというシンプルなものになります

理由があっても window.onbeforeunload と addEventListener で動きが違うというのはバグのもとになりそうですし 気持ち悪く感じるので window.onbeforeunload でも returnValue 使うほうがいいかもしれません

Firefox と同じじゃない

Chrome の beforeunload は Firefox といっしょになったのか というとまだ違いがあります

Firefox だと全く触れていないページでは beforeunload が設定されていても何もしません
触れるというのはクリックやスクロールやキーボード操作などのイベントを起こすことです
開いてすぐに F5 したり閉じたりする分には出ないようになっています

あくまで確認ダイアログが出ないだけで beforeunload でリスナの関数は実行されています
localStorage に保存処理書いてたら動いてなかった なんてことはないのでそこは安心です

といっても使う側からすると便利ですが作る側からすると混乱の元でもあります
注意しましょうね