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 }