mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-07-12 16:29:41 -04:00
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.
111 lines
2.2 KiB
C++
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();
|
|
}
|