92159


### 全体のやりたいこと

サイト内の通知でフィッシングサイトに遷移してしまうのを抑制するために、サイト内でNotification
apiを用いた通知が検知された場合は通知のtitleとbodyの内容、遷移先のurlを取得して、ブラックリスト(.json)と照合して一致した際は通知の処理をオーバーライド、不一致の際はそのまま表示させたい。

### 質問したいこと

・サイト内で実装してある`window.open()`を開く前にブラウザ拡張で拾ってurlを取得したい。

[前回の質問](https://ja.stackoverflow.com/questions/92099/%e3%83%96%e3%83%a9%e3%82%a6%e3%82%b6%e6%8b%a1%e5%bc%b5%e3%81%a7%e3%82%b5%e3%82%a4%e3%83%88%e5%86%85%e3%81%a7%e5%ae%9f%e8%a3%85%e3%81%95%e3%82%8c%e3%81%9fjavascript%e3%82%92%e4%b8%8a%e6%9b%b8%e3%81%8d%e3%81%97%e3%81%9f%e3%81%84)でNotificationコンストラクタをオーバーライドという形で引数を取得するところまでは実装でき、現在は通知の遷移先のurlの取得を試みています。通知をクリックして遷移後にurlを取得することは出来たのですが、目的は「フィッシングサイトへのアクセスをブロックする」なので遷移前にurlを取得したいです。

WEBサイト側で実装してあるnotification.js

[code]

      function showNotification() {
        const notify = new Notification("Hi there", {
          body: "通知のテストです。",
          icon: "assets/notifications.png"
        });
    
        notify.onclick = (e) => {
          //window.location.href = "https://github.com/"; //ページをリダイレクトさせる
          window.open('https://github.com/', '_blank');   //別タブで開く
        };
      }
    
[/code]

manifest.json

[code]

    {
      "name": "Blocking phishing sites",
      "description": "Control method for web push notification by browser extension",
      "version": "1.0",
      "manifest_version": 2,
      "web_accessible_resources": ["js/content.js"],
      "content_scripts": [
        {
          "matches": ["<all_urls>"],
          "run_at": "document_start",
          "js": ["js/inject.js"]
        }
      ],
      "permissions": [
        "*://*/*",
        "tabs",
        "webRequest",
        "webRequestBlocking",
        "webNavigation"
      ]
    }
    
[/code]

content.js

[code]

    Notification = (function(Notification) {
    
      function MyNotification(...args) {
        console.log("title: ", args[0]);
        console.log("body: ", args[1].body);
        console.log("icon: ", args[1].icon);
    
            ・・・(省略)・・・
        return new Notification(...args);
    
      };
    
      Object.assign(MyNotification, Notification);
      MyNotification.prototype = Notification.prototype;
    
      return MyNotification;
    })(Notification);
    
    window.open = function (open) {
      return function (url, name, features) {
          console.log("url: ", url);
          return open.call(window, url, name, features);
      };
    }(window.open);
    
[/code]

content.jsは・・・(省略)・・・の部分で、titleやbodyをブラックリスト比較して、登録されていなければ、その下の`return new
Notification(...args);`を実行する形

お時間あるときにご回答いただければ幸いです。


CC BY-SA 4.0
2022-11-11T07:49:19.543
92153
2022-11-11T11:37:05.160
2022-11-11T11:37:05.160
55256
55256
question
javascript google-chrome chrome-extension
ブラウザ拡張でサイト内で実装されたwindow.open()のurlを開く前に取得したい


> 遷移後にurlを取得することは出来た

との事ですが、質問のコードで遷移前に取得できているように見えます。すぐに本来（置き換え前）の `window.open`
を呼び出しているので、順序が解らなくなっているだけでは無いでしょうか。

このまま取得した `url` を使い条件分岐すれば機能するのでは？

[code]

    if (url === BAD_URL) {
        // 拒否
        return null;
    } else {
        // 本来のwindow.open の呼び出し
        return open...
    }
    
[/code]


CC BY-SA 4.0
2022-11-11T08:40:12.220
92159
2022-11-11T08:40:12.220
3054
92153
answer