Files
obs-studio/frontend/dialogs/OAuthLogin.cpp
PatTheMav 13ba51a9ad frontend: Use Qt parent-child ownership in OAuth dialog
By explicitly setting the OAuth dialog as the parent of the CEF widget,
it will automatically by cleaned up as soon as the dialog is closed
itself.

This also detaches the destruction of the widget from the browser
cleanup code.
2025-10-17 14:31:38 +02:00

111 lines
2.2 KiB
C++

#include "OAuthLogin.hpp"
#include <widgets/OBSBasic.hpp>
#ifdef BROWSER_AVAILABLE
#include <browser-panel.hpp>
#endif
#include <ui-config.h>
#include "moc_OAuthLogin.cpp"
#ifdef BROWSER_AVAILABLE
extern QCef *cef;
extern QCefCookieManager *panel_cookies;
#endif
OAuthLogin::OAuthLogin(QWidget *parent, const std::string &url, bool token) : QDialog(parent), get_token(token)
{
#ifdef BROWSER_AVAILABLE
if (!cef) {
return;
}
setWindowTitle("Auth");
setMinimumSize(400, 400);
resize(700, 700);
Qt::WindowFlags flags = windowFlags();
Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint;
setWindowFlags(flags & (~helpFlag));
OBSBasic::InitBrowserPanelSafeBlock();
cefWidget = cef->create_widget(this, url, panel_cookies);
if (!cefWidget) {
fail = true;
return;
}
connect(cefWidget, &QCefWidget::titleChanged, this, &OAuthLogin::setWindowTitle);
connect(cefWidget, &QCefWidget::urlChanged, this, &OAuthLogin::urlChanged);
QPushButton *close = new QPushButton(QTStr("Cancel"));
connect(close, &QAbstractButton::clicked, this, &QDialog::reject);
QHBoxLayout *bottomLayout = new QHBoxLayout();
bottomLayout->addStretch();
bottomLayout->addWidget(close);
bottomLayout->addStretch();
QVBoxLayout *topLayout = new QVBoxLayout(this);
topLayout->addWidget(cefWidget);
topLayout->addLayout(bottomLayout);
#else
UNUSED_PARAMETER(url);
#endif
}
OAuthLogin::~OAuthLogin() {}
int OAuthLogin::exec()
{
#ifdef BROWSER_AVAILABLE
if (cefWidget) {
return QDialog::exec();
}
#endif
return QDialog::Rejected;
}
void OAuthLogin::reject()
{
#ifdef BROWSER_AVAILABLE
if (cefWidget) {
cefWidget->closeBrowser();
}
#endif
QDialog::reject();
}
void OAuthLogin::accept()
{
#ifdef BROWSER_AVAILABLE
if (cefWidget) {
cefWidget->closeBrowser();
}
#endif
QDialog::accept();
}
void OAuthLogin::urlChanged(const QString &url)
{
std::string uri = get_token ? "access_token=" : "code=";
int code_idx = url.indexOf(uri.c_str());
if (code_idx == -1)
return;
if (!url.startsWith(OAUTH_BASE_URL))
return;
code_idx += (int)uri.size();
int next_idx = url.indexOf("&", code_idx);
if (next_idx != -1)
code = url.mid(code_idx, next_idx - code_idx);
else
code = url.right(url.size() - code_idx);
accept();
}