提问人:Jabu 提问时间:11/14/2023 最后编辑:Jabu 更新时间:11/18/2023 访问量:159
无法读取 null 的属性(读取“postMessage”)
Cannot read properties of null (reading 'postMessage')
问:
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')
widget
QWebEngine
该小部件在浏览器上测试时工作正常,我能够登录:
// 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/
答:
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
尝试托管最小的代码存储库。
评论