2011-06-30 2 views
3

Si je lance une fenêtre avec un jeu flash et que le bloqueur de popup de Chrome la supprime, l'utilisateur entend la musique du jeu, mais ne voit rien. C'est parce que Chrome ne bloque pas la fenêtre; ça le cache juste.Chrome popup "bloqueur" charge la page cachée et les plugins - un moyen de contourner cela?

Chrome charge la page pour obtenir le favicon et le titre de la page, afin qu'ils puissent l'afficher dans la boîte de dialogue du bloqueur de popup (que vous voyez lorsque vous cliquez sur l'icône dans la barre d'adresse). Mais ils ne ferment pas la fenêtre. Les plugins s'exécutent, les scripts peuvent rappeler à l'ouverture - c'est comme une fenêtre normale, mais invisible. (D'accord, les développeurs de logiciels malveillants, s'il vous plaît arrêter de baver.)

Chrome pourrait analyser le contenu de la balise < tête > pour récupérer le titre < > et favicon < balise link/> sans charger réellement la page. Ils pourraient fermer la fenêtre cachée après avoir récupéré l'icône/titre. Ils pourraient juste montrer l'URL au lieu de l'icône/titre. Au lieu de cela, le virus continue à pourrir depuis 2008 ...

http://code.google.com/p/chromium/issues/detail?id=3477

http://code.google.com/p/chromium/issues/detail?id=38458

Quoi qu'il en soit, la question est: Puis-je détecter quand cela se produit? Peut-être qu'il y a quelque chose dans l'objet JavaScript window.chrome pour indiquer que la fenêtre est dans cet état invisible, donc je peux le fermer ou supprimer le flash?

__

Sur la base de la réponse de Prussia, voici ce que j'ai fini avec ...

function isPopupZombie(popWindow, delay) { 
    /// <summary>Attempts to detect zombie window "blocked" (hidden) by Chrome (v.8-12, maybe more)</summary> 
    /// <param name="popWindow">The popup window object</param> 
    /// <param name="delay">Optional delay in ms; Not necessary when called via other delayed event/function</param> 
    if (window.chrome && typeof(popWindow) == 'object') { 
     if (delay && !isNaN(parseInt(delay)) && delay > 0) { 
      window.setTimeout(function() { 
       isPopupZombie(popWindow, 0); 
      }, delay); 
     } else if (typeof(popWindow.opener) == 'object') { 
      var w = (popWindow.innerWidth && popWindow.innerWidth > 0) ? popWindow.innerWidth : popWindow.outerWidth; 
      var h = (popWindow.innerHeight && popWindow.innerHeight > 0) ? popWindow.innerHeight : popWindow.outerHeight; 
      //console.log('_isPopupZombie: ' + w + ' x ' + h); 
      return (w === 0 && h === 0); 
     } 
    } 
    return false; 
} 

function handlePopupZombie(zombieWindow, notify, callback) { 
    /// <summary>Tries to close the zombie or alert about Chrome FAIL</summary> 
    /// <param name="zombieWindow">Popup window object known to be a hidden but unblocked popup</param> 
    /// <param name="notify">true to notify user of hidden window, false to close zombieWindow</param> 
    /// <param name="callback">optional function to call, with single argument for zombieWindow</param> 
    if (window.chrome && zombieWindow) { 
     if (notify === true) { 
      // callback or alert 
      if (typeof(callback) == 'function') { 
       callback(zombieWindow); 
      } else if (zombieWindow.opener) { 
       zombieWindow.opener.alert("Your popup blocker has hidden a popup window instead of blocking it.\n\nPlease use the icon in the address bar to open the hidden window."); 
      } 
     } else { 
      // try to kill the zombie 
      if (zombieWindow.opener && zombieWindow.opener.console) zombieWindow.opener.console.log('Closing zombie window'); 
      // after close, blocker icon is in address bar, but favicon/title are not in dialog 
      zombieWindow.close(); 
      // optional callback 
      if (typeof(callback) == 'function') callback(zombieWindow); 
     } 
    } 
} 

Je peux faire quelque chose comme ...

var popup = window.open(...); 

if (typeof(popup) == 'undefined') { 
    // handle it 
} else if (popup && popup.closed) { 
    // handle it 
} else if (isPopupZombie(popup, 100)) { 
    console.log('popup zombie!'); 
    handlePopupZombie(popup, true); 
} else { 
    console.log('no zombies, this is regular ordinary popup code time!'); 
} 
+1

semble que pendant ce temps, il est fixé dans le chrome, au moins: http://code.google.com/p/chromium/issues/detail?id=38458 – 203

Répondre

3

Vous pouvez essayer de Vérifiez les innerWidth, innerHeight, outerWidth et/ou outerHeight. Lorsque le chrome bloqué seens de les laisser à 0. Comme:

window.addEventListener('load', function(){ 
    var w = window.open(''); 
    setTimeout(function(){ 
     if ((w.outerWidth === 0) && (w.outerHeight === 0)){ 
      alert('blocked!'); 
     } 
     w = null; 
    }, 25); 
}, false); 

Un retard de 0 ne fonctionnera pas car pour le chrome toutes les nouvelles fenêtres sont créées avec la taille (0,0), seulement après un certain temps, il donne une bonne taille à elle.

Questions connexes