Falkon Develop
Cross-platform Qt-based web browser
useragentdialog.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2010-2018 David Rosca <nowrep@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18#include "useragentdialog.h"
19#include "ui_useragentdialog.h"
20#include "useragentmanager.h"
21#include "qztools.h"
22#include "mainapplication.h"
23#include "settings.h"
24#include "networkmanager.h"
25
26#include <QFormLayout>
27#include <QLineEdit>
28#include <QLabel>
29
31 : QDialog(parent)
32 , ui(new Ui::UserAgentDialog)
33 , m_manager(mApp->userAgentManager())
34{
35 setAttribute(Qt::WA_DeleteOnClose);
36
37 ui->setupUi(this);
38 ui->globalComboBox->setLayoutDirection(Qt::LeftToRight);
39 ui->table->setLayoutDirection(Qt::LeftToRight);
40
41 QString os = QzTools::operatingSystemLong();
42#ifdef Q_OS_UNIX
43 if (QGuiApplication::platformName() == QL1S("xcb"))
44 os.prepend(QL1S("X11; "));
45 else if (QGuiApplication::platformName().startsWith(QL1S("wayland")))
46 os.prepend(QL1S("Wayland; "));
47#endif
48
49 QRegularExpression chromeRx(QSL("Chrome/([^\\s]+)"));
50 const QString chromeVersion = chromeRx.match(m_manager->defaultUserAgent()).captured(1);
51
52 m_knownUserAgents << QSL("Opera/9.80 (%1) Presto/2.12.388 Version/12.16").arg(os)
53 << QSL("Mozilla/5.0 (%1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%2 Safari/537.36").arg(os, chromeVersion)
54 << QSL("Mozilla/5.0 (%1) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0.2 Safari/602.3.12").arg(os)
55 << QSL("Mozilla/5.0 (%1; rv:102.0) Gecko/20100101 Firefox/102.0").arg(os);
56
57 ui->globalComboBox->addItems(m_knownUserAgents);
58
59 const QString globalUserAgent = m_manager->globalUserAgent();
60 ui->changeGlobal->setChecked(!globalUserAgent.isEmpty());
61 ui->globalComboBox->lineEdit()->setText(globalUserAgent);
62 ui->globalComboBox->lineEdit()->setCursorPosition(0);
63
64 ui->changePerSite->setChecked(m_manager->usePerDomainUserAgents());
65
66 QHashIterator<QString, QString> i(m_manager->perDomainUserAgentsList());
67 while (i.hasNext()) {
68 i.next();
69
70 auto* siteItem = new QTableWidgetItem(i.key());
71 auto* userAgentItem = new QTableWidgetItem(i.value());
72
73 int row = ui->table->rowCount();
74
75 ui->table->insertRow(row);
76 ui->table->setItem(row, 0, siteItem);
77 ui->table->setItem(row, 1, userAgentItem);
78 }
79
80 ui->table->sortByColumn(-1, Qt::AscendingOrder);
81
82 connect(ui->add, &QAbstractButton::clicked, this, &UserAgentDialog::addSite);
83 connect(ui->remove, &QAbstractButton::clicked, this, &UserAgentDialog::removeSite);
84 connect(ui->edit, &QAbstractButton::clicked, this, &UserAgentDialog::editSite);
85 connect(ui->table, &QTableWidget::itemDoubleClicked, this, &UserAgentDialog::editSite);
86
87 connect(ui->changeGlobal, &QAbstractButton::clicked, this, &UserAgentDialog::enableGlobalComboBox);
88 connect(ui->changePerSite, &QAbstractButton::clicked, this, &UserAgentDialog::enablePerSiteFrame);
89
90 enableGlobalComboBox(ui->changeGlobal->isChecked());
91 enablePerSiteFrame(ui->changePerSite->isChecked());
92}
93
94void UserAgentDialog::addSite()
95{
96 QString site;
97 QString userAgent;
98
99 if (showEditDialog(tr("Add new site"), &site, &userAgent)) {
100 auto* siteItem = new QTableWidgetItem(site);
101 auto* userAgentItem = new QTableWidgetItem(userAgent);
102
103 int row = ui->table->rowCount();
104
105 ui->table->insertRow(row);
106 ui->table->setItem(row, 0, siteItem);
107 ui->table->setItem(row, 1, userAgentItem);
108 }
109}
110
111void UserAgentDialog::removeSite()
112{
113 int row = ui->table->currentRow();
114
115 QTableWidgetItem* siteItem = ui->table->item(row, 0);
116 QTableWidgetItem* userAgentItem = ui->table->item(row, 1);
117
118 if (siteItem && userAgentItem) {
119 delete siteItem;
120 delete userAgentItem;
121
122 ui->table->removeRow(row);
123 }
124}
125
126void UserAgentDialog::editSite()
127{
128 int row = ui->table->currentRow();
129
130 QTableWidgetItem* siteItem = ui->table->item(row, 0);
131 QTableWidgetItem* userAgentItem = ui->table->item(row, 1);
132
133 if (siteItem && userAgentItem) {
134 QString site = siteItem->text();
135 QString userAgent = userAgentItem->text();
136
137 if (showEditDialog(tr("Edit site"), &site, &userAgent)) {
138 siteItem->setText(site);
139 userAgentItem->setText(userAgent);
140 }
141 }
142}
143
144void UserAgentDialog::accept()
145{
146 QString globalUserAgent = ui->changeGlobal->isChecked() ? ui->globalComboBox->currentText() : QString();
147 QStringList domainList;
148 QStringList userAgentsList;
149
150 for (int i = 0; i < ui->table->rowCount(); ++i) {
151 QTableWidgetItem* siteItem = ui->table->item(i, 0);
152 QTableWidgetItem* userAgentItem = ui->table->item(i, 1);
153
154 if (!siteItem || !userAgentItem) {
155 continue;
156 }
157
158 QString domain = siteItem->text().trimmed();
159 QString userAgent = userAgentItem->text().trimmed();
160
161 if (domain.isEmpty() || userAgent.isEmpty()) {
162 continue;
163 }
164
165 domainList.append(domain);
166 userAgentsList.append(userAgent);
167 }
168
169 Settings settings;
170 settings.beginGroup(QSL("Web-Browser-Settings"));
171 settings.setValue(QSL("UserAgent"), globalUserAgent);
172 settings.endGroup();
173
174 settings.beginGroup(QSL("User-Agent-Settings"));
175 settings.setValue(QSL("UsePerDomainUA"), ui->changePerSite->isChecked());
176 settings.setValue(QSL("DomainList"), domainList);
177 settings.setValue(QSL("UserAgentsList"), userAgentsList);
178 settings.endGroup();
179
180 m_manager->loadSettings();
181 mApp->networkManager()->loadSettings();
182 close();
183}
184
185void UserAgentDialog::enableGlobalComboBox(bool enable)
186{
187 ui->globalComboBox->setEnabled(enable);
188}
189
190void UserAgentDialog::enablePerSiteFrame(bool enable)
191{
192 ui->perSiteFrame->setEnabled(enable);
193}
194
195bool UserAgentDialog::showEditDialog(const QString &title, QString* rSite, QString* rUserAgent)
196{
197 if (!rSite || !rUserAgent) {
198 return false;
199 }
200
201 auto* dialog = new QDialog(this);
202 auto* layout = new QFormLayout(dialog);
203 auto* editSite = new QLineEdit(dialog);
204 auto* editAgent = new QComboBox(dialog);
205 editAgent->setLayoutDirection(Qt::LeftToRight);
206 editAgent->setEditable(true);
207 editAgent->addItems(m_knownUserAgents);
208
209 auto* box = new QDialogButtonBox(dialog);
210 box->addButton(QDialogButtonBox::Ok);
211 box->addButton(QDialogButtonBox::Cancel);
212
213 connect(box, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
214 connect(box, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
215
216 layout->addRow(new QLabel(tr("Site domain: ")), editSite);
217 layout->addRow(new QLabel(tr("User Agent: ")), editAgent);
218 layout->addRow(box);
219
220 editSite->setText(*rSite);
221 editAgent->lineEdit()->setText(*rUserAgent);
222
223 editSite->setFocus();
224 editAgent->lineEdit()->setCursorPosition(0);
225
226 dialog->setWindowTitle(title);
227 dialog->setMinimumSize(550, 100);
228 dialog->setMaximumWidth(550);
229
230 if (dialog->exec()) {
231 *rSite = editSite->text();
232 *rUserAgent = editAgent->currentText();
233
234 return !rSite->isEmpty() && !rUserAgent->isEmpty();
235 }
236
237 return false;
238}
239
241{
242 delete ui;
243}
static QString operatingSystemLong()
Definition: qztools.cpp:1015
void beginGroup(const QString &prefix)
Definition: settings.cpp:79
void endGroup()
Definition: settings.cpp:84
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
Definition: settings.cpp:69
UserAgentDialog(QWidget *parent=nullptr)
~UserAgentDialog() override
bool usePerDomainUserAgents() const
QString defaultUserAgent() const
QHash< QString, QString > perDomainUserAgentsList() const
QString globalUserAgent() const
#define mApp
i
Definition: i18n.py:23
#define QL1S(x)
Definition: qzcommon.h:44
#define QSL(x)
Definition: qzcommon.h:40