◆ click イベント中以外だと window.open はブロックされる
◆ click イベント中でもイベント発生から一定時間経ってればブロックされる
  ◆ setTimeout でも fetch でも同期処理でも一緒

window.open は普通に実行すると ブラウザがブロックします
勝手にタブ開いて 開かれたタブがまたタブを開いて と無限ループで永遠にタブを開き続ける といった攻撃されないように という親切設計です

でも全部ブロックすると不便なので click アクションなどのリスナ中では実行可能になっています
リスナに設定した関数内に限らずその関数から呼び出した関数でも大丈夫です


この判定は JavaScript のメインループで実行されるブロックの単位になっているようで click のリスナ中に setTimeout を設定してその関数で window.open するとブロックされてしまいます
window.onclick = eve => {
setTimeout(e => {
window.open("http://localhost/test1")
}, 2000)
}

となると click したときに非同期の関数を実行して 完了時のコールバックで window.open は難しそうです

と思ったのですが このコード
window.onclick = eve => {
    fetch("/").then(e => e.status === 200 && window.open("/"))
}

status が 200 なら window.open するものですが これならブロックされませんでした
仕様があるわけでもなく ブラウザの親切機能だと思うので 独自の安全化のチェック基準があるのかもです
setTimeout/setInterval はダメ とか


※ 今回のチェックはChrome のみです 




時間だったみたい

setTimeout は 2 秒で fetch は 500ms 未満なので時間的な問題かもと思って試してみました

結果は
setTimeout でも 200ms 程度ならブロックされません
fetch する URL に sleep を入れて数秒かかるようにしたらブロックされるようになりました

click イベントが発生してからの時間 みたいです

もしかすると 非同期も関係ないのかと思って while で 5 秒くらい待ってみました
window.onclick = eve => {
    var n = Date.now()
    while(Date.now() < n + 5000) ;
    window.open("/")
}

これでもブロックされました

非同期とかは関係なくて ブロック条件は 本当に 「イベントからの時間」だけのようです