1

ボタンがクリックされたときにポップアップウィンドウを開くChrome拡張機能があります。

"browser_action": {
    "default_popup": "popup.html"
},

ポップアップが読み込まれたときに、現在アクティブなブラウザタブのURLに応じて、別のURLにリダイレクトしたいと思います。

window.location.href = "http://example.com/"ポップアップで試しましたが、空白のページが表示されます。

ポップアップウィンドウ全体を埋めるiframeにURLをロードしようとしましたが(これは問題ありません)、新しいURLがwindow.close()を呼び出すときにポップアップウィンドウを閉じる必要があります。これは、次の場合は検出できないようです。それはiframeにあります。

これは可能ですか?

4

1 に答える 1

1

自分で作成したページの場合は、window.postMessageを使用して、iframe 内のページからポップアップにメッセージを送信して、閉じるように指示できます。
ファイルに必要なコードは...
popup.js

// change #frame to point at your iframe
var frame = document.querySelector('#frame');

window.addEventListener('message', closeWindow, false);

function closeWindow(event) {
    if(frame.src.indexOf(event.origin) === 0 && event.data == 'closeWindow') window.close();
}

iframe 内のページ

window.close = function() {
    window.parent.postMessage("closeWindow", window.parent.location.href);
}

iframe 内の任意のページに対してこれを行うには、本当にきれいな方法は考えられませんでしたが、これで十分です。
window.parent の URL をチェックして iframe 内にあるかどうかをチェックする、すべてのフレームのすべての URL で実行されるコンテンツ スクリプトを用意します。
iframe にある場合は、window.close イベントを上記でオーバーライドします。
オーバーライドしたい window.close 関数は、コンテンツ スクリプトではなくページのコンテキストにあるため、スクリプトをページにアタッチします。
これを行うコードは次のとおりです...
manifest.json

{
  "name": "PopUp IFrame Parent Window Close",
  "description" : "http://stackoverflow.com/questions/13673428/is-it-possible-to-change-the-url-of-the-popup-window-in-a-chrome-extension",
  "version": "1.0",
  "permissions": [
    "tabs", "<all_urls>"
  ],
  "browser_action": {
      "default_title": "Test Closing IFrames parent if in popup",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
 "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["myscript.js"],
      "all_frames":true
    }
  ],
  "manifest_version":2
}

popup.html

<html>
<head>
<script type="text/javascript" src='popup.js'></script>
</head>
<body>
<iframe id="frame" src="http://localhost/windowclose.html"></iframe>
</body>
</html>

popup.js

function onLoad() {
    // change #frame to point at your iframe
    var frame = document.querySelector('#frame');

    window.addEventListener('message', closeWindow, false);

    function closeWindow(event) {
        if(frame.src.indexOf(event.origin) === 0 && event.data == 'closeWindow') window.close();
    }

}

window.addEventListener("load", onLoad)

myscript.js

hijackClose = function() {
    window.close = function() {
        window.parent.postMessage("closeWindow", window.parent.location.href);
    }
}

// Executing an anonymous script
function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.documentElement.appendChild(script); // run the script
    document.documentElement.removeChild(script); // clean up
}

if(window.parent && window.parent.location.href == chrome.extension.getURL('popup.html')) {
    exec(hijackClose);
}

...これで、ポップアップ iframe で window.close を呼び出すページは、ポップアップを閉じます。

于 2012-12-04T19:10:52.800 に答える