From cbc83e81ba5e234a01985c01524b92221e842da4 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Fri, 18 Dec 2015 11:25:45 +0100 Subject: [PATCH] Remove dependency on deprecated QtScript --- src/lib/bookmarks/bookmarks.cpp | 27 +- .../bookmarksimport/chromeimporter.cpp | 11 +- src/lib/lib.pro | 9 +- src/lib/network/networkproxyfactory.cpp | 11 +- src/lib/network/networkproxyfactory.h | 5 - src/lib/network/pac/pacdatetime.h | 186 ------------ src/lib/network/pac/pacmanager.cpp | 167 ----------- src/lib/network/pac/pacmanager.h | 57 ---- src/lib/network/pac/proxyautoconfig.cpp | 269 ------------------ src/lib/network/pac/proxyautoconfig.h | 79 ----- src/lib/opensearch/opensearchengine.cpp | 12 +- src/lib/tools/json.cpp | 163 ----------- src/lib/tools/json.h | 49 ---- src/main/main.pro | 2 +- 14 files changed, 27 insertions(+), 1020 deletions(-) delete mode 100644 src/lib/network/pac/pacdatetime.h delete mode 100644 src/lib/network/pac/pacmanager.cpp delete mode 100644 src/lib/network/pac/pacmanager.h delete mode 100644 src/lib/network/pac/proxyautoconfig.cpp delete mode 100644 src/lib/network/pac/proxyautoconfig.h delete mode 100644 src/lib/tools/json.cpp delete mode 100644 src/lib/tools/json.h diff --git a/src/lib/bookmarks/bookmarks.cpp b/src/lib/bookmarks/bookmarks.cpp index 5de42e9c2..c9a57e6a4 100644 --- a/src/lib/bookmarks/bookmarks.cpp +++ b/src/lib/bookmarks/bookmarks.cpp @@ -23,9 +23,9 @@ #include "datapaths.h" #include "settings.h" #include "qztools.h" -#include "json.h" #include +#include Bookmarks::Bookmarks(QObject* parent) : QObject(parent) @@ -231,15 +231,11 @@ void Bookmarks::loadBookmarks() const QString bookmarksFile = DataPaths::currentProfilePath() + QLatin1String("/bookmarks.json"); const QString backupFile = bookmarksFile + QLatin1String(".old"); - QFile file(bookmarksFile); - file.open(QFile::ReadOnly); - QByteArray data = file.readAll(); - file.close(); + QJsonParseError err; + QJsonDocument json = QJsonDocument::fromJson(QzTools::readAllFileByteContents(bookmarksFile), &err); + const QVariant res = json.toVariant(); - Json json; - const QVariant res = json.parse(QString::fromUtf8(data)); - - if (!json.ok() || res.type() != QVariant::Map) { + if (err.error != QJsonParseError::NoError || res.type() != QVariant::Map) { qWarning() << "Bookmarks::init() Error parsing bookmarks! Using default bookmarks!"; qWarning() << "Bookmarks::init() Your bookmarks have been backed up in" << backupFile; @@ -248,9 +244,10 @@ void Bookmarks::loadBookmarks() QFile::copy(bookmarksFile, backupFile); // Load default bookmarks - const QVariant data = json.parse(QzTools::readAllFileContents(":data/bookmarks.json")); + json = QJsonDocument::fromJson(QzTools::readAllFileByteContents(QSL(":data/bookmarks.json")), &err); + const QVariant data = json.toVariant(); - Q_ASSERT(json.ok()); + Q_ASSERT(err.error == QJsonParseError::NoError); Q_ASSERT(data.type() == QVariant::Map); loadBookmarksFromMap(data.toMap().value("roots").toMap()); @@ -286,10 +283,10 @@ void Bookmarks::saveBookmarks() map.insert("version", Qz::bookmarksVersion); map.insert("roots", bookmarksMap); - Json json; - const QString data = json.serialize(map); + const QJsonDocument json = QJsonDocument::fromVariant(map); + const QByteArray data = json.toJson(); - if (!json.ok() || data.isEmpty()) { + if (data.isEmpty()) { qWarning() << "Bookmarks::saveBookmarks() Error serializing bookmarks!"; return; } @@ -300,7 +297,7 @@ void Bookmarks::saveBookmarks() qWarning() << "Bookmarks::saveBookmarks() Error opening bookmarks file for writing!"; } - file.write(data.toUtf8()); + file.write(data); file.close(); } diff --git a/src/lib/bookmarks/bookmarksimport/chromeimporter.cpp b/src/lib/bookmarks/bookmarksimport/chromeimporter.cpp index e9cf8437d..2168ee535 100644 --- a/src/lib/bookmarks/bookmarksimport/chromeimporter.cpp +++ b/src/lib/bookmarks/bookmarksimport/chromeimporter.cpp @@ -17,11 +17,11 @@ * ============================================================ */ #include "chromeimporter.h" #include "bookmarkitem.h" -#include "json.h" #include #include #include +#include ChromeImporter::ChromeImporter(QObject* parent) : BookmarksImporter(parent) @@ -63,13 +63,14 @@ bool ChromeImporter::prepareImport() BookmarkItem* ChromeImporter::importBookmarks() { - QString bookmarks = QString::fromUtf8(m_file.readAll()); + const QByteArray data = m_file.readAll(); m_file.close(); - Json json; - const QVariant res = json.parse(bookmarks); + QJsonParseError err; + QJsonDocument json = QJsonDocument::fromJson(data); + const QVariant res = json.toVariant(); - if (!json.ok() || res.type() != QVariant::Map) { + if (err.error != QJsonParseError::NoError || res.type() != QVariant::Map) { setError(BookmarksImporter::tr("Cannot parse JSON file!")); return 0; } diff --git a/src/lib/lib.pro b/src/lib/lib.pro index e29f2aa43..50e1b8347 100644 --- a/src/lib/lib.pro +++ b/src/lib/lib.pro @@ -1,4 +1,4 @@ -QT += webenginecore webenginewidgets webchannel network widgets sql script quickwidgets +QT += webenginecore webenginewidgets webchannel network widgets sql quickwidgets TARGET = QupZilla TEMPLATE = lib @@ -128,8 +128,6 @@ SOURCES += \ network/networkmanager.cpp \ network/networkproxyfactory.cpp \ network/networkurlinterceptor.cpp \ - network/pac/pacmanager.cpp \ - network/pac/proxyautoconfig.cpp \ #network/schemehandlers/fileschemehandler.cpp \ network/schemehandlers/qupzillaschemehandler.cpp \ network/sslerrordialog.cpp \ @@ -200,7 +198,6 @@ SOURCES += \ tools/html5permissions/html5permissionsnotification.cpp \ tools/iconfetcher.cpp \ tools/iconprovider.cpp \ - tools/json.cpp \ tools/listitemdelegate.cpp \ tools/mactoolbutton.cpp \ tools/menubar.cpp \ @@ -313,9 +310,6 @@ HEADERS += \ network/networkmanager.h \ network/networkproxyfactory.h \ network/networkurlinterceptor.h \ - network/pac/pacdatetime.h \ - network/pac/pacmanager.h \ - network/pac/proxyautoconfig.h \ #network/schemehandlers/fileschemehandler.h \ network/schemehandlers/qupzillaschemehandler.h \ network/urlinterceptor.h \ @@ -389,7 +383,6 @@ HEADERS += \ tools/html5permissions/html5permissionsnotification.h \ tools/iconfetcher.h \ tools/iconprovider.h \ - tools/json.h \ tools/listitemdelegate.h \ tools/mactoolbutton.h \ tools/menubar.h \ diff --git a/src/lib/network/networkproxyfactory.cpp b/src/lib/network/networkproxyfactory.cpp index 5d7cde34e..f491daed9 100644 --- a/src/lib/network/networkproxyfactory.cpp +++ b/src/lib/network/networkproxyfactory.cpp @@ -18,7 +18,6 @@ #include "networkproxyfactory.h" #include "mainapplication.h" #include "settings.h" -#include "pac/pacmanager.h" WildcardMatcher::WildcardMatcher(const QString &pattern) : m_regExp(0) @@ -62,7 +61,6 @@ bool WildcardMatcher::match(const QString &str) const NetworkProxyFactory::NetworkProxyFactory() : QNetworkProxyFactory() - , m_pacManager(new PacManager) , m_proxyPreference(SystemProxy) , m_proxyType(QNetworkProxy::HttpProxy) , m_port(0) @@ -98,13 +96,6 @@ void NetworkProxyFactory::loadSettings() foreach (const QString &exception, exceptions) { m_proxyExceptions.append(new WildcardMatcher(exception.trimmed())); } - - m_pacManager->loadSettings(); -} - -PacManager* NetworkProxyFactory::pacManager() const -{ - return m_pacManager; } NetworkProxyFactory::ProxyPreference NetworkProxyFactory::proxyPreference() const @@ -135,7 +126,7 @@ QList NetworkProxyFactory::queryProxy(const QNetworkProxyQuery &q break; case ProxyAutoConfig: - proxyList.append(m_pacManager->queryProxy(query.url())); + qWarning() << "PAC Not Implemented!"; break; case DefinedProxy: { diff --git a/src/lib/network/networkproxyfactory.h b/src/lib/network/networkproxyfactory.h index 82c76e8bf..8e529659f 100644 --- a/src/lib/network/networkproxyfactory.h +++ b/src/lib/network/networkproxyfactory.h @@ -24,8 +24,6 @@ #include "qzcommon.h" #include "qzregexp.h" -class PacManager; - class WildcardMatcher { public: @@ -52,14 +50,11 @@ public: void loadSettings(); - PacManager* pacManager() const; ProxyPreference proxyPreference() const; QList queryProxy(const QNetworkProxyQuery &query = QNetworkProxyQuery()); private: - PacManager* m_pacManager; - ProxyPreference m_proxyPreference; QNetworkProxy::ProxyType m_proxyType; diff --git a/src/lib/network/pac/pacdatetime.h b/src/lib/network/pac/pacdatetime.h deleted file mode 100644 index dd2b8ed58..000000000 --- a/src/lib/network/pac/pacdatetime.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * The following subset of Javascript code was taken from Mozilla (http://www.mozilla.org) - */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: NPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Netscape Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Akhil Arora - * Tomi Leppikangas - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the NPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the NPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#define PAC_DATETIME_JAVASCRIPT \ - "var wdays = {SUN: 0, MON: 1, TUE: 2, WED: 3, THU: 4, FRI: 5, SAT: 6};\n" \ - "var months = {JAN: 0, FEB: 1, MAR: 2, APR: 3, MAY: 4, JUN: 5, JUL: 6, AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11};\n"\ - "function weekdayRange() {\n" \ - " function getDay(weekday) {\n" \ - " if (weekday in wdays) {\n" \ - " return wdays[weekday];\n" \ - " }\n" \ - " return -1;\n" \ - " }\n" \ - " var date = new Date();\n" \ - " var argc = arguments.length;\n" \ - " var wday;\n" \ - " if (argc < 1)\n" \ - " return false;\n" \ - " if (arguments[argc - 1] == 'GMT') {\n" \ - " argc--;\n" \ - " wday = date.getUTCDay();\n" \ - " } else {\n" \ - " wday = date.getDay();\n" \ - " }\n" \ - " var wd1 = getDay(arguments[0]);\n" \ - " var wd2 = (argc == 2) ? getDay(arguments[1]) : wd1;\n" \ - " return (wd1 == -1 || wd2 == -1) ? false\n" \ - " : (wd1 <= wday && wday <= wd2);\n" \ - "}\n" \ - "function dateRange() {\n" \ - " function getMonth(name) {\n" \ - " if (name in months) {\n" \ - " return months[name];\n" \ - " }\n" \ - " return -1;\n" \ - " }\n" \ - " var date = new Date();\n" \ - " var argc = arguments.length;\n" \ - " if (argc < 1) {\n" \ - " return false;\n" \ - " }\n" \ - " var isGMT = (arguments[argc - 1] == 'GMT');\n" \ - " if (isGMT) {\n" \ - " argc--;\n" \ - " }\n" \ - " if (argc == 1) {\n" \ - " var tmp = parseInt(arguments[0]);\n" \ - " if (isNaN(tmp)) {\n" \ - " return ((isGMT ? date.getUTCMonth() : date.getMonth()) == getMonth(arguments[0]));\n" \ - " } else if (tmp < 32) {\n" \ - " return ((isGMT ? date.getUTCDate() : date.getDate()) == tmp);\n" \ - " } else {\n" \ - " return ((isGMT ? date.getUTCFullYear() : date.getFullYear()) == tmp);\n" \ - " }\n" \ - " }\n" \ - " var year = date.getFullYear();\n" \ - " var date1, date2;\n" \ - " date1 = new Date(year, 0, 1, 0, 0, 0);\n" \ - " date2 = new Date(year, 11, 31, 23, 59, 59);\n" \ - " var adjustMonth = false;\n" \ - " for (var i = 0; i < (argc >> 1); i++) {\n" \ - " var tmp = parseInt(arguments[i]);\n" \ - " if (isNaN(tmp)) {\n" \ - " var mon = getMonth(arguments[i]);\n" \ - " date1.setMonth(mon);\n" \ - " } else if (tmp < 32) {\n" \ - " adjustMonth = (argc <= 2);\n" \ - " date1.setDate(tmp);\n" \ - " } else {\n" \ - " date1.setFullYear(tmp);\n" \ - " }\n" \ - " }\n" \ - " for (var i = (argc >> 1); i < argc; i++) {\n" \ - " var tmp = parseInt(arguments[i]);\n" \ - " if (isNaN(tmp)) {\n" \ - " var mon = getMonth(arguments[i]);\n" \ - " date2.setMonth(mon);\n" \ - " } else if (tmp < 32) {\n" \ - " date2.setDate(tmp);\n" \ - " } else {\n" \ - " date2.setFullYear(tmp);\n" \ - " }\n" \ - " }\n" \ - " if (adjustMonth) {\n" \ - " date1.setMonth(date.getMonth());\n" \ - " date2.setMonth(date.getMonth());\n" \ - " }\n" \ - " if (isGMT) {\n" \ - " var tmp = date;\n" \ - " tmp.setFullYear(date.getUTCFullYear());\n" \ - " tmp.setMonth(date.getUTCMonth());\n" \ - " tmp.setDate(date.getUTCDate());\n" \ - " tmp.setHours(date.getUTCHours());\n" \ - " tmp.setMinutes(date.getUTCMinutes());\n" \ - " tmp.setSeconds(date.getUTCSeconds());\n" \ - " date = tmp;\n" \ - " }\n" \ - " return ((date1 <= date) && (date <= date2));\n" \ - "}\n" \ - "function timeRange() {\n" \ - " var argc = arguments.length;\n" \ - " var date = new Date();\n" \ - " var isGMT= false;\n" \ - " if (argc < 1) {\n" \ - " return false;\n" \ - " }\n" \ - " if (arguments[argc - 1] == 'GMT') {\n" \ - " isGMT = true;\n" \ - " argc--;\n" \ - " }\n" \ - " var hour = isGMT ? date.getUTCHours() : date.getHours();\n" \ - " var date1, date2;\n" \ - " date1 = new Date();\n" \ - " date2 = new Date();\n" \ - " if (argc == 1) {\n" \ - " return (hour == arguments[0]);\n" \ - " } else if (argc == 2) {\n" \ - " return ((arguments[0] <= hour) && (hour <= arguments[1]));\n" \ - " } else {\n" \ - " switch (argc) {\n" \ - " case 6:\n" \ - " date1.setSeconds(arguments[2]);\n" \ - " date2.setSeconds(arguments[5]);\n" \ - " case 4:\n" \ - " var middle = argc >> 1;\n" \ - " date1.setHours(arguments[0]);\n" \ - " date1.setMinutes(arguments[1]);\n" \ - " date2.setHours(arguments[middle]);\n" \ - " date2.setMinutes(arguments[middle + 1]);\n" \ - " if (middle == 2) {\n" \ - " date2.setSeconds(59);\n" \ - " }\n" \ - " break;\n" \ - " default:\n" \ - " throw 'timeRange: bad number of arguments'\n" \ - " }\n" \ - " }\n" \ - " if (isGMT) {\n" \ - " date.setFullYear(date.getUTCFullYear());\n" \ - " date.setMonth(date.getUTCMonth());\n" \ - " date.setDate(date.getUTCDate());\n" \ - " date.setHours(date.getUTCHours());\n" \ - " date.setMinutes(date.getUTCMinutes());\n" \ - " date.setSeconds(date.getUTCSeconds());\n" \ - " }\n" \ - " return ((date1 <= date) && (date <= date2));\n" \ - "}\n" \ - "" diff --git a/src/lib/network/pac/pacmanager.cpp b/src/lib/network/pac/pacmanager.cpp deleted file mode 100644 index fbfa5cf54..000000000 --- a/src/lib/network/pac/pacmanager.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* ============================================================ -* QupZilla - WebKit based browser -* Copyright (C) 2013-2014 David Rosca -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#include "pacmanager.h" -#include "proxyautoconfig.h" -#include "mainapplication.h" -#include "networkmanager.h" -#include "followredirectreply.h" -#include "settings.h" -#include "datapaths.h" -#include "qztools.h" - -#include -#include -#include -#include - -PacManager::PacManager(QObject* parent) - : QObject(parent) - , m_pacrunner(0) - , m_reply(0) - , m_loaded(false) -{ -} - -void PacManager::loadSettings() -{ - QUrl oldUrl = m_url; - - Settings settings; - settings.beginGroup("Web-Proxy"); - m_url = settings.value("PacUrl", QUrl()).toUrl(); - settings.endGroup(); - - if (m_loaded && oldUrl != m_url) { - downloadPacFile(); - } - - m_loaded = true; -} - -void PacManager::downloadPacFile() -{ - if (m_reply) { - qWarning() << "PacManager: PAC file is already being downloaded!"; - return; - } - - if (m_url.scheme() == QLatin1String("file")) { - if (!QFile(m_url.path()).exists()) { - qWarning() << "PacManager: PAC file " << m_url.path() << "doesn't exists!"; - } - else { - reloadScript(); - } - return; - } - - m_reply = new FollowRedirectReply(m_url, mApp->networkManager()); - connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished())); -} - -QList PacManager::queryProxy(const QUrl &url) -{ - if (!m_pacrunner) { - reloadScript(); - } - - QString proxyString = m_pacrunner->findProxyForUrl(url.toEncoded(), url.host()); - return parseProxies(proxyString.trimmed()); -} - -void PacManager::replyFinished() -{ - if (m_reply->error() != QNetworkReply::NoError) { - qWarning() << "PacManager: Cannot download PAC file from" << m_url; - m_reply->deleteLater(); - m_reply = 0; - return; - } - - QByteArray data = m_reply->readAll(); - m_reply->deleteLater(); - m_reply = 0; - - QFile file(DataPaths::currentProfilePath() + "/proxy.pac"); - - if (!file.open(QFile::WriteOnly)) { - qWarning() << "PacManager: Cannot open PAC file for writing" << file.fileName(); - return; - } - - file.write(data); - file.close(); - - reloadScript(); -} - -void PacManager::reloadScript() -{ - if (!m_pacrunner) { - m_pacrunner = new ProxyAutoConfig(this); - } - - QFile file(m_url.scheme() == QLatin1String("file") ? m_url.path() : DataPaths::currentProfilePath() + "/proxy.pac"); - - if (!file.open(QFile::ReadOnly)) { - qWarning() << "PacManager: Cannot open PAC file for reading" << file.fileName(); - return; - } - - m_pacrunner->setConfig(file.readAll()); -} - -QList PacManager::parseProxies(const QString &string) -{ - QString str = string.trimmed(); - QList proxies; - - if (str.isEmpty()) { - return proxies; - } - - QStringList parts = str.split(QLatin1Char(';'), QString::SkipEmptyParts); - if (parts.isEmpty()) { - parts.append(str); - } - - foreach (const QString &s, parts) { - QStringList l = s.split(QLatin1Char(' '), QString::SkipEmptyParts); - - if (l.count() != 2) { - if (l.count() == 1 && l.at(0) == QLatin1String("DIRECT")) { - proxies.append(QNetworkProxy::NoProxy); - } - continue; - } - - QString type = l.at(0); - QUrl url = QUrl::fromEncoded("proxy://" + l.at(1).toUtf8()); - - if (type == QLatin1String("PROXY")) { - QNetworkProxy proxy(QNetworkProxy::HttpProxy, url.host(), url.port(8080)); - proxies.append(proxy); - } - else if (type == QLatin1String("SOCKS")) { - QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, url.host(), url.port(1080)); - proxies.append(proxy); - } - } - - return proxies; -} diff --git a/src/lib/network/pac/pacmanager.h b/src/lib/network/pac/pacmanager.h deleted file mode 100644 index 918fb24de..000000000 --- a/src/lib/network/pac/pacmanager.h +++ /dev/null @@ -1,57 +0,0 @@ -/* ============================================================ -* QupZilla - WebKit based browser -* Copyright (C) 2013-2014 David Rosca -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#ifndef PACMANAGER_H -#define PACMANAGER_H - -#include -#include -#include - -#include "qzcommon.h" - -class QNetworkProxy; - -class FollowRedirectReply; -class ProxyAutoConfig; - -class QUPZILLA_EXPORT PacManager : public QObject -{ - Q_OBJECT -public: - explicit PacManager(QObject* parent = 0); - - void loadSettings(); - void downloadPacFile(); - - QList queryProxy(const QUrl &url); - -private slots: - void replyFinished(); - -private: - void reloadScript(); - QList parseProxies(const QString &string); - - ProxyAutoConfig* m_pacrunner; - FollowRedirectReply* m_reply; - - bool m_loaded; - QUrl m_url; -}; - -#endif // PACMANAGER_H diff --git a/src/lib/network/pac/proxyautoconfig.cpp b/src/lib/network/pac/proxyautoconfig.cpp deleted file mode 100644 index b4410019e..000000000 --- a/src/lib/network/pac/proxyautoconfig.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* ============================================================ -* QupZilla - WebKit based browser -* Copyright (C) 2013-2014 David Rosca -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#include "proxyautoconfig.h" -#include "pacdatetime.h" -#include "qztools.h" -#include "qzregexp.h" - -#include -#include -#include -#include -#include - -/** - * Class implementing the proxy auto-configuration (PAC) JavaScript api. - * - * Based on qt-examples: https://gitorious.org/qt-examples/qt-examples/blobs/master/pac-files - */ -ProxyAutoConfig::ProxyAutoConfig(QObject* parent) - : QObject(parent) - , m_engine(new QScriptEngine(this)) -{ - install(); -} - -void ProxyAutoConfig::setConfig(const QString &config) -{ - m_engine->evaluate(config); -} - -// string findProxyForUrl url host -QString ProxyAutoConfig::findProxyForUrl(const QString &url, const QString &host) -{ - QScriptValue global = m_engine->globalObject(); - QScriptValue fun = global.property("FindProxyForURL"); - if (!fun.isFunction()) { - return QString("DIRECT"); - } - - QScriptValueList args; - args << m_engine->toScriptValue(url) << m_engine->toScriptValue(host); - - QScriptValue val = fun.call(global, args); - - if (val.isError()) { - qWarning() << "PAC Error:" << val.toString(); - return QString("DIRECT"); - } - - return val.toString(); -} - -QScriptValue ProxyAutoConfig::evaluate(const QString &source) -{ - return m_engine->evaluate(source); -} - -void ProxyAutoConfig::install() -{ - QScriptValue globalObject = m_engine->globalObject(); - - QScriptValue fun; - - fun = m_engine->newFunction(debug); - globalObject.setProperty("debug", fun); - - fun = m_engine->newFunction(isPlainHostName); - globalObject.setProperty("isPlainHostName", fun); - - fun = m_engine->newFunction(dnsDomainIs); - globalObject.setProperty("dnsDomainIs", fun); - - fun = m_engine->newFunction(localHostOrDomainIs); - globalObject.setProperty("localHostOrDomainIs", fun); - - fun = m_engine->newFunction(isResolvable); - globalObject.setProperty("isResolvable", fun); - - fun = m_engine->newFunction(isInNet); - globalObject.setProperty("isInNet", fun); - - fun = m_engine->newFunction(dnsResolve); - globalObject.setProperty("dnsResolve", fun); - - fun = m_engine->newFunction(myIpAddress); - globalObject.setProperty("myIpAddress", fun); - - fun = m_engine->newFunction(dnsDomainLevels); - globalObject.setProperty("dnsDomainLevels", fun); - - fun = m_engine->newFunction(shExpMatch); - globalObject.setProperty("shExpMatch", fun); - - m_engine->evaluate(PAC_DATETIME_JAVASCRIPT); -} - -QScriptValue ProxyAutoConfig::debug(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 1) { - return context->throwError("Debug takes one argument"); - } - qDebug() << context->argument(0).toString(); - return engine->undefinedValue(); -} - -// bool isPlainHostName host -QScriptValue ProxyAutoConfig::isPlainHostName(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 1) { - return context->throwError("isPlainHostName takes one argument"); - } - - bool ret = !context->argument(0).toString().contains(QLatin1Char('.')); - return QScriptValue(engine, ret); -} - -// bool dnsDomainIs host domain -QScriptValue ProxyAutoConfig::dnsDomainIs(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 2) { - return context->throwError("dnsDomainIs takes two arguments"); - } - - QString host = context->argument(0).toString(); - QString domain = context->argument(1).toString(); - - if (host.startsWith(QLatin1Char('.'))) { - host = host.mid(1); - } - - if (domain.startsWith(QLatin1Char('.'))) { - domain = domain.mid(1); - } - - return QScriptValue(engine, QzTools::matchDomain(domain, host)); -} - -// bool localHostOrDomainIs host hostdom -QScriptValue ProxyAutoConfig::localHostOrDomainIs(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 2) { - return context->throwError("localHostOrDomainIs takes two arguments"); - } - - QString host = context->argument(0).toString(); - QString hostdom = context->argument(1).toString(); - bool ret = !host.contains(QLatin1Char('.')) ? hostdom.startsWith(host) : host == hostdom; - - return QScriptValue(engine, ret); -} - -static QList hostResolve(const QString &host) -{ - QHostInfo info = QHostInfo::fromName(host); - return info.addresses(); -} - -// bool isResolvable host -QScriptValue ProxyAutoConfig::isResolvable(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 1) { - return context->throwError("isResolvable takes one arguments"); - } - - QString host = context->argument(0).toString(); - return QScriptValue(engine, !hostResolve(host).isEmpty()); -} - -// bool isInNet host pattern mask -QScriptValue ProxyAutoConfig::isInNet(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 3) { - return context->throwError("isInNet takes three arguments"); - } - - QHostAddress host(context->argument(0).toString()); - QHostAddress pattern(context->argument(1).toString()); - QHostAddress mask(context->argument(2).toString()); - - if (host.isNull()) { - QList addresses = hostResolve(context->argument(0).toString()); - host = addresses.isEmpty() ? QHostAddress() : addresses.at(0); - } - - if ((pattern.toIPv4Address() & mask.toIPv4Address()) == (host.toIPv4Address() & mask.toIPv4Address())) { - return QScriptValue(engine, true); - } - - return QScriptValue(engine, false); -} - -// string dnsResolve hostname -QScriptValue ProxyAutoConfig::dnsResolve(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 1) { - return context->throwError("dnsResolve takes one arguments"); - } - - QString host = context->argument(0).toString(); - QList addresses = hostResolve(host); - if (addresses.isEmpty()) { - return engine->nullValue(); - } - - return QScriptValue(engine, addresses.at(0).toString()); -} - -// string myIpAddress -QScriptValue ProxyAutoConfig::myIpAddress(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 0) { - return context->throwError("myIpAddress takes no arguments"); - } - - foreach (QHostAddress address, QNetworkInterface::allAddresses()) { - if (address != QHostAddress::LocalHost && address != QHostAddress::LocalHostIPv6) - return QScriptValue(engine, address.toString()); - } - - return engine->undefinedValue(); -} - -// int dnsDomainLevels host -QScriptValue ProxyAutoConfig::dnsDomainLevels(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 1) { - return context->throwError("dnsDomainLevels takes one argument"); - } - - QString host = context->argument(0).toString(); - - return QScriptValue(engine, host.count(QLatin1Char('.'))); -} - -// bool shExpMatch str shexp -QScriptValue ProxyAutoConfig::shExpMatch(QScriptContext* context, QScriptEngine* engine) -{ - if (context->argumentCount() != 2) { - return context->throwError("shExpMatch takes two arguments"); - } - - QString str = context->argument(0).toString(); - QString shexp = context->argument(1).toString(); - - shexp.replace(QLatin1Char('.'), QLatin1String("\\.")) - .replace(QLatin1Char('*'), QLatin1String(".*")) - .replace(QLatin1Char('?'), QLatin1Char('.')); - shexp = QString("^%1$").arg(shexp); - - QzRegExp re(shexp); - bool ret = re.indexIn(str) != -1; - - return QScriptValue(engine, ret); -} diff --git a/src/lib/network/pac/proxyautoconfig.h b/src/lib/network/pac/proxyautoconfig.h deleted file mode 100644 index 85e6532f4..000000000 --- a/src/lib/network/pac/proxyautoconfig.h +++ /dev/null @@ -1,79 +0,0 @@ -/* ============================================================ -* QupZilla - WebKit based browser -* Copyright (C) 2013-2014 David Rosca -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#ifndef PROXYAUTOCONFIG_H -#define PROXYAUTOCONFIG_H - -#include -#include - -#include "qzcommon.h" - -class QScriptContext; -class QScriptEngine; - -/** - * Class implementing the proxy auto-configuration (PAC) JavaScript api. - * - * Based on qt-examples: https://gitorious.org/qt-examples/qt-examples/blobs/master/pac-files - */ -class QUPZILLA_EXPORT ProxyAutoConfig : public QObject -{ - Q_OBJECT - -public: - explicit ProxyAutoConfig(QObject* parent = 0); - - // Call this to set the script to be executed. Note that the argument should be - // the content of the .pac file to be used, not the URL where it is located. - void setConfig(const QString &config); - - // Returns the result - QString findProxyForUrl(const QString &url, const QString &host); - -protected: - QScriptValue evaluate(const QString &source); - -private: - void install(); - - // Debug - static QScriptValue debug(QScriptContext* context, QScriptEngine* engine); - - // Hostname based conditions - static QScriptValue isPlainHostName(QScriptContext* context, QScriptEngine* engine); - static QScriptValue dnsDomainIs(QScriptContext* context, QScriptEngine* engine); - static QScriptValue localHostOrDomainIs(QScriptContext* context, QScriptEngine* engine); - static QScriptValue isResolvable(QScriptContext* context, QScriptEngine* engine); - static QScriptValue isInNet(QScriptContext* context, QScriptEngine* engine); - - // Related utility functions - static QScriptValue dnsResolve(QScriptContext* context, QScriptEngine* engine); - static QScriptValue myIpAddress(QScriptContext* context, QScriptEngine* engine); - static QScriptValue dnsDomainLevels(QScriptContext* context, QScriptEngine* engine); - - // URL/hostname based conditions - static QScriptValue shExpMatch(QScriptContext* context, QScriptEngine* engine); - - // Time based conditions - // Implemented in JavaScript - -private: - QScriptEngine* m_engine; -}; - -#endif // PROXYAUTOCONFIG_H diff --git a/src/lib/opensearch/opensearchengine.cpp b/src/lib/opensearch/opensearchengine.cpp index c73d840b3..68bf0d20e 100644 --- a/src/lib/opensearch/opensearchengine.cpp +++ b/src/lib/opensearch/opensearchengine.cpp @@ -37,7 +37,6 @@ #include "opensearchengine.h" #include "qzregexp.h" #include "opensearchenginedelegate.h" -#include "json.h" #include #include @@ -48,6 +47,7 @@ #include #include +#include /*! @@ -617,17 +617,17 @@ void OpenSearchEngine::requestSearchResults(const QString &searchTerm) void OpenSearchEngine::suggestionsObtained() { - QString response(QString::fromUtf8(m_suggestionsReply->readAll())); - response = response.trimmed(); + const QByteArray response = m_suggestionsReply->readAll(); m_suggestionsReply->close(); m_suggestionsReply->deleteLater(); m_suggestionsReply = 0; - Json json; - const QVariant res = json.parse(response); + QJsonParseError err; + QJsonDocument json = QJsonDocument::fromJson(response); + const QVariant res = json.toVariant(); - if (!json.ok() || res.type() != QVariant::Map) + if (err.error != QJsonParseError::NoError || res.type() != QVariant::Map) return; const QVariantList list = res.toMap().value(QSL("1")).toList(); diff --git a/src/lib/tools/json.cpp b/src/lib/tools/json.cpp deleted file mode 100644 index c3f1e68aa..000000000 --- a/src/lib/tools/json.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* =========================================================== -* QupZilla - WebKit based browser -* Copyright (C) 2014 David Rosca -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#include "json.h" - -#include -#include - -// Class based on http://stackoverflow.com/a/15805783 - -Json::Json() - : m_engine(0) - , m_ok(true) -{ -} - -Json::~Json() -{ - delete m_engine; -} - -QVariant Json::parse(const QString &data) -{ - delete m_engine; - m_engine = new QScriptEngine(); - - QString jsonData = QString("(%1)").arg(data); - QScriptValue obj = m_engine->evaluate(jsonData); - m_ok = !obj.isError() && obj.isObject(); - - return decodeInner(obj); -} - -QString Json::serialize(const QVariant &variant) -{ - delete m_engine; - m_engine = new QScriptEngine(); - - m_engine->evaluate("function toString() { return JSON.stringify(this, null, ' ') }"); - - QScriptValue toString = m_engine->globalObject().property("toString"); - QScriptValue obj = encodeInner(variant.toMap()); - QScriptValue result = toString.call(obj); - - m_ok = !obj.isError() && obj.isObject(); - return result.toString(); -} - -bool Json::ok() const -{ - return m_ok; -} - -QMap Json::decodeInner(QScriptValue object) -{ - QMap map; - QScriptValueIterator it(object); - - while (it.hasNext()) { - it.next(); - - if (it.value().isArray()) { - map.insert(it.name(), QVariant(decodeInnerToList(it.value()))); - } - else if (it.value().isNumber()) { - map.insert(it.name(), QVariant(it.value().toNumber())); - } - else if (it.value().isString()) { - map.insert(it.name(), QVariant(it.value().toString())); - } - else if (it.value().isBool()) { - map.insert(it.name(), QVariant(it.value().toBool())); - } - else if (it.value().isNull()) { - map.insert(it.name(), QVariant()); - } - else if (it.value().isObject()) { - map.insert(it.name(), QVariant(decodeInner(it.value()))); - } - } - - return map; -} - -QList Json::decodeInnerToList(QScriptValue arrayValue) -{ - QList list; - QScriptValueIterator it(arrayValue); - - while (it.hasNext()) { - it.next(); - - if (it.name() == QLatin1String("length")) { - continue; - } - - if (it.value().isArray()) { - list.append(QVariant(decodeInnerToList(it.value()))); - } - else if (it.value().isNumber()) { - list.append(QVariant(it.value().toNumber())); - } - else if (it.value().isString()) { - list.append(QVariant(it.value().toString())); - } - else if (it.value().isBool()) { - list.append(QVariant(it.value().toBool())); - } - else if (it.value().isNull()) { - list.append(QVariant()); - } - else if (it.value().isObject()) { - list.append(QVariant(decodeInner(it.value()))); - } - } - - return list; -} - -QScriptValue Json::encodeInner(const QMap &map) -{ - QScriptValue obj = m_engine->newObject(); - QMapIterator i(map); - - while (i.hasNext()) { - i.next(); - - if (i.value().type() == QVariant::String) { - obj.setProperty(i.key(), i.value().toString()); - } - else if (i.value().type() == QVariant::Int) { - obj.setProperty(i.key(), i.value().toInt()); - } - else if (i.value().type() == QVariant::Bool) { - obj.setProperty(i.key(), i.value().toBool()); - } - else if (i.value().type() == QVariant::Double) { - obj.setProperty(i.key(), i.value().toDouble()); - } - else if (i.value().type() == QVariant::List) { - obj.setProperty(i.key(), qScriptValueFromSequence(m_engine, i.value().toList())); - } - else if (i.value().type() == QVariant::Map) { - obj.setProperty(i.key(), encodeInner(i.value().toMap())); - } - } - - return obj; -} diff --git a/src/lib/tools/json.h b/src/lib/tools/json.h deleted file mode 100644 index 1ba44bf85..000000000 --- a/src/lib/tools/json.h +++ /dev/null @@ -1,49 +0,0 @@ -/* ============================================================ -* QupZilla - WebKit based browser -* Copyright (C) 2014 David Rosca -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#ifndef JSON_H -#define JSON_H - -#include -#include - -#include "qzcommon.h" - -class QScriptValue; -class QScriptEngine; - -class QUPZILLA_EXPORT Json -{ -public: - explicit Json(); - ~Json(); - - QVariant parse(const QString &data); - QString serialize(const QVariant &variant); - - bool ok() const; - -private: - QMap decodeInner(QScriptValue object); - QList decodeInnerToList(QScriptValue arrayValue); - QScriptValue encodeInner(const QMap &map); - - QScriptEngine* m_engine; - bool m_ok; -}; - -#endif // JSON_H diff --git a/src/main/main.pro b/src/main/main.pro index da64775db..49620ff35 100644 --- a/src/main/main.pro +++ b/src/main/main.pro @@ -1,6 +1,6 @@ include(../defines.pri) -QT += webenginecore webenginewidgets network widgets sql script +QT += webenginecore webenginewidgets network widgets sql TARGET = qupzilla mac: TARGET = QupZilla