diff options
Diffstat (limited to 'src/slxbrowser.cpp')
-rw-r--r-- | src/slxbrowser.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/slxbrowser.cpp b/src/slxbrowser.cpp new file mode 100644 index 0000000..aec5201 --- /dev/null +++ b/src/slxbrowser.cpp @@ -0,0 +1,115 @@ +#include "slxbrowser.h" +#include "webview.h" +#include <QtWebKitWidgets> +#include <QWebPage> +#include <QNetworkReply> +#include <QSslConfiguration> +#include <QProgressBar> + +SLXbrowser::SLXbrowser(QString url, bool fullscreen, bool ignoreSslErrors) + : QMainWindow(NULL), + _url(url), + _ignoreSslErrors(ignoreSslErrors) +{ + if (fullscreen) { + this->showFullScreen(); + this->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + } + //QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); + QWidget *w = new QWidget; + QLayout *l = new QVBoxLayout; + _browser = new WebView; + _progress = new QProgressBar; + _progress->hide(); + l->addWidget(_browser); + l->addWidget(_progress); + l->setMargin(0); + l->setSpacing(0); + l->setContentsMargins(0,0,0,0); + w->setContentsMargins(0,0,0,0); + w->setLayout(l); + this->setCentralWidget(w); + + _reset.setSingleShot(true); + connect(&_reset, SIGNAL(timeout()), this, SLOT(reloadInitial())); + + connect(_browser, SIGNAL(loadStarted()), this, SLOT(loadStarted())); + connect(_browser, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); + connect(_browser, SIGNAL(loadProgress(int)), this, SLOT(loadProgress(int))); + // + QWebPage *page = _browser->page(); + QNetworkAccessManager *nam = new QNetworkAccessManager(this); + connect(nam, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), + this, SLOT(sslErrors(QNetworkReply*, const QList<QSslError>&))); + connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*))); + page->setNetworkAccessManager(nam); + page->mainFrame()->load(url); + // + _browser->show(); +} + +SLXbrowser::~SLXbrowser() +{ +} + +void SLXbrowser::loadStarted() +{ + _reset.stop(); + _normalError.clear(); + _sslErrors.clear(); + _progress->setValue(0); + _progress->show(); +} + +void SLXbrowser::loadFinished(bool ok) +{ + _progress->hide(); + if (!ok) { + _browser->page()->mainFrame()->setHtml("<html><body style='background:blue;color:white'><br><br><center><h1>Network Access Error</h1><pre id='content'></pre></body></html>"); + QWebElement el = _browser->page()->mainFrame()->documentElement().findFirst("#content"); + QString str; + if (!_sslErrors.empty()) { + str.append("SSL Errors:\n"); + for (QSslError err : _sslErrors) { + str.append(err.errorString()); + str.append('\n'); + } + } else if (_normalError.length() != 0) { + str.append("Load Error:\n"); + str.append(_normalError); + } else { + str.append("Unknown Error"); + } + str.append("\n\n\n\n" + QDateTime::currentDateTime().toString()); + el.setPlainText(str); + _sslErrors.clear(); + _normalError.clear(); + _reset.start(30000); + } +} + +void SLXbrowser::loadProgress(int progress) +{ + _progress->setValue(progress); +} + +void SLXbrowser::sslErrors(QNetworkReply* reply, const QList<QSslError>& errors) +{ + if (_ignoreSslErrors) { + reply->ignoreSslErrors(); + return; + } + _sslErrors.append(errors); +} + +void SLXbrowser::requestFinished(QNetworkReply *reply) +{ + if (reply->error() != QNetworkReply::NoError) { + _normalError = reply->errorString(); + } +} + +void SLXbrowser::reloadInitial() +{ + _browser->page()->mainFrame()->load(_url); +} |