File indexing completed on 2024-05-12 04:58:20
0001 /* ============================================================ 0002 * Falkon - Qt web browser 0003 * Copyright (C) 2010-2018 David Rosca <nowrep@gmail.com> 0004 * 0005 * This program is free software: you can redistribute it and/or modify 0006 * it under the terms of the GNU General Public License as published by 0007 * the Free Software Foundation, either version 3 of the License, or 0008 * (at your option) any later version. 0009 * 0010 * This program is distributed in the hope that it will be useful, 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0013 * GNU General Public License for more details. 0014 * 0015 * You should have received a copy of the GNU General Public License 0016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 0017 * ============================================================ */ 0018 #include "useragentdialog.h" 0019 #include "ui_useragentdialog.h" 0020 #include "useragentmanager.h" 0021 #include "qztools.h" 0022 #include "mainapplication.h" 0023 #include "settings.h" 0024 #include "networkmanager.h" 0025 0026 #include <QFormLayout> 0027 #include <QLineEdit> 0028 #include <QLabel> 0029 0030 UserAgentDialog::UserAgentDialog(QWidget* parent) 0031 : QDialog(parent) 0032 , ui(new Ui::UserAgentDialog) 0033 , m_manager(mApp->userAgentManager()) 0034 { 0035 setAttribute(Qt::WA_DeleteOnClose); 0036 0037 ui->setupUi(this); 0038 ui->globalComboBox->setLayoutDirection(Qt::LeftToRight); 0039 ui->table->setLayoutDirection(Qt::LeftToRight); 0040 0041 QString os = QzTools::operatingSystemLong(); 0042 #ifdef Q_OS_UNIX 0043 if (QGuiApplication::platformName() == QL1S("xcb")) 0044 os.prepend(QL1S("X11; ")); 0045 else if (QGuiApplication::platformName().startsWith(QL1S("wayland"))) 0046 os.prepend(QL1S("Wayland; ")); 0047 #endif 0048 0049 QRegularExpression chromeRx(QSL("Chrome/([^\\s]+)")); 0050 const QString chromeVersion = chromeRx.match(m_manager->defaultUserAgent()).captured(1); 0051 0052 m_knownUserAgents << QSL("Opera/9.80 (%1) Presto/2.12.388 Version/12.16").arg(os) 0053 << QSL("Mozilla/5.0 (%1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%2 Safari/537.36").arg(os, chromeVersion) 0054 << QSL("Mozilla/5.0 (%1) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0.2 Safari/602.3.12").arg(os) 0055 << QSL("Mozilla/5.0 (%1; rv:102.0) Gecko/20100101 Firefox/102.0").arg(os); 0056 0057 ui->globalComboBox->addItems(m_knownUserAgents); 0058 0059 const QString globalUserAgent = m_manager->globalUserAgent(); 0060 ui->changeGlobal->setChecked(!globalUserAgent.isEmpty()); 0061 ui->globalComboBox->lineEdit()->setText(globalUserAgent); 0062 ui->globalComboBox->lineEdit()->setCursorPosition(0); 0063 0064 ui->changePerSite->setChecked(m_manager->usePerDomainUserAgents()); 0065 0066 QHashIterator<QString, QString> i(m_manager->perDomainUserAgentsList()); 0067 while (i.hasNext()) { 0068 i.next(); 0069 0070 auto* siteItem = new QTableWidgetItem(i.key()); 0071 auto* userAgentItem = new QTableWidgetItem(i.value()); 0072 0073 int row = ui->table->rowCount(); 0074 0075 ui->table->insertRow(row); 0076 ui->table->setItem(row, 0, siteItem); 0077 ui->table->setItem(row, 1, userAgentItem); 0078 } 0079 0080 ui->table->sortByColumn(-1, Qt::AscendingOrder); 0081 0082 connect(ui->add, &QAbstractButton::clicked, this, &UserAgentDialog::addSite); 0083 connect(ui->remove, &QAbstractButton::clicked, this, &UserAgentDialog::removeSite); 0084 connect(ui->edit, &QAbstractButton::clicked, this, &UserAgentDialog::editSite); 0085 connect(ui->table, &QTableWidget::itemDoubleClicked, this, &UserAgentDialog::editSite); 0086 0087 connect(ui->changeGlobal, &QAbstractButton::clicked, this, &UserAgentDialog::enableGlobalComboBox); 0088 connect(ui->changePerSite, &QAbstractButton::clicked, this, &UserAgentDialog::enablePerSiteFrame); 0089 0090 enableGlobalComboBox(ui->changeGlobal->isChecked()); 0091 enablePerSiteFrame(ui->changePerSite->isChecked()); 0092 } 0093 0094 void UserAgentDialog::addSite() 0095 { 0096 QString site; 0097 QString userAgent; 0098 0099 if (showEditDialog(tr("Add new site"), &site, &userAgent)) { 0100 auto* siteItem = new QTableWidgetItem(site); 0101 auto* userAgentItem = new QTableWidgetItem(userAgent); 0102 0103 int row = ui->table->rowCount(); 0104 0105 ui->table->insertRow(row); 0106 ui->table->setItem(row, 0, siteItem); 0107 ui->table->setItem(row, 1, userAgentItem); 0108 } 0109 } 0110 0111 void UserAgentDialog::removeSite() 0112 { 0113 int row = ui->table->currentRow(); 0114 0115 QTableWidgetItem* siteItem = ui->table->item(row, 0); 0116 QTableWidgetItem* userAgentItem = ui->table->item(row, 1); 0117 0118 if (siteItem && userAgentItem) { 0119 delete siteItem; 0120 delete userAgentItem; 0121 0122 ui->table->removeRow(row); 0123 } 0124 } 0125 0126 void UserAgentDialog::editSite() 0127 { 0128 int row = ui->table->currentRow(); 0129 0130 QTableWidgetItem* siteItem = ui->table->item(row, 0); 0131 QTableWidgetItem* userAgentItem = ui->table->item(row, 1); 0132 0133 if (siteItem && userAgentItem) { 0134 QString site = siteItem->text(); 0135 QString userAgent = userAgentItem->text(); 0136 0137 if (showEditDialog(tr("Edit site"), &site, &userAgent)) { 0138 siteItem->setText(site); 0139 userAgentItem->setText(userAgent); 0140 } 0141 } 0142 } 0143 0144 void UserAgentDialog::accept() 0145 { 0146 QString globalUserAgent = ui->changeGlobal->isChecked() ? ui->globalComboBox->currentText() : QString(); 0147 QStringList domainList; 0148 QStringList userAgentsList; 0149 0150 for (int i = 0; i < ui->table->rowCount(); ++i) { 0151 QTableWidgetItem* siteItem = ui->table->item(i, 0); 0152 QTableWidgetItem* userAgentItem = ui->table->item(i, 1); 0153 0154 if (!siteItem || !userAgentItem) { 0155 continue; 0156 } 0157 0158 QString domain = siteItem->text().trimmed(); 0159 QString userAgent = userAgentItem->text().trimmed(); 0160 0161 if (domain.isEmpty() || userAgent.isEmpty()) { 0162 continue; 0163 } 0164 0165 domainList.append(domain); 0166 userAgentsList.append(userAgent); 0167 } 0168 0169 Settings settings; 0170 settings.beginGroup(QSL("Web-Browser-Settings")); 0171 settings.setValue(QSL("UserAgent"), globalUserAgent); 0172 settings.endGroup(); 0173 0174 settings.beginGroup(QSL("User-Agent-Settings")); 0175 settings.setValue(QSL("UsePerDomainUA"), ui->changePerSite->isChecked()); 0176 settings.setValue(QSL("DomainList"), domainList); 0177 settings.setValue(QSL("UserAgentsList"), userAgentsList); 0178 settings.endGroup(); 0179 0180 m_manager->loadSettings(); 0181 mApp->networkManager()->loadSettings(); 0182 close(); 0183 } 0184 0185 void UserAgentDialog::enableGlobalComboBox(bool enable) 0186 { 0187 ui->globalComboBox->setEnabled(enable); 0188 } 0189 0190 void UserAgentDialog::enablePerSiteFrame(bool enable) 0191 { 0192 ui->perSiteFrame->setEnabled(enable); 0193 } 0194 0195 bool UserAgentDialog::showEditDialog(const QString &title, QString* rSite, QString* rUserAgent) 0196 { 0197 if (!rSite || !rUserAgent) { 0198 return false; 0199 } 0200 0201 auto* dialog = new QDialog(this); 0202 auto* layout = new QFormLayout(dialog); 0203 auto* editSite = new QLineEdit(dialog); 0204 auto* editAgent = new QComboBox(dialog); 0205 editAgent->setLayoutDirection(Qt::LeftToRight); 0206 editAgent->setEditable(true); 0207 editAgent->addItems(m_knownUserAgents); 0208 0209 auto* box = new QDialogButtonBox(dialog); 0210 box->addButton(QDialogButtonBox::Ok); 0211 box->addButton(QDialogButtonBox::Cancel); 0212 0213 connect(box, &QDialogButtonBox::rejected, dialog, &QDialog::reject); 0214 connect(box, &QDialogButtonBox::accepted, dialog, &QDialog::accept); 0215 0216 layout->addRow(new QLabel(tr("Site domain: ")), editSite); 0217 layout->addRow(new QLabel(tr("User Agent: ")), editAgent); 0218 layout->addRow(box); 0219 0220 editSite->setText(*rSite); 0221 editAgent->lineEdit()->setText(*rUserAgent); 0222 0223 editSite->setFocus(); 0224 editAgent->lineEdit()->setCursorPosition(0); 0225 0226 dialog->setWindowTitle(title); 0227 dialog->setMinimumSize(550, 100); 0228 dialog->setMaximumWidth(550); 0229 0230 if (dialog->exec()) { 0231 *rSite = editSite->text(); 0232 *rUserAgent = editAgent->currentText(); 0233 0234 return !rSite->isEmpty() && !rUserAgent->isEmpty(); 0235 } 0236 0237 return false; 0238 } 0239 0240 UserAgentDialog::~UserAgentDialog() 0241 { 0242 delete ui; 0243 }