1 /**************************************************************************
2 * Otter Browser: Web browser controlled by the user, not vice-versa.
3 * Copyright (C) 2013 - 2019 Michal Dutkiewicz aka Emdek <michal@emdek.pl>
4 * Copyright (C) 2014 - 2016 Piotr Wójcik <chocimier@tlen.pl>
5 * Copyright (C) 2015 - 2016 Jan Bajer aka bajasoft <jbajer@gmail.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 **************************************************************************/
21
22 #include "WebsitePreferencesDialog.h"
23 #include "CookiePropertiesDialog.h"
24 #include "preferences/ContentBlockingDialog.h"
25 #include "../core/ContentFiltersManager.h"
26 #include "../core/NetworkManagerFactory.h"
27 #include "../core/SettingsManager.h"
28 #include "../core/Utils.h"
29
30 #include "ui_WebsitePreferencesDialog.h"
31
32 #include <QtCore/QTextCodec>
33
34 namespace Otter
35 {
36
WebsitePreferencesDialog(const QString & host,const QVector<QNetworkCookie> & cookies,QWidget * parent)37 WebsitePreferencesDialog::WebsitePreferencesDialog(const QString &host, const QVector<QNetworkCookie> &cookies, QWidget *parent) : Dialog(parent),
38 m_updateOverride(true),
39 m_ui(new Ui::WebsitePreferencesDialog)
40 {
41 m_ui->setupUi(this);
42 m_ui->enableCookiesCheckBox->setChecked(true);
43 m_ui->enableJavaScriptCheckBox->setChecked(true);
44
45 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->cookiesPolicyOverrideCheckBox, &QCheckBox::setEnabled);
46 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->cookiesPolicyLabel, &QLabel::setEnabled);
47 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->cookiesPolicyComboBox, &QComboBox::setEnabled);
48 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->keepCookiesModeOverrideCheckBox, &QCheckBox::setEnabled);
49 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->keepCookiesModeLabel, &QLabel::setEnabled);
50 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->keepCookiesModeComboBox, &QComboBox::setEnabled);
51 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->thirdPartyCookiesPolicyOverrideCheckBox, &QCheckBox::setEnabled);
52 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->thirdPartyCookiesPolicyLabel, &QLabel::setEnabled);
53 connect(m_ui->enableCookiesCheckBox, &QCheckBox::toggled, m_ui->thirdPartyCookiesPolicyComboBox, &QComboBox::setEnabled);
54 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->canChangeWindowGeometryCheckBox, &QCheckBox::setEnabled);
55 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->canShowStatusMessagesCheckBox, &QCheckBox::setEnabled);
56 // connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->canHideAddressBarCheckBox, &QCheckBox::setEnabled);
57 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->canAccessClipboardCheckBox, &QCheckBox::setEnabled);
58 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->canReceiveRightClicksCheckBox, &QCheckBox::setEnabled);
59 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->canCloseWindowsLabel, &QCheckBox::setEnabled);
60 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->canCloseWindowsComboBox, &QCheckBox::setEnabled);
61 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->enableFullScreenLabel, &QCheckBox::setEnabled);
62 connect(m_ui->enableJavaScriptCheckBox, &QCheckBox::toggled, m_ui->enableFullScreenComboBox, &QCheckBox::setEnabled);
63
64 m_ui->websiteLineEditWidget->setText(host);
65
66 m_ui->encodingComboBox->addItem(tr("Auto Detect"), QLatin1String("auto"));
67
68 const QVector<int> textCodecs({106, 1015, 1017, 4, 5, 6, 7, 8, 82, 10, 85, 12, 13, 109, 110, 112, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 18, 39, 17, 38, 2026});
69
70 for (int i = 0; i < textCodecs.count(); ++i)
71 {
72 const QTextCodec *codec(QTextCodec::codecForMib(textCodecs.at(i)));
73
74 if (!codec)
75 {
76 continue;
77 }
78
79 m_ui->encodingComboBox->addItem(codec->name(), codec->name());
80 }
81
82 m_ui->popupsPolicyComboBox->addItem(tr("Ask"), QLatin1String("ask"));
83 m_ui->popupsPolicyComboBox->addItem(tr("Block all"), QLatin1String("blockAll"));
84 m_ui->popupsPolicyComboBox->addItem(tr("Open all"), QLatin1String("openAll"));
85 m_ui->popupsPolicyComboBox->addItem(tr("Open all in background"), QLatin1String("openAllInBackground"));
86
87 m_ui->enableImagesComboBox->addItem(tr("All images"), QLatin1String("enabled"));
88 m_ui->enableImagesComboBox->addItem(tr("Cached images"), QLatin1String("onlyCached"));
89 m_ui->enableImagesComboBox->addItem(tr("No images"), QLatin1String("disabled"));
90
91 m_ui->enablePluginsComboBox->addItem(tr("Enabled"), QLatin1String("enabled"));
92 m_ui->enablePluginsComboBox->addItem(tr("On demand"), QLatin1String("onDemand"));
93 m_ui->enablePluginsComboBox->addItem(tr("Disabled"), QLatin1String("disabled"));
94
95 m_ui->canCloseWindowsComboBox->addItem(tr("Ask"), QLatin1String("ask"));
96 m_ui->canCloseWindowsComboBox->addItem(tr("Always"), QLatin1String("allow"));
97 m_ui->canCloseWindowsComboBox->addItem(tr("Never"), QLatin1String("disallow"));
98
99 m_ui->enableFullScreenComboBox->addItem(tr("Ask"), QLatin1String("ask"));
100 m_ui->enableFullScreenComboBox->addItem(tr("Always"), QLatin1String("allow"));
101 m_ui->enableFullScreenComboBox->addItem(tr("Never"), QLatin1String("disallow"));
102
103 m_ui->doNotTrackComboBox->addItem(tr("Inform websites that I do not want to be tracked"), QLatin1String("doNotAllow"));
104 m_ui->doNotTrackComboBox->addItem(tr("Inform websites that I allow tracking"), QLatin1String("allow"));
105 m_ui->doNotTrackComboBox->addItem(tr("Do not inform websites about my preference"), QLatin1String("skip"));
106
107 m_ui->cookiesPolicyComboBox->addItem(tr("Always"), QLatin1String("acceptAll"));
108 m_ui->cookiesPolicyComboBox->addItem(tr("Only existing"), QLatin1String("acceptExisting"));
109 m_ui->cookiesPolicyComboBox->addItem(tr("Only read existing"), QLatin1String("readOnly"));
110
111 m_ui->keepCookiesModeComboBox->addItem(tr("Expires"), QLatin1String("keepUntilExpires"));
112 m_ui->keepCookiesModeComboBox->addItem(tr("Current session is closed"), QLatin1String("keepUntilExit"));
113 m_ui->keepCookiesModeComboBox->addItem(tr("Always ask"), QLatin1String("ask"));
114
115 m_ui->thirdPartyCookiesPolicyComboBox->addItem(tr("Always"), QLatin1String("acceptAll"));
116 m_ui->thirdPartyCookiesPolicyComboBox->addItem(tr("Only existing"), QLatin1String("acceptExisting"));
117 m_ui->thirdPartyCookiesPolicyComboBox->addItem(tr("Never"), QLatin1String("ignore"));
118
119 QStandardItemModel *cookiesModel(new QStandardItemModel(this));
120 cookiesModel->setHorizontalHeaderLabels({tr("Domain"), tr("Name"), tr("Path"), tr("Value"), tr("Expiration Date")});
121
122 m_ui->cookiesViewWidget->setModel(cookiesModel);
123
124 for (int i = 0; i < cookies.count(); ++i)
125 {
126 addCookie(cookies.at(i));
127 }
128
129 m_ui->userAgentComboBox->setModel(new UserAgentsModel(QString(), false, this));
130 m_ui->proxyComboBox->setModel(new ProxiesModel(QString(), false, this));
131
132 m_ui->encodingOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Content_DefaultCharacterEncodingOption));
133 m_ui->popupsPolicyOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_ScriptsCanOpenWindowsOption));
134 m_ui->enableImagesOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_EnableImagesOption));
135 m_ui->enablePluginsOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_EnablePluginsOption));
136 m_ui->userStyleSheetOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Content_UserStyleSheetOption));
137 m_ui->doNotTrackOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Network_DoNotTrackPolicyOption));
138 m_ui->rememberBrowsingHistoryOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::History_RememberBrowsingOption));
139 m_ui->enableCookiesOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Network_CookiesPolicyOption));
140 m_ui->cookiesPolicyOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Network_CookiesPolicyOption));
141 m_ui->keepCookiesModeOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Network_CookiesKeepModeOption));
142 m_ui->thirdPartyCookiesPolicyOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Network_ThirdPartyCookiesPolicyOption));
143 m_ui->enableJavaScriptOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_EnableJavaScriptOption));
144 m_ui->canChangeWindowGeometryOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_ScriptsCanChangeWindowGeometryOption));
145 m_ui->canShowStatusMessagesOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_ScriptsCanShowStatusMessagesOption));
146 m_ui->canAccessClipboardOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_ScriptsCanAccessClipboardOption));
147 m_ui->canReceiveRightClicksOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_ScriptsCanReceiveRightClicksOption));
148 m_ui->canCloseWindowsOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_ScriptsCanCloseWindowsOption));
149 m_ui->enableFullScreenOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Permissions_EnableFullScreenOption));
150 m_ui->sendReferrerOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Network_EnableReferrerOption));
151 m_ui->userAgentOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::Network_UserAgentOption));
152 m_ui->contentBlockingProfilesOverrideCheckBox->setChecked(SettingsManager::hasOverride(host, SettingsManager::ContentBlocking_ProfilesOption));
153
154 updateValues();
155
156 const QList<QCheckBox*> checkBoxes(findChildren<QCheckBox*>());
157
158 for (int i = 0; i < checkBoxes.count(); ++i)
159 {
160 if (checkBoxes.at(i)->text().isEmpty())
161 {
162 connect(checkBoxes.at(i), &QCheckBox::toggled, this, &WebsitePreferencesDialog::updateValues);
163 }
164 else
165 {
166 connect(checkBoxes.at(i), &QCheckBox::toggled, this, &WebsitePreferencesDialog::handleValueChanged);
167 }
168 }
169
170 const QList<QComboBox*> comboBoxes(findChildren<QComboBox*>());
171
172 for (int i = 0; i < comboBoxes.count(); ++i)
173 {
174 connect(comboBoxes.at(i), static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &WebsitePreferencesDialog::handleValueChanged);
175 }
176
177 connect(ContentFiltersManager::getInstance(), &ContentFiltersManager::profileModified, this, &WebsitePreferencesDialog::updateContentBlockingProfile);
178 connect(m_ui->userStyleSheetFilePathWidget, &FilePathWidget::pathChanged, this, &WebsitePreferencesDialog::handleValueChanged);
179 connect(m_ui->cookiesViewWidget, &ItemViewWidget::needsActionsUpdate, this, &WebsitePreferencesDialog::updateCookiesActions);
180 connect(m_ui->cookiesAddButton, &QPushButton::clicked, this, &WebsitePreferencesDialog::addNewCookie);
181 connect(m_ui->cookiesDeleteButton, &QPushButton::clicked, this, &WebsitePreferencesDialog::removeCookie);
182 connect(m_ui->cookiesPropertiesButton, &QPushButton::clicked, this, &WebsitePreferencesDialog::cookieProperties);
183 connect(m_ui->contentBlockingProfilesViewWidget, &ItemViewWidget::modified, this, &WebsitePreferencesDialog::handleValueChanged);
184 connect(m_ui->enableCustomRulesCheckBox, &QCheckBox::toggled, this, &WebsitePreferencesDialog::handleValueChanged);
185 connect(m_ui->buttonBox, &QDialogButtonBox::clicked, this, &WebsitePreferencesDialog::handleButtonClicked);
186 }
187
~WebsitePreferencesDialog()188 WebsitePreferencesDialog::~WebsitePreferencesDialog()
189 {
190 delete m_ui;
191 }
192
changeEvent(QEvent * event)193 void WebsitePreferencesDialog::changeEvent(QEvent *event)
194 {
195 QDialog::changeEvent(event);
196
197 if (event->type() == QEvent::LanguageChange)
198 {
199 m_ui->retranslateUi(this);
200 m_ui->cookiesViewWidget->getSourceModel()->setHorizontalHeaderLabels({tr("Domain"), tr("Name"), tr("Path"), tr("Value"), tr("Expiration Date")});
201 }
202 }
203
addCookie(const QNetworkCookie & cookie)204 void WebsitePreferencesDialog::addCookie(const QNetworkCookie &cookie)
205 {
206 QList<QStandardItem*> items({new QStandardItem(cookie.domain()), new QStandardItem(QString(cookie.name())), new QStandardItem(cookie.path()), new QStandardItem(QString(cookie.value())), new QStandardItem(cookie.isSessionCookie() ? tr("this session only") : Utils::formatDateTime(cookie.expirationDate()))});
207 items[0]->setData(cookie.toRawForm(), Qt::UserRole);
208 items[0]->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
209 items[1]->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
210 items[2]->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
211 items[3]->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
212 items[4]->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren);
213
214 m_ui->cookiesViewWidget->getSourceModel()->appendRow(items);
215 }
216
addNewCookie()217 void WebsitePreferencesDialog::addNewCookie()
218 {
219 const QString host(getHost());
220 QNetworkCookie cookie;
221 cookie.setDomain(host.startsWith(QLatin1String("*.")) ? host.mid(1) : host);
222
223 CookiePropertiesDialog dialog(cookie, this);
224
225 if (dialog.exec() == QDialog::Accepted)
226 {
227 m_cookiesToInsert.append(dialog.getModifiedCookie());
228
229 addCookie(dialog.getModifiedCookie());
230 }
231 }
232
removeCookie()233 void WebsitePreferencesDialog::removeCookie()
234 {
235 m_cookiesToDelete.append(QNetworkCookie::parseCookies(m_ui->cookiesViewWidget->getIndex(m_ui->cookiesViewWidget->getCurrentRow()).data(Qt::UserRole).toByteArray()).value(0));
236
237 m_ui->cookiesViewWidget->removeRow();
238 }
239
cookieProperties()240 void WebsitePreferencesDialog::cookieProperties()
241 {
242 const QList<QNetworkCookie> cookies(QNetworkCookie::parseCookies(m_ui->cookiesViewWidget->getIndex(m_ui->cookiesViewWidget->getCurrentRow()).data(Qt::UserRole).toByteArray()));
243
244 if (cookies.isEmpty())
245 {
246 return;
247 }
248
249 CookiePropertiesDialog dialog(cookies.first(), this);
250
251 if (dialog.exec() == QDialog::Accepted && dialog.isModified())
252 {
253 removeCookie();
254 addCookie(dialog.getModifiedCookie());
255
256 m_cookiesToInsert.append(dialog.getModifiedCookie());
257 }
258 }
259
handleButtonClicked(QAbstractButton * button)260 void WebsitePreferencesDialog::handleButtonClicked(QAbstractButton *button)
261 {
262 const QString host(getHost());
263
264 if (host.isEmpty())
265 {
266 return;
267 }
268
269 QStringList contentBlockingProfiles;
270
271 switch (m_ui->buttonBox->buttonRole(button))
272 {
273 case QDialogButtonBox::AcceptRole:
274 SettingsManager::setOption(SettingsManager::Content_DefaultCharacterEncodingOption, (m_ui->encodingOverrideCheckBox->isChecked() ? m_ui->encodingComboBox->currentData(Qt::UserRole).toString() : QVariant()), host);
275 SettingsManager::setOption(SettingsManager::Permissions_ScriptsCanOpenWindowsOption, (m_ui->popupsPolicyOverrideCheckBox->isChecked() ? m_ui->popupsPolicyComboBox->currentData(Qt::UserRole).toString() : QVariant()), host);
276 SettingsManager::setOption(SettingsManager::Permissions_EnableImagesOption, (m_ui->enableImagesOverrideCheckBox->isChecked() ? m_ui->enableImagesComboBox->currentData(Qt::UserRole).toString() : QVariant()), host);
277 SettingsManager::setOption(SettingsManager::Permissions_EnablePluginsOption, (m_ui->enablePluginsOverrideCheckBox->isChecked() ? m_ui->enablePluginsComboBox->currentData(Qt::UserRole).toString() : QVariant()), host);
278 SettingsManager::setOption(SettingsManager::Content_UserStyleSheetOption, (m_ui->userStyleSheetOverrideCheckBox->isChecked() ? m_ui->userStyleSheetFilePathWidget->getPath() : QVariant()), host);
279 SettingsManager::setOption(SettingsManager::Network_DoNotTrackPolicyOption, (m_ui->doNotTrackOverrideCheckBox->isChecked() ? m_ui->doNotTrackComboBox->currentData().toString() : QVariant()), host);
280 SettingsManager::setOption(SettingsManager::History_RememberBrowsingOption, (m_ui->rememberBrowsingHistoryOverrideCheckBox->isChecked() ? m_ui->rememberBrowsingHistoryCheckBox->isChecked() : QVariant()), host);
281 SettingsManager::setOption(SettingsManager::Network_CookiesPolicyOption, (m_ui->enableCookiesOverrideCheckBox->isChecked() ? (m_ui->enableCookiesCheckBox->isChecked() ? m_ui->cookiesPolicyComboBox->currentData().toString() : QLatin1String("ignore")) : QVariant()), host);
282 SettingsManager::setOption(SettingsManager::Network_CookiesKeepModeOption, (m_ui->keepCookiesModeOverrideCheckBox->isChecked() ? m_ui->keepCookiesModeComboBox->currentData().toString() : QVariant()), host);
283 SettingsManager::setOption(SettingsManager::Network_ThirdPartyCookiesPolicyOption, (m_ui->thirdPartyCookiesPolicyOverrideCheckBox->isChecked() ? m_ui->thirdPartyCookiesPolicyComboBox->currentData().toString() : QVariant()), host);
284 SettingsManager::setOption(SettingsManager::Permissions_EnableJavaScriptOption, (m_ui->enableJavaScriptOverrideCheckBox->isChecked() ? m_ui->enableJavaScriptCheckBox->isChecked() : QVariant()), host);
285 SettingsManager::setOption(SettingsManager::Permissions_ScriptsCanChangeWindowGeometryOption, (m_ui->canChangeWindowGeometryOverrideCheckBox->isChecked() ? m_ui->canChangeWindowGeometryCheckBox->isChecked() : QVariant()), host);
286 SettingsManager::setOption(SettingsManager::Permissions_ScriptsCanShowStatusMessagesOption, (m_ui->canShowStatusMessagesOverrideCheckBox->isChecked() ? m_ui->canShowStatusMessagesCheckBox->isChecked() : QVariant()), host);
287 SettingsManager::setOption(SettingsManager::Permissions_ScriptsCanAccessClipboardOption, (m_ui->canAccessClipboardOverrideCheckBox->isChecked() ? m_ui->canAccessClipboardCheckBox->isChecked() : QVariant()), host);
288 SettingsManager::setOption(SettingsManager::Permissions_ScriptsCanReceiveRightClicksOption, (m_ui->canReceiveRightClicksOverrideCheckBox->isChecked() ? m_ui->canReceiveRightClicksCheckBox->isChecked() : QVariant()), host);
289 SettingsManager::setOption(SettingsManager::Permissions_ScriptsCanCloseWindowsOption, (m_ui->canCloseWindowsOverrideCheckBox->isChecked() ? m_ui->canCloseWindowsComboBox->currentData().toString() : QVariant()), host);
290 SettingsManager::setOption(SettingsManager::Permissions_EnableFullScreenOption, (m_ui->enableFullScreenOverrideCheckBox->isChecked() ? m_ui->enableFullScreenComboBox->currentData().toString() : QVariant()), host);
291 SettingsManager::setOption(SettingsManager::Network_EnableReferrerOption, (m_ui->sendReferrerOverrideCheckBox->isChecked() ? m_ui->sendReferrerCheckBox->isChecked() : QVariant()), host);
292 SettingsManager::setOption(SettingsManager::Network_UserAgentOption, (m_ui->userAgentOverrideCheckBox->isChecked() ? m_ui->userAgentComboBox->currentData(UserAgentsModel::IdentifierRole).toString() : QVariant()), host);
293 SettingsManager::setOption(SettingsManager::Network_ProxyOption, (m_ui->proxyOverrideCheckBox->isChecked() ? m_ui->proxyComboBox->currentData(ProxiesModel::IdentifierRole).toString() : QVariant()), host);
294
295 if (m_ui->contentBlockingProfilesOverrideCheckBox->isChecked())
296 {
297 for (int i = 0; i < m_ui->contentBlockingProfilesViewWidget->getRowCount(); ++i)
298 {
299 const QModelIndex categoryIndex(m_ui->contentBlockingProfilesViewWidget->getIndex(i));
300
301 for (int j = 0; j < m_ui->contentBlockingProfilesViewWidget->getRowCount(categoryIndex); ++j)
302 {
303 const QModelIndex entryIndex(m_ui->contentBlockingProfilesViewWidget->getIndex(j, 0, categoryIndex));
304
305 if (entryIndex.data(Qt::CheckStateRole).toBool())
306 {
307 contentBlockingProfiles.append(entryIndex.data(ContentFiltersManager::NameRole).toString());
308 }
309 }
310 }
311
312 if (m_ui->enableCustomRulesCheckBox->isChecked())
313 {
314 contentBlockingProfiles.append(QLatin1String("custom"));
315 }
316 }
317
318 SettingsManager::setOption(SettingsManager::ContentBlocking_ProfilesOption, (contentBlockingProfiles.isEmpty() ? QVariant() : contentBlockingProfiles), host);
319
320 accept();
321
322 break;
323 case QDialogButtonBox::ResetRole:
324 SettingsManager::removeOverride(host);
325 accept();
326
327 break;
328 case QDialogButtonBox::RejectRole:
329 reject();
330
331 break;
332 default:
333 break;
334 }
335 }
336
handleValueChanged()337 void WebsitePreferencesDialog::handleValueChanged()
338 {
339 QWidget *widget(qobject_cast<QWidget*>(sender()));
340
341 if (!widget || !m_updateOverride)
342 {
343 return;
344 }
345
346 if (widget == m_ui->contentBlockingProfilesViewWidget || widget == m_ui->enableCustomRulesCheckBox)
347 {
348 m_ui->contentBlockingProfilesOverrideCheckBox->setChecked(true);
349
350 return;
351 }
352
353 const QWidget *tab(qobject_cast<QWidget*>(widget->parent()));
354
355 if (!tab)
356 {
357 return;
358 }
359
360 const QGridLayout *layout(qobject_cast<QGridLayout*>(tab->layout()));
361
362 if (!layout)
363 {
364 return;
365 }
366
367 const int index(layout->indexOf(widget));
368
369 if (index < 0)
370 {
371 return;
372 }
373
374 int row(0);
375 int dummy(0);
376
377 layout->getItemPosition(index, &row, &dummy, &dummy, &dummy);
378
379 QLayoutItem *item(layout->itemAtPosition(row, 0));
380
381 if (item)
382 {
383 QCheckBox *overrideCheckBox(qobject_cast<QCheckBox*>(item->widget()));
384
385 if (overrideCheckBox)
386 {
387 overrideCheckBox->setChecked(true);
388 }
389 }
390 }
391
updateCookiesActions()392 void WebsitePreferencesDialog::updateCookiesActions()
393 {
394 const QModelIndex index(m_ui->cookiesViewWidget->getIndex(m_ui->cookiesViewWidget->getCurrentRow()));
395
396 m_ui->cookiesPropertiesButton->setEnabled(index.isValid());
397 m_ui->cookiesDeleteButton->setEnabled(index.isValid());
398 }
399
updateContentBlockingProfile(const QString & name)400 void WebsitePreferencesDialog::updateContentBlockingProfile(const QString &name)
401 {
402 const ContentFiltersProfile *profile(ContentFiltersManager::getProfile(name));
403
404 if (!profile)
405 {
406 return;
407 }
408
409 for (int i = 0; i < m_ui->contentBlockingProfilesViewWidget->getRowCount(); ++i)
410 {
411 const QModelIndex categoryIndex(m_ui->contentBlockingProfilesViewWidget->getIndex(i));
412
413 for (int j = 0; j < m_ui->contentBlockingProfilesViewWidget->getRowCount(categoryIndex); ++j)
414 {
415 const QModelIndex entryIndex(m_ui->contentBlockingProfilesViewWidget->getIndex(j, 0, categoryIndex));
416
417 if (entryIndex.data(ContentFiltersManager::NameRole).toString() == name)
418 {
419 m_ui->contentBlockingProfilesViewWidget->setData(entryIndex, profile->getTitle(), Qt::DisplayRole);
420 m_ui->contentBlockingProfilesViewWidget->setData(entryIndex.sibling(j, 2), Utils::formatDateTime(profile->getLastUpdate()), Qt::DisplayRole);
421
422 return;
423 }
424 }
425 }
426 }
427
updateValues(bool isChecked)428 void WebsitePreferencesDialog::updateValues(bool isChecked)
429 {
430 if (isChecked)
431 {
432 return;
433 }
434
435 const QString host(getHost());
436
437 m_updateOverride = false;
438
439 m_ui->encodingComboBox->setCurrentIndex(m_ui->encodingComboBox->findData(SettingsManager::getOption(SettingsManager::Content_DefaultCharacterEncodingOption, (m_ui->encodingOverrideCheckBox->isChecked() ? host : QString())).toString()));
440
441 const int popupsPolicyIndex(m_ui->popupsPolicyComboBox->findData(SettingsManager::getOption(SettingsManager::Permissions_ScriptsCanOpenWindowsOption, (m_ui->popupsPolicyOverrideCheckBox->isChecked() ? host : QString())).toString()));
442
443 m_ui->popupsPolicyComboBox->setCurrentIndex((popupsPolicyIndex < 0) ? 0 : popupsPolicyIndex);
444
445 const int enableImagesIndex(m_ui->enableImagesComboBox->findData(SettingsManager::getOption(SettingsManager::Permissions_EnableImagesOption, (m_ui->enableImagesOverrideCheckBox->isChecked() ? host : QString())).toString()));
446
447 m_ui->enableImagesComboBox->setCurrentIndex((enableImagesIndex < 0) ? 0 : enableImagesIndex);
448
449 const int enablePluginsIndex(m_ui->enablePluginsComboBox->findData(SettingsManager::getOption(SettingsManager::Permissions_EnablePluginsOption, (m_ui->enablePluginsOverrideCheckBox->isChecked() ? host : QString())).toString()));
450
451 m_ui->enablePluginsComboBox->setCurrentIndex((enablePluginsIndex < 0) ? 1 : enablePluginsIndex);
452 m_ui->userStyleSheetFilePathWidget->setPath(SettingsManager::getOption(SettingsManager::Content_UserStyleSheetOption, (m_ui->userStyleSheetOverrideCheckBox->isChecked() ? host : QString())).toString());
453 m_ui->userStyleSheetFilePathWidget->setFilters({tr("Style sheets (*.css)")});
454 m_ui->enableJavaScriptCheckBox->setChecked(SettingsManager::getOption(SettingsManager::Permissions_EnableJavaScriptOption, (m_ui->enableJavaScriptOverrideCheckBox->isChecked() ? host : QString())).toBool());
455 m_ui->canChangeWindowGeometryCheckBox->setChecked(SettingsManager::getOption(SettingsManager::Permissions_ScriptsCanChangeWindowGeometryOption, (m_ui->canChangeWindowGeometryOverrideCheckBox->isChecked() ? host : QString())).toBool());
456 m_ui->canShowStatusMessagesCheckBox->setChecked(SettingsManager::getOption(SettingsManager::Permissions_ScriptsCanShowStatusMessagesOption, (m_ui->canShowStatusMessagesOverrideCheckBox->isChecked() ? host : QString())).toBool());
457 m_ui->canAccessClipboardCheckBox->setChecked(SettingsManager::getOption(SettingsManager::Permissions_ScriptsCanAccessClipboardOption, (m_ui->canAccessClipboardOverrideCheckBox->isChecked() ? host : QString())).toBool());
458 m_ui->canReceiveRightClicksCheckBox->setChecked(SettingsManager::getOption(SettingsManager::Permissions_ScriptsCanReceiveRightClicksOption, (m_ui->canReceiveRightClicksOverrideCheckBox->isChecked() ? host : QString())).toBool());
459
460 const int canCloseWindowsIndex(m_ui->canCloseWindowsComboBox->findData(SettingsManager::getOption(SettingsManager::Permissions_ScriptsCanCloseWindowsOption, (m_ui->canCloseWindowsOverrideCheckBox->isChecked() ? host : QString())).toString()));
461
462 m_ui->canCloseWindowsComboBox->setCurrentIndex((canCloseWindowsIndex < 0) ? 0 : canCloseWindowsIndex);
463
464 const int enableFullScreenIndex(m_ui->enableFullScreenComboBox->findData(SettingsManager::getOption(SettingsManager::Permissions_EnableFullScreenOption, (m_ui->enableFullScreenOverrideCheckBox->isChecked() ? host : QString())).toString()));
465
466 m_ui->enableFullScreenComboBox->setCurrentIndex((enableFullScreenIndex < 0) ? 0 : enableFullScreenIndex);
467
468 const int doNotTrackPolicyIndex(m_ui->doNotTrackComboBox->findData(SettingsManager::getOption(SettingsManager::Network_DoNotTrackPolicyOption, (m_ui->doNotTrackOverrideCheckBox->isChecked() ? host : QString())).toString()));
469
470 m_ui->doNotTrackComboBox->setCurrentIndex((doNotTrackPolicyIndex < 0) ? 2 : doNotTrackPolicyIndex);
471 m_ui->rememberBrowsingHistoryCheckBox->setChecked(SettingsManager::getOption(SettingsManager::History_RememberBrowsingOption, (m_ui->rememberBrowsingHistoryOverrideCheckBox->isChecked() ? host : QString())).toBool());
472 m_ui->enableCookiesCheckBox->setChecked(SettingsManager::getOption(SettingsManager::Network_CookiesPolicyOption, (m_ui->enableCookiesOverrideCheckBox->isChecked() ? host : QString())).toString() != QLatin1String("ignore"));
473
474 const int cookiesPolicyIndex(m_ui->cookiesPolicyComboBox->findData(SettingsManager::getOption(SettingsManager::Network_CookiesPolicyOption, (m_ui->cookiesPolicyOverrideCheckBox->isChecked() ? host : QString())).toString()));
475
476 m_ui->cookiesPolicyComboBox->setCurrentIndex((cookiesPolicyIndex < 0) ? 0 : cookiesPolicyIndex);
477
478 const int cookiesKeepModeIndex(m_ui->keepCookiesModeComboBox->findData(SettingsManager::getOption(SettingsManager::Network_CookiesKeepModeOption, (m_ui->keepCookiesModeOverrideCheckBox->isChecked() ? host : QString())).toString()));
479
480 m_ui->keepCookiesModeComboBox->setCurrentIndex((cookiesKeepModeIndex < 0) ? 0 : cookiesKeepModeIndex);
481
482 const int thirdPartyCookiesPolicyIndex(m_ui->thirdPartyCookiesPolicyComboBox->findData(SettingsManager::getOption(SettingsManager::Network_ThirdPartyCookiesPolicyOption, (m_ui->thirdPartyCookiesPolicyOverrideCheckBox->isChecked() ? host : QString())).toString()));
483
484 m_ui->thirdPartyCookiesPolicyComboBox->setCurrentIndex((thirdPartyCookiesPolicyIndex < 0) ? 0 : thirdPartyCookiesPolicyIndex);
485 m_ui->sendReferrerCheckBox->setChecked(SettingsManager::getOption(SettingsManager::Network_EnableReferrerOption, (m_ui->sendReferrerOverrideCheckBox->isChecked() ? host : QString())).toBool());
486 m_ui->userAgentComboBox->setCurrentIndex(m_ui->userAgentComboBox->model()->match(m_ui->userAgentComboBox->model()->index(0, 0), UserAgentsModel::IdentifierRole, SettingsManager::getOption(SettingsManager::Network_UserAgentOption, (m_ui->userAgentOverrideCheckBox->isChecked() ? host : QString())).toString(), 1, Qt::MatchRecursive).value(0));
487 m_ui->proxyComboBox->setCurrentIndex(m_ui->proxyComboBox->model()->match(m_ui->proxyComboBox->model()->index(0, 0), ProxiesModel::IdentifierRole, SettingsManager::getOption(SettingsManager::Network_ProxyOption, (m_ui->proxyOverrideCheckBox->isChecked() ? host : QString())).toString(), 1, Qt::MatchRecursive).value(0));
488
489 const QStringList contentBlockingProfiles(SettingsManager::getOption(SettingsManager::ContentBlocking_ProfilesOption, host).toStringList());
490
491 m_ui->contentBlockingProfilesViewWidget->setModel(ContentFiltersManager::createModel(this, contentBlockingProfiles));
492 m_ui->contentBlockingProfilesViewWidget->setItemDelegateForColumn(0, new ContentBlockingTitleDelegate(this));
493 m_ui->contentBlockingProfilesViewWidget->setItemDelegateForColumn(1, new ContentBlockingIntervalDelegate(this));
494 m_ui->contentBlockingProfilesViewWidget->setViewMode(ItemViewWidget::TreeView);
495 m_ui->contentBlockingProfilesViewWidget->expandAll();
496
497 m_ui->enableCustomRulesCheckBox->setChecked(contentBlockingProfiles.contains("custom"));
498
499 m_updateOverride = true;
500 }
501
getCookiesToDelete() const502 QVector<QNetworkCookie> WebsitePreferencesDialog::getCookiesToDelete() const
503 {
504 return m_cookiesToDelete;
505 }
506
getCookiesToInsert() const507 QVector<QNetworkCookie> WebsitePreferencesDialog::getCookiesToInsert() const
508 {
509 return m_cookiesToInsert;
510 }
511
getHost() const512 QString WebsitePreferencesDialog::getHost() const
513 {
514 return m_ui->websiteLineEditWidget->text().simplified();
515 }
516
517 }
518