Проблема с зацепкой к WebSocket

Возможно, кто то встречался с такой проблемой, что нужно зацепиться на некий WebSocket на сайте для перехвата и отправки сообщений. Я реализовал полностью рабочий код для скрипта содержимого (content script), и он работает, если его запускать через TamperMonkey. Но если я пытаюсь запихнуть его в свое расширение, то зацепа просто нет. Никаких ошибок, никаких логов, просто пустота. Я подозреваю, что дело может быть в политике безопасности расширений или что то подобное, не сильно разбираюсь в этом. Если кто нибудь знает, как работают расширения, не могли бы, пожалуйста, объяснить, как все же заставить работать его из своего расширения? В браузер загружаю в виде распакованного расширения, из папки. Файлы пока не прикладываю, если вдруг понадобятся какие то листинги, напишите, пожалуйста, в комментариях к вопросу, я максимально быстро их приложу.

Файл манифеста

{
"manifest_version": 3,
"name": "asd",
"description": "asd",
"version": "12",
"permissions": [
    "proxy"
],
"icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
},

"content_scripts": [
    
    {
        "matches": [
            "https://lichess.org/*"
            
        ],
        "js": [
            "code.js"
        ],
        "css": [
            "style.css"
        ],
        "run_at": "document_start"
    }]
}

Функция для установки и подмены сокет-соединения и дальнейшей обработки.

function interceptWebSocket() {

    let webSocket = window.WebSocket;
    const webSocketProxy = new Proxy(webSocket, {
        construct: function (target, args) {
            let wrappedWebSocket = new target(...args);
            webSocketWrapper = wrappedWebSocket;

            wrappedWebSocket.addEventListener("message", function (event) {
                let message = JSON.parse(event.data);
                console.log(message)
    
                if (message.d && typeof message.d.fen === "string" && typeof message.v === "number") {
                    currentFen = message.d.fen;

                    let isWhitesTurn = message.v % 2 == 0;
                    if (isWhitesTurn) {
                        currentFen += " w";
                        curF = "w"
                    } else {;
                        currentFen += " b";
                        curF = "b";
                    }
                    //calculateMove();
                    if(last != move)
                    {webSocketWrapper.send(JSON.stringify({
                      t: "move",
                      d: { u: move, b: 1, l: 100, a: 1 }
                  }));
                  myColor =     get_color();
                  if(curF = myColor[0])
                  {
                                                  last = move;
                  }}

                }
            });
            return wrappedWebSocket;
        }
    });

    window.WebSocket = webSocketProxy;
}

Представленный выше код используется в самом скрипте. Следующий код выводит сообщение из сокета по приходу. Он также работает в TamperMonkey, но не работает через расширение.

function interceptWebSocket() {

    let webSocket = window.WebSocket;
    const webSocketProxy = new Proxy(webSocket, {
        construct: function (target, args) {
            let wrappedWebSocket = new target(...args);
            webSocketWrapper = wrappedWebSocket;

            wrappedWebSocket.addEventListener("message", function (event) {
                let message = JSON.parse(event.data);
                console.log(message)
    
            });
            return wrappedWebSocket;
        }
    });

    window.WebSocket = webSocketProxy;
}

Скрипт, работающий в TamperMonkey, но не работающий через contentScript

// ==UserScript==
// @name         Test
// @description  1
// @author       1
// @match         *://lichess.org/*
// @run-at        document-start
// @grant         none
// ==/UserScript==
function interceptWebSocket() {

    let webSocket = window.WebSocket;
    const webSocketProxy = new Proxy(webSocket, {
        construct: function (target, args) {
            let wrappedWebSocket = new target(...args);
            webSocketWrapper = wrappedWebSocket;

            wrappedWebSocket.addEventListener("message", function (event) {
                let message = JSON.parse(event.data);
                console.log(message);

            });
            return wrappedWebSocket;
        }
    });

    window.WebSocket = webSocketProxy;
}
interceptWebSocket();

Ответы (1 шт):

Автор решения: Никита

Благодаря ответу @AlexanderLonberg получилось разобраться в вопросе. Как говорил Александр, contentScript имеют свои выделенные контейнеры для выполнения в области сайта, и не могут пересекаться со скриптами самого сайта. Для решения надо добавить "world": "MAIN" в раздел contentScripts манифеста расширения, разрешив скриптам выполняться в основной области сайта. Подробнее о контейнерах скриптов тут и тут. Про раздел манифеста тут

→ Ссылка