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

Jab*_*abu 5 javascript c++ qt chromium qwebengineview

我正在使用以下命令在 C++ 应用程序中嵌入不和谐小部件QWebEngineView我正在使用;小部件工作一切正常,问题在于登录。

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

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')
Run Code Online (Sandbox Code Playgroud)

可重现的例子:

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();
}
Run Code Online (Sandbox Code Playgroud)

我还尝试在页面配置文件中安装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", "*");
    }
};
Run Code Online (Sandbox Code Playgroud)

我一直在搜索错误Cannot read properties of null (reading 'postMessage') 并发现了这个问题,我很困惑如果问题是在Javascript方面,侧面widget还是在QWebEngine's上。

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 0

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

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