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