/*! @file @id $Id: browser.hxx 15 2010-06-03 14:17:27Z marc $ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #ifndef BROWSER_HXX #define BROWSER_HXX #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LOG qDebug()<<__PRETTY_FUNCTION__ extern SmartCardAuth _scAuth; class SslClientAuthNetworkAccessManager: public QNetworkAccessManager { Q_OBJECT; public: SslClientAuthNetworkAccessManager(QObject* parent = 0): QNetworkAccessManager(parent) { LOG; assert (connect(this, SIGNAL(extendedContextInitialization(ssl_ctx_st*)), &_scAuth, SLOT(extendedContextInitialization(ssl_ctx_st*)))); } virtual ~SslClientAuthNetworkAccessManager() { LOG; } protected: virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& req, QIODevice* outgoingData = 0 ) { LOG<url().toString(); return rep; } }; class Browser: public QMainWindow, protected Ui::Browser { Q_OBJECT; public: Browser(const QString& url, bool kiosk = false, bool proxydetection = false): _url(0), _home(url), _proxy(0), _kiosk(kiosk) { LOG<setEnabled(proxydetection); if (proxydetection) { _proxy = new gui::Proxy(url, this); assert(connect(_proxy, SIGNAL(proxyFound(const QUrl&, const QNetworkProxy&)), SLOT(startDownload(QUrl, const QNetworkProxy&)))); assert(connect(_proxy, SIGNAL(temporaryError (QNetworkReply::NetworkError, QString, QString)), SLOT(proxy_error(QNetworkReply::NetworkError, QString, QString)))); assert(connect(_proxy, SIGNAL(proxyError(QNetworkReply::NetworkError)), SLOT(proxy_error(QNetworkReply::NetworkError)))); } _toolbar->addWidget(_url = new QLineEdit(_toolbar)); _url->setText(url); assert(connect(_url, SIGNAL(returnPressed()), SLOT(load()))); if (_kiosk) { _menu->hide(); _url->setEnabled(false); } statusBar()->addPermanentWidget(_progress = new QProgressBar()); statusBar()->addPermanentWidget(_zoom = new QSlider(Qt::Horizontal)); _zoom->setMinimum(1); _zoom->setMaximum(100); _zoom->setValue(10); assert(connect(_zoom, SIGNAL(valueChanged(int)), SLOT(zoom(int)))); _browser->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); _browser->page()->setNetworkAccessManager (new SslClientAuthNetworkAccessManager); // QWebPage WebAction connect(_browser->pageAction(QWebPage::OpenLink), SIGNAL(triggered(bool)), SLOT(triggeredOpenLink(bool))); connect(_browser->pageAction(QWebPage::OpenLinkInNewWindow), SIGNAL(triggered(bool)), SLOT(triggeredOpenLinkInNewWindow(bool))); connect(_browser->pageAction(QWebPage::OpenFrameInNewWindow), SIGNAL(triggered(bool)), SLOT(triggeredOpenFrameInNewWindow(bool))); connect(_browser->pageAction(QWebPage::DownloadLinkToDisk), SIGNAL(triggered(bool)), SLOT(triggeredDownloadLinkToDisk(bool))); connect(_browser->pageAction(QWebPage::CopyLinkToClipboard), SIGNAL(triggered(bool)), SLOT(triggeredCopyLinkToClipboard(bool))); connect(_browser->pageAction(QWebPage::OpenImageInNewWindow), SIGNAL(triggered(bool)), SLOT(triggeredOpenImageInNewWindow(bool))); connect(_browser->pageAction(QWebPage::DownloadImageToDisk), SIGNAL(triggered(bool)), SLOT(triggeredDownloadImageToDisk(bool))); connect(_browser->pageAction(QWebPage::CopyImageToClipboard), SIGNAL(triggered(bool)), SLOT(triggeredCopyImageToClipboard(bool))); connect(_browser->pageAction(QWebPage::Back), SIGNAL(triggered(bool)), SLOT(triggeredBack(bool))); connect(_browser->pageAction(QWebPage::Forward), SIGNAL(triggered(bool)), SLOT(triggeredForward(bool))); connect(_browser->pageAction(QWebPage::Stop), SIGNAL(triggered(bool)), SLOT(triggeredStop(bool))); connect(_browser->pageAction(QWebPage::Reload), SIGNAL(triggered(bool)), SLOT(triggeredReload(bool))); connect(_browser->pageAction(QWebPage::Cut), SIGNAL(triggered(bool)), SLOT(triggeredCut(bool))); connect(_browser->pageAction(QWebPage::Copy), SIGNAL(triggered(bool)), SLOT(triggeredCopy(bool))); connect(_browser->pageAction(QWebPage::Paste), SIGNAL(triggered(bool)), SLOT(triggeredPaste(bool))); connect(_browser->pageAction(QWebPage::Undo), SIGNAL(triggered(bool)), SLOT(triggeredUndo(bool))); connect(_browser->pageAction(QWebPage::Redo), SIGNAL(triggered(bool)), SLOT(triggeredRedo(bool))); connect(_browser->pageAction(QWebPage::MoveToNextChar), SIGNAL(triggered(bool)), SLOT(triggeredMoveToNextChar(bool))); connect(_browser->pageAction(QWebPage::MoveToPreviousChar), SIGNAL(triggered(bool)), SLOT(triggeredMoveToPreviousChar(bool))); connect(_browser->pageAction(QWebPage::MoveToNextWord), SIGNAL(triggered(bool)), SLOT(triggeredMoveToNextWord(bool))); connect(_browser->pageAction(QWebPage::MoveToPreviousWord), SIGNAL(triggered(bool)), SLOT(triggeredMoveToPreviousWord(bool))); connect(_browser->pageAction(QWebPage::MoveToNextLine), SIGNAL(triggered(bool)), SLOT(triggeredMoveToNextLine(bool))); connect(_browser->pageAction(QWebPage::MoveToPreviousLine), SIGNAL(triggered(bool)), SLOT(triggeredMoveToPreviousLine(bool))); connect(_browser->pageAction(QWebPage::MoveToStartOfLine), SIGNAL(triggered(bool)), SLOT(triggeredMoveToStartOfLine(bool))); connect(_browser->pageAction(QWebPage::MoveToEndOfLine), SIGNAL(triggered(bool)), SLOT(triggeredMoveToEndOfLine(bool))); connect(_browser->pageAction(QWebPage::MoveToStartOfBlock), SIGNAL(triggered(bool)), SLOT(triggeredMoveToStartOfBlock(bool))); connect(_browser->pageAction(QWebPage::MoveToEndOfBlock), SIGNAL(triggered(bool)), SLOT(triggeredMoveToEndOfBlock(bool))); connect(_browser->pageAction(QWebPage::MoveToStartOfDocument), SIGNAL(triggered(bool)), SLOT(triggeredMoveToStartOfDocument(bool))); connect(_browser->pageAction(QWebPage::MoveToEndOfDocument), SIGNAL(triggered(bool)), SLOT(triggeredMoveToEndOfDocument(bool))); connect(_browser->pageAction(QWebPage::SelectNextChar), SIGNAL(triggered(bool)), SLOT(triggeredSelectNextChar(bool))); connect(_browser->pageAction(QWebPage::SelectPreviousChar), SIGNAL(triggered(bool)), SLOT(triggeredSelectPreviousChar(bool))); connect(_browser->pageAction(QWebPage::SelectNextWord), SIGNAL(triggered(bool)), SLOT(triggeredSelectNextWord(bool))); connect(_browser->pageAction(QWebPage::SelectPreviousWord), SIGNAL(triggered(bool)), SLOT(triggeredSelectPreviousWord(bool))); connect(_browser->pageAction(QWebPage::SelectNextLine), SIGNAL(triggered(bool)), SLOT(triggeredSelectNextLine(bool))); connect(_browser->pageAction(QWebPage::SelectPreviousLine), SIGNAL(triggered(bool)), SLOT(triggeredSelectPreviousLine(bool))); connect(_browser->pageAction(QWebPage::SelectStartOfLine), SIGNAL(triggered(bool)), SLOT(triggeredSelectStartOfLine(bool))); connect(_browser->pageAction(QWebPage::SelectEndOfLine), SIGNAL(triggered(bool)), SLOT(triggeredSelectEndOfLine(bool))); connect(_browser->pageAction(QWebPage::SelectStartOfBlock), SIGNAL(triggered(bool)), SLOT(triggeredSelectStartOfBlock(bool))); connect(_browser->pageAction(QWebPage::SelectEndOfBlock), SIGNAL(triggered(bool)), SLOT(triggeredSelectEndOfBlock(bool))); connect(_browser->pageAction(QWebPage::SelectStartOfDocument), SIGNAL(triggered(bool)), SLOT(triggeredSelectStartOfDocument(bool))); connect(_browser->pageAction(QWebPage::SelectEndOfDocument), SIGNAL(triggered(bool)), SLOT(triggeredSelectEndOfDocument(bool))); connect(_browser->pageAction(QWebPage::DeleteStartOfWord), SIGNAL(triggered(bool)), SLOT(triggeredDeleteStartOfWord(bool))); connect(_browser->pageAction(QWebPage::DeleteEndOfWord), SIGNAL(triggered(bool)), SLOT(triggeredDeleteEndOfWord(bool))); connect(_browser->pageAction(QWebPage::SetTextDirectionDefault), SIGNAL(triggered(bool)), SLOT(triggeredSetTextDirectionDefault(bool))); connect(_browser->pageAction(QWebPage::SetTextDirectionLeftToRight), SIGNAL(triggered(bool)), SLOT(triggeredSetTextDirectionLeftToRight(bool))); connect(_browser->pageAction(QWebPage::SetTextDirectionRightToLeft), SIGNAL(triggered(bool)), SLOT(triggeredSetTextDirectionRightToLeft(bool))); connect(_browser->pageAction(QWebPage::ToggleBold), SIGNAL(triggered(bool)), SLOT(triggeredToggleBold(bool))); connect(_browser->pageAction(QWebPage::ToggleItalic), SIGNAL(triggered(bool)), SLOT(triggeredToggleItalic(bool))); connect(_browser->pageAction(QWebPage::ToggleUnderline), SIGNAL(triggered(bool)), SLOT(triggeredToggleUnderline(bool))); connect(_browser->pageAction(QWebPage::InspectElement), SIGNAL(triggered(bool)), SLOT(triggeredInspectElement(bool))); connect(_browser->pageAction(QWebPage::InsertParagraphSeparator), SIGNAL(triggered(bool)), SLOT(triggeredInsertParagraphSeparator(bool))); connect(_browser->pageAction(QWebPage::InsertLineSeparator), SIGNAL(triggered(bool)), SLOT(triggeredInsertLineSeparator(bool))); connect(_browser->pageAction(QWebPage::SelectAll), SIGNAL(triggered(bool)), SLOT(triggeredSelectAll(bool))); // QWebPage assert(connect(_browser->page(), SIGNAL(contentsChanged()), SLOT(contentsChanged()))); assert(connect(_browser->page(), SIGNAL(databaseQuotaExceeded(QWebFrame*, QString)), SLOT(databaseQuotaExceeded(QWebFrame*, QString)))); assert(connect(_browser->page(), SIGNAL(downloadRequested(const QNetworkRequest&)), SLOT(downloadRequested(const QNetworkRequest&)))); assert(connect(_browser->page(), SIGNAL(frameCreated(QWebFrame*)), SLOT(frameCreated(QWebFrame*)))); assert(connect(_browser->page(), SIGNAL(geometryChangeRequested(const QRect&)), SLOT(geometryChangeRequested(const QRect&)))); assert(connect(_browser->page(), SIGNAL(linkClicked(const QUrl&)), SLOT(linkClicked(const QUrl&)))); assert(connect(_browser->page(), SIGNAL(linkHovered(const QString&, const QString&, const QString&)), SLOT(linkHovered(const QString&, const QString&, const QString&)))); assert(connect(_browser->page(), SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)))); assert(connect(_browser->page(), SIGNAL(loadProgress(int)), SLOT(loadProgress(int)))); assert(connect(_browser->page(), SIGNAL(loadStarted()), SLOT(loadStarted()))); assert(connect(_browser->page(), SIGNAL(menuBarVisibilityChangeRequested(bool)), SLOT(menuBarVisibilityChangeRequested(bool)))); assert(connect(_browser->page(), SIGNAL(microFocusChanged()), SLOT(microFocusChanged()))); assert(connect(_browser->page(), SIGNAL(printRequested(QWebFrame*)), SLOT(printRequested(QWebFrame*)))); assert(connect(_browser->page(), SIGNAL(repaintRequested(const QRect&)), SLOT(repaintRequested(const QRect&)))); assert(connect(_browser->page(), SIGNAL(restoreFrameStateRequested(QWebFrame*)), SLOT(restoreFrameStateRequested(QWebFrame*)))); assert(connect(_browser->page(), SIGNAL(saveFrameStateRequested(QWebFrame*, QWebHistoryItem*)), SLOT(saveFrameStateRequested(QWebFrame*, QWebHistoryItem*)))); assert(connect(_browser->page(), SIGNAL(scrollRequested(int, int, const QRect&)), SLOT(scrollRequested(int, int, const QRect&)))); assert(connect(_browser->page(), SIGNAL(selectionChanged()), SLOT(selectionChanged()))); assert(connect(_browser->page(), SIGNAL(statusBarMessage(const QString&)), SLOT(statusBarMessage(const QString&)))); assert(connect(_browser->page(), SIGNAL(statusBarVisibilityChangeRequested(bool)), SLOT(statusBarVisibilityChangeRequested(bool)))); assert(connect(_browser->page(), SIGNAL(toolBarVisibilityChangeRequested(bool)), SLOT(toolBarVisibilityChangeRequested(bool)))); assert(connect(_browser->page(), SIGNAL(unsupportedContent(QNetworkReply*)), SLOT(unsupportedContent(QNetworkReply*)))); assert(connect(_browser->page(), SIGNAL(windowCloseRequested()), SLOT(windowCloseRequested()))); // QNetworkAccessManager assert(connect(_browser->page()->networkAccessManager(), SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), SLOT(authenticationRequired(QNetworkReply*, QAuthenticator*)))); assert(connect(_browser->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*)), SLOT(finished(QNetworkReply*)))); assert(connect(_browser->page()->networkAccessManager(), SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)), SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)))); assert(connect(_browser->page()->networkAccessManager(), SIGNAL(sslErrors(QNetworkReply*, const QList&)), SLOT(sslErrors(QNetworkReply*, const QList&)))); load(url); } QString networkError(QNetworkReply::NetworkError err) { LOG<Unknown network error (code: %1).") .arg(err); } } bool check(QUrl page) { return true; } private Q_SLOTS: void load() { LOG; load(_url->text()); } void load(QString page) { if (QUrl(page).scheme()=="") page = "http://"+page; load(QUrl(page)); } void load(QUrl page) { LOG<showMessage(tr("Checking: %1").arg(page.toString())); try { if (!check(page)) { qDebug()<<"########## BLACK LISTED IGNORED ##########"; statusBar()->showMessage(tr("Forbidden: %1").arg(page.toString())); QMessageBox::warning(this, tr("Access Denied"), tr("

Access denied due to security" " considerations.

You are not" " allowed to connect to %1.") .arg(page.toString())); return; } if (_proxy) _proxy->checkUrl(page.toString()); _progress->setValue(0); _progress->setMaximum(0); _progress->show(); if (!_proxy) startDownload(page); } catch (...) { reply_error(QNetworkReply::ProxyNotFoundError); } // no network } void startDownload(QUrl url, const QNetworkProxy& proxy) { LOG; QNetworkProxy::setApplicationProxy(proxy); startDownload(url); } void startDownload(QUrl url) { LOG<showMessage(tr("Reading: %1").arg(url.toString())); if (!url.isValid()) { statusBar()->showMessage(tr("Illegal URL: %1").arg(url.errorString())); _progress->hide(); return; } //if (url.scheme()=="") url.setScheme("http"); _browser->load(url); } void reply_error(QNetworkReply::NetworkError err) { LOG<showMessage(tr("network error")); _error += tr("

%1

%2

") .arg(tr("Reply Error")) .arg(networkError(err)); } //! intermediate proxy error void proxy_error(QNetworkReply::NetworkError err, QString errStr, QString proxy) { LOG<showMessage(tr("proxy error")); _error += tr("

%1

Proxy: %3

%2

%4

") .arg(tr("Possible Proxy Failed")) .arg(networkError(err)) .arg(proxy) .arg(errStr); } //! final proxy error void proxy_error(QNetworkReply::NetworkError err) { LOG<showMessage(tr("proxy error")); _error = tr("

%1

%2

") .arg(tr("Connection Cannot Be Established")) .arg(networkError(err)) + _error; on__browser_loadFinished(false); } void zoom(int i) { LOG<<100.0*i/10.0; statusBar()->showMessage(tr("Zoom: %1%").arg(100.0*i/10.0)); _browser->setZoomFactor(i/10.0); } void on_actionHome_activated() { LOG; load(_home); } void on__browser_urlChanged(const QUrl& url) { LOG<setText(url.toString()); } void on__browser_linkClicked(const QUrl& url) { LOG<icon()); } void on__browser_titleChanged(const QString& text) { LOG<showMessage(tr("Info: %1").arg(text)); } void on__browser_loadProgress(int i) { LOG<setValue(i); } void on__browser_loadStarted() { LOG; _progress->setValue(0); _progress->setMaximum(100); _progress->show(); actionStop->setEnabled(true); actionForward->setEnabled(false); actionBack->setEnabled(false); actionReload->setEnabled(false); actionHome->setEnabled(false); } void on__browser_loadFinished(bool ok) { LOG<<(ok?"success":"error"); if (!ok) { _browser->setHtml(tr("Page Load Error" "

Page Load Error

%1" "") .arg(_error), _errorUrl); statusBar()->showMessage(tr("download error")); } else { statusBar()->showMessage(tr("done.")); } _error.clear(); _progress->hide(); on__browser_iconChanged(); actionStop->setEnabled(false); actionForward->setEnabled(_browser->history()->canGoForward()); actionBack->setEnabled(_browser->history()->canGoBack()); actionReload->setEnabled(true); actionHome->setEnabled(true); } void on_actionNew_triggered() { LOG; (new Browser(_browser->url().toString(), _kiosk, false))->show(); } void on_actionClose_triggered() { LOG; close(); } void on_actionProxySettings_triggered() { LOG; if (_proxy) _proxy->show(); } //@name QWebPage slots //@{ void triggeredOpenLink(bool) { LOG; } void triggeredOpenLinkInNewWindow(bool) { LOG; } void triggeredOpenFrameInNewWindow(bool) { LOG; } void triggeredDownloadLinkToDisk(bool) { LOG; } void triggeredCopyLinkToClipboard(bool) { LOG; } void triggeredOpenImageInNewWindow(bool) { LOG; } void triggeredDownloadImageToDisk(bool) { LOG; } void triggeredCopyImageToClipboard(bool) { LOG; } void triggeredBack(bool) { LOG; } void triggeredForward(bool) { LOG; } void triggeredStop(bool) { LOG; } void triggeredReload(bool) { LOG; } void triggeredCut(bool) { LOG; } void triggeredCopy(bool) { LOG; } void triggeredPaste(bool) { LOG; } void triggeredUndo(bool) { LOG; } void triggeredRedo(bool) { LOG; } void triggeredMoveToNextChar(bool) { LOG; } void triggeredMoveToPreviousChar(bool) { LOG; } void triggeredMoveToNextWord(bool) { LOG; } void triggeredMoveToPreviousWord(bool) { LOG; } void triggeredMoveToNextLine(bool) { LOG; } void triggeredMoveToPreviousLine(bool) { LOG; } void triggeredMoveToStartOfLine(bool) { LOG; } void triggeredMoveToEndOfLine(bool) { LOG; } void triggeredMoveToStartOfBlock(bool) { LOG; } void triggeredMoveToEndOfBlock(bool) { LOG; } void triggeredMoveToStartOfDocument(bool) { LOG; } void triggeredMoveToEndOfDocument(bool) { LOG; } void triggeredSelectNextChar(bool) { LOG; } void triggeredSelectPreviousChar(bool) { LOG; } void triggeredSelectNextWord(bool) { LOG; } void triggeredSelectPreviousWord(bool) { LOG; } void triggeredSelectNextLine(bool) { LOG; } void triggeredSelectPreviousLine(bool) { LOG; } void triggeredSelectStartOfLine(bool) { LOG; } void triggeredSelectEndOfLine(bool) { LOG; } void triggeredSelectStartOfBlock(bool) { LOG; } void triggeredSelectEndOfBlock(bool) { LOG; } void triggeredSelectStartOfDocument(bool) { LOG; } void triggeredSelectEndOfDocument(bool) { LOG; } void triggeredDeleteStartOfWord(bool) { LOG; } void triggeredDeleteEndOfWord(bool) { LOG; } void triggeredSetTextDirectionDefault(bool) { LOG; } void triggeredSetTextDirectionLeftToRight(bool) { LOG; } void triggeredSetTextDirectionRightToLeft(bool) { LOG; } void triggeredToggleBold(bool) { LOG; } void triggeredToggleItalic(bool) { LOG; } void triggeredToggleUnderline(bool) { LOG; } void triggeredInspectElement(bool) { LOG; } void triggeredInsertParagraphSeparator(bool) { LOG; } void triggeredInsertLineSeparator(bool) { LOG; } void triggeredSelectAll(bool) { LOG; } //@} //@name QWebPage slots //@{ void contentsChanged() { LOG; } void databaseQuotaExceeded(QWebFrame* frame, QString databaseName) { LOG<showMessage(tr("%1", "statusbar for hovered link %1=url") .arg(link)); } void loadFinished(bool ok) { LOG<<(ok?"succeess":"error"); } void loadProgress(int progress) { LOG<showMessage(tr("unsupported content")); _error += tr("

%1

URL: %3

%2

") .arg(tr("Unsuported Content")) .arg(networkError(reply->error())) .arg(reply->url().toString()); _errorUrl = reply->url(); } void windowCloseRequested() { LOG; } //@} //@name QNetworkAccessManager signals //@{ void authenticationRequired(QNetworkReply* reply, QAuthenticator* authenticator) { LOG; statusBar()->showMessage(tr("authentication required")); _error += tr("

%1

URL: %3

%2

") .arg(tr("Authentication Required")) .arg(networkError(reply->error())) .arg(reply->url().toString()); _errorUrl = reply->url(); } void finished(QNetworkReply* reply) { LOG<<(reply->error()==QNetworkReply::NoError?"success":"error"); if (reply->error()!=QNetworkReply::NoError) { _error += tr("

%1

URL: %3

%2

") .arg(tr("Network Error")) .arg(networkError(reply->error())) .arg(reply->url().toString()); _errorUrl = reply->url(); } } void proxyAuthenticationRequired(const QNetworkProxy& proxy, QAuthenticator* authenticator) { LOG; } void sslErrors(QNetworkReply* reply, const QList& errors) { LOG; statusBar()->showMessage(tr("ssl error")); QString e; for (QList::const_iterator err(errors.begin()); err!=errors.end(); ++err) e+=tr("
  • %1
  • ", "single ssl error").arg(err->errorString()); _error += tr("

    %1

    URL: %4

    %2

    " "

    SSL Errors

    " "

      %3

    ") .arg(tr("SSL Error")) .arg(networkError(reply->error())) .arg(e) .arg(reply->url().toString()); _errorUrl = reply->url(); } //@} private: QLineEdit* _url; QSlider* _zoom; QProgressBar* _progress; QString _home; gui::Proxy* _proxy; bool _kiosk; bool _proxydetection; QString _error; QUrl _errorUrl; }; #endif