web-dev-qa-db-ja.com

Googleによって作成されたポップアップウィンドウを閉じるChrome拡張機能

Deliciousブックマークレットの代わりとなるChrome拡張機能を作成しようとしています。これを実行する拡張機能がすでに存在することはわかっていますが、その拡張機能の問題は、サイトをブックマークした後です。 、ポップアップウィンドウは開いたままです(フォームの送信後にポップアップが自動的に閉じるブックマークレットを使用するのとは対照的です。拡張機能を再作成し、同じ問題が発生しました。

これが私のコードです:

manifest.json:

_{
  "name": "Delicious",
  "version": "1.0",
  "description": "Bookmark a site on Delicious",
  "background_page": "background.html",
  "permissions": [ 
    "tabs" 
  ],
  "browser_action": {
    "default_icon": "delicious.png"
  },
  "content_scripts": [
    {
      "matches": ["http://www.delicious.com/save*"],
      "js": ["contentscript.js"]
    }
  ]
}
_

background.html:

_<html><script>
chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.getSelected(null, function(tab) {
    w = window.open('http://delicious.com/save?url='+
          encodeURIComponent(tab.url)+
          '&title='+encodeURIComponent(tab.title)+
          '&v=5&noui=1&jump=close',
        'deliciousuiv5',
        'location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=550');
  });
});
</script></html>
_

contentscript.js:

_if (document.URL == 'http://www.delicious.com/save')
{
  alert('closing...');
  self.close();
  alert('should have closed by now');
}
_

「おいしい」ボタンをクリックすると、ポップアップが正常に表示され、ブックマークを保存できますが、「保存」をクリックしてもポップアップが閉じません。両方のアラートが表示されますが、self.close()は何もしていないようです。 contentscript.jsでURLチェックを削除すると、ポップアップが通常どおり表示され、最初のアラートがすぐに発生し、次にポップアップが自動的に閉じます(必要に応じて)。

なぜこれが機能しないのですか? Chromeがself.close()を実行できなくなっているようには見えません。Deliciousは何かを実行していますか?それは他の何かですか?

必要に応じてファイルはここにあります:[drop.ioが廃業したためリンクが削除されました]

23
Alex Grin

window.close()を試してみてください。しかし、それもおそらく機能しません。

(ブラウザのアクションポップアップではなく)通常のウィンドウを作成しているので、バックグラウンドページからchrome.tabs.remove()を使用してウィンドウを閉じることができます。このウィンドウは、バックグラウンドページから検出することもできます。何かのようなもの:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if(changeInfo.status == "loading") {
        if(tab.url == "http://www.delicious.com/save") {
            chrome.tabs.remove(tabId);
        }
    }
});

Chromeが作成されたウィンドウをタブまたはウィンドウとしてどのように扱うかはわかりません。ウィンドウとしての場合、上記のコードは少し異なります。

18
serg

これに対する非常に簡単な回避策を見つけました。選択したタブをTrueに設定すると、次のようにポップアップが消えます...

// remove popup by selecting the tab
chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.update(tab.id, { selected: true } )
});
9
Hlung

私はこの解決策を見つけました:chrome.tabs.update({ active: true });この1行のコードは、ブラウザーアクションのポップアップウィンドウを閉じます。デフォルトでは現在のタブのIDに設定されているため、tab.idを渡す必要はありません。バックグラウンドページで実行しますが、拡張機能のどこでも実行できるようです。

getSelectedが機能しないので、この解決策を見つけました

chrome.tabs.create({url: 'https://www.google.com', active: false});

background.jsでは必要なのは

window.close();
0
Andrey Andrey