无法读取 null 的属性(读取“postMessage”)

Cannot read properties of null (reading 'postMessage')

提问人:Jabu 提问时间:11/14/2023 最后编辑:Jabu 更新时间:11/18/2023 访问量:159

问:

赏金将在 11 小时后到期。这个问题的答案有资格获得 +100 声望赏金。Jabu 希望引起人们对这个问题的更多关注

C++我正在使用 ;小部件工作正常,问题出在登录上。QWebEngineView

我能够从小部件登录我的 discord 帐户,但是在登录窗口关闭并返回小部件后,我在控制台上收到以下错误:

js: Error with Permissions-Policy header: Origin trial controlled feature not enabled: 'interest-cohort'.
js: Unrecognized Content-Security-Policy directive 'prefetch-src'.
js: Uncaught (in promise) function(){}
js: Unrecognized Content-Security-Policy directive 'prefetch-src'.
js: Unrecognized Content-Security-Policy directive 'prefetch-src'.
js: Uncaught (in promise) Error: Cannot find module './notosans-400-normalitalic.woff2'
js: Unrecognized Content-Security-Policy directive 'prefetch-src'.
js: Unrecognized Content-Security-Policy directive 'prefetch-src'.
js: Uncaught (in promise) #<Object>
js: [DEPRECATED] Please use `subscribeWithSelector` middleware
js: Window state not initialized window-1
js: Window state not initialized window-1
js: Window state not initialized window-1
js: Uncaught TypeError: Cannot read properties of null (reading 'postMessage')

可重现的例子:

class WebEnginePage : public QWebEnginePage
{
    Q_OBJECT

public:
    WebEnginePage(QObject* parent = nullptr) : QWebEnginePage(parent) {}

    QWebEnginePage* createWindow(QWebEnginePage::WebWindowType type) override
    {
        QWebEnginePage* page = new QWebEnginePage(this);
        // To make the page be opened in the same window.
        connect(page, &QWebEnginePage::urlChanged, this, [=]
        {
            setUrl(page->url());
            page->deleteLater();
        });
        return page;
    }
};

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QWebEngineView* view = new QWebEngineView;
    WebEnginePage* page = new WebEnginePage(view);
    page->setUrl(QUrl("qrc:/test.html"));
    view->setPage(page);
    view->setMinimumSize(800, 600);
    view->show();
    return app.exec();
}

我还尝试在页面配置文件中安装一个 url 请求拦截器,并添加错误日志“interest-cohort”中看到的策略标头,但我继续收到错误:

RequestsInterceptor* requestsInterceptor = new RequestsInterceptor;
page->profile->setUrlRequestInterceptor(requestsInterceptor);


class RequestsInterceptor : public QWebEngineUrlRequestInterceptor
{
    Q_OBJECT    
public:
    virtual void interceptRequest(QWebEngineUrlRequestInfo& info) override
    {
        info.setHttpHeader("Permissions-Policy", "interest-cohort=()");
        info.setHttpHeader("Access-Control-Allow-Origin", "*");
        //qDebug() << info.firstPartyUrl();
        //qDebug() << info.navigationType();
        //if (info.firstPartyUrl().toString().contains("https://s-e.widgetbot.io/api/auth/discord/cb"))
        //  info.setHttpHeader("Access-Control-Allow-Origin", "*");
    }
};

我一直在搜索错误并发现了这个问题,我很困惑问题是在 Javascript 端、端还是 s。Cannot read properties of null (reading 'postMessage')widgetQWebEngine

小部件在浏览器上测试时工作正常,我能够登录:

// qrc:/test.html
<script src='https://cdn.jsdelivr.net/npm/@widgetbot/crate@3' async defer>
const crate = new Crate({
    server: '1173813471083761744',
    channel: '1173813471083761747',
})
</script>

在我尝试登录的代码片段中,Stack Overflow 沙箱阻止访问本地存储并且失败。

这是另一个工作选项:https://jsfiddle.net/wdzgo31y/

https://i.imgur.com/ibmyYnO.gif

JavaScript C++ Qt Chromium QWebEngineView

评论


答:

0赞 Jithil P Ponnan 11/14/2023 #1

错误似乎来自 JS。可能不是来自您的代码,而是来自 discord SDK/包。

这是一个浏览器 API,用于将登录结果发送回主窗口。如果您从进程调用 discord 登录将遇到此问题。这就是您在浏览器中没有收到此错误的原因。postMessage

评论

0赞 Jabu 11/14/2023
我已经提供了复制所需的一切,缺少什么?
0赞 Jithil P Ponnan 11/14/2023
那么,您希望人们创建一个应用程序并嵌入代码来重现您的问题吗?更好的是,托管最少的步骤并共享它。仅供参考,所有提供的代码段都不会产生任何错误。
0赞 Jabu 11/14/2023
我在上面写过“在浏览器上测试时小部件工作正常”,问题是在 c++ 应用程序上托管小部件时,我不理解 wdym 与创建应用程序。QWebEngine
0赞 Jithil P Ponnan 11/15/2023
这就是重点,给出运行应用程序的示例是行不通的。获得答案的机会取决于您提供的可重复性。仅仅提到QWebEngine永远不会给你带来答案。
0赞 Jithil P Ponnan 11/15/2023
尝试托管最小的代码存储库。