2011-06-30 14 views
3

フラッシュゲームが入ったウィンドウを起動し、Chromeのポップアップブロッカーがそれを抑止すると、ユーザーはゲームの音楽を聞いても何も見えません。これは、Chromeがウィンドウをブロックしないためです。それは単にそれを隠すだけです。Chromeポップアップの「ブロッカー」が非表示のページとプラグインを読み込みます。

Chromeはページを読み込んでファビコンとページのタイトルを取得するため、ポップアップブロッカーダイアログ(アドレスバーのアイコンをクリックすると表示される)に表示することができます。しかし、彼らは窓を閉めません。プラグインを実行すると、スクリプトはオープナーに戻ることができます。通常のウィンドウのようですが、目に見えません。 (オーケー、マルウェア開発者は、よだれを停止してください。)

Chromeは、実際にページをロードせず<タイトル>とファビコン<リンク/ >タグを取得するために<ヘッド>タグの内容を解析することができます。彼らはアイコン/タイトルを取得した後、隠れたウィンドウを閉じることができます。彼らは単にアイコン/タイトルの代わりにURLを表示することができます。代わりに、バグが... 2008年から化膿し続けとにかく

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

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

、質問は次のとおりです。この問題が発生したとき、私は を検出することはできますか?おそらく、window.chrome JavaScriptオブジェクトに、ウィンドウがこの不可視状態にあることを示すために何かがあるので、私はそれを閉じたり、フラッシュを削除したりできますか? Prusseの答えに基づいて

__

は、ここで私がなってしまったものだ...

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); 
     } 
    } 
} 

だから私は何かなどを行うことができます...

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

のように見えますが、これは少なくともクロムで修正されています(http://code.google.com/p/chromium/issues/detail?id=38458)。 – 203

答えて

3

あなたはしようとするかもしれませんinnerWidth、innerHeight、outerWidth、またはouterHeightをチェックします。すべての新しいウィンドウが(0,0)のサイズで作成されているChromeのため、0の遅延が動作しません

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

、唯一のいくつかの時間後に、それはいくつかの適切なを与える:ブロックされたクロームのように0でそれらをできるようにseensときそれまでのサイズ。

関連する問題