Q:

O que faz um popup ser bloqueado?

Já percebi que algumas bibliotecas, como a de login com o facebook, sempre usam popups para a autenticação do usuário e, quase sempre, esse popup não é bloqueado.
Geralmente, quando o mesmo é aberto com um evento de click não há bloqueios. E quando usamos window.open diretamente no console, por exemplo, eles são bloqueados.
Como determinar as situações em que o popup será bloqueado?
Existe alguma maneira de driblar esse bloqueio? Ou existe alguma forma de "informar" que tal popup é "confiável" para abertura?

A:

Popups são bloqueadas por navegadores quando identificado uma ação window.open (ou equivalente) que não aparenta ser uma ação imediata do usuário. Os navegadores antigos poderiam considerar qualquer pilha de função como um mau sinal e optar por bloquear. Já na atualidade, o processo é mais sofisticado e examinará com um desempenho melhor a característica da chamada.
Um exemplo prático:
<body onload="abrir(true);">
    <button id="abcd" type="button" onclick="abrir(false)">Ação Direta</button>        
</body>

<script type="text/javascript">
    function abrir(value) {
      if (value) {
        setTimeout(function () {
          window.open('http://pt.stackoverflow.com');
        }, 5000);
      } else {            
        window.open('http://pt.stackoverflow.com');
      }

    }
</script>

Mesmo sendo a mesma função e utilizando o Timeout para tentar enganar, o Google Chrome irá bloquear uma pop-up após 5 segundos do carregamento da página, no entanto nunca bloqueará o click do usuário.
Podemos simplificar a função e encontrar o mesmo comportamento:
<script type="text/javascript">
    function abrir(value) {
      window.open('http://pt.stackoverflow.com');
    }
</script>

O que faz um popup ser bloqueado?

A habilidade do navegador de determinar se a chamada à função window.open é de intenção do usuário ou não.

