single.php

Chrome 拡張機能でユーザーが開いたタブを取得したい場合

Google Chromeの拡張機能で、新しいタブが作成されたイベントで、ユーザーが開いたタブの有無を判定する方法について備忘録的に投稿しておきます。

新規タブを開いてもopenerは設定される

以前は、新規で作成されたタブには開かれた元タブのID(openerTabId)が設定されていませんでした。

しかし、最新のChromeブラウザーでは、ID(openerTabId)が設定されています。

ID(openerTabId)は判断材料にならないですが、onCreated で次の確認方法で、ユーザーが開いた可能性が高いタブを判断できます。

chrome.tabs.onCreated.addListener(async (tab) => {

  let isUserCreateTab = false;
  //ちょっと待つ
  setTimeout(async () => {
    try {
      const t = await chrome.tabs.get(tab.id);

      // URLが無い場合
      if (!t.url) {
        isUserCreateTab = true;
      }

      // URLが新規タブっぽい
      if (t.url.startsWith("chrome://") || t.url === "about:blank") {
        isUserCreateTab = true;
      }

      // [opener]がある場合(新規タブでも[opener]は取得されるので注意)
      if (t.openerTabId) {
        const opener = await chrome.tabs.get(t.openerTabId);

        // [新しいタブで開く]の可能性
        if (!opener?.url) {
          isUserCreateTab = true;
        }

        const newHost = new URL(t.url).hostname;
        const openerHost = new URL(opener.url).hostname;

        // ドメインが同じ
        if (newHost === openerHost) {
          isUserCreateTab = true;
        }
      }

      if(isUserCreateTab == true) {
        //ユーザーが開いたタブの可能性が高い
        
      }

    } catch (e) { }
  }, 200);
});

ユーザーが開いていないタブは、広告画面の可能性が高いので、ポップアップブロッカーの仕組みとして使える可能性があります。

まとめ

今回は、Google Chromeの拡張機能で、新しいタブが作成されたイベントで、ユーザーが開いたタブの有無を判定する方法について書きました。

以前は、openerTabId を使うと新しいタブの取得が可能でしたが、最新版のChromeは、新しいタブでも openerTabId が設定されてしまうため、設定されているURLなどで代用することが可能です。

Google Chromeの拡張機能で、新しいタブでユーザーが開いた有無を判定したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただきありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です