| /* |
| * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies) |
| * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in> |
| * Copyright (C) 2006 George Staikos <staikos@kde.org> |
| * Copyright (C) 2006 Dirk Mueller <mueller@kde.org> |
| * Copyright (C) 2006 Zack Rusin <zack@kde.org> |
| * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org> |
| * |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "webpage.h" |
| |
| #include "launcherwindow.h" |
| |
| #include <QAuthenticator> |
| #include <QDesktopServices> |
| #include <QtGui> |
| #include <QtNetwork/QNetworkReply> |
| #include <QtNetwork/QNetworkRequest> |
| #include <QtNetwork/QNetworkProxy> |
| |
| WebPage::WebPage(QObject* parent) |
| : QWebPage(parent) |
| , m_userAgent() |
| , m_interruptingJavaScriptEnabled(false) |
| { |
| applyProxy(); |
| |
| connect(networkAccessManager(), SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), |
| this, SLOT(authenticationRequired(QNetworkReply*, QAuthenticator*))); |
| connect(this, SIGNAL(featurePermissionRequested(QWebFrame*, QWebPage::Feature)), this, SLOT(requestPermission(QWebFrame*, QWebPage::Feature))); |
| connect(this, SIGNAL(featurePermissionRequestCanceled(QWebFrame*, QWebPage::Feature)), this, SLOT(featurePermissionRequestCanceled(QWebFrame*, QWebPage::Feature))); |
| } |
| |
| void WebPage::applyProxy() |
| { |
| QUrl proxyUrl(qgetenv("http_proxy")); |
| |
| if (proxyUrl.isValid() && !proxyUrl.host().isEmpty()) { |
| int proxyPort = (proxyUrl.port() > 0) ? proxyUrl.port() : 8080; |
| networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::HttpProxy, proxyUrl.host(), proxyPort)); |
| } |
| } |
| |
| bool WebPage::supportsExtension(QWebPage::Extension extension) const |
| { |
| if (extension == QWebPage::ErrorPageExtension) |
| return true; |
| return false; |
| } |
| |
| bool WebPage::extension(Extension extension, const ExtensionOption* option, ExtensionReturn* output) |
| { |
| const QWebPage::ErrorPageExtensionOption* info = static_cast<const QWebPage::ErrorPageExtensionOption*>(option); |
| QWebPage::ErrorPageExtensionReturn* errorPage = static_cast<QWebPage::ErrorPageExtensionReturn*>(output); |
| |
| errorPage->content = QString("<html><head><title>Failed loading page</title></head><body>%1</body></html>") |
| .arg(info->errorString).toUtf8(); |
| |
| return true; |
| } |
| |
| bool WebPage::acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest& request, NavigationType type) |
| { |
| QObject* view = parent(); |
| |
| QVariant value = view->property("keyboardModifiers"); |
| |
| if (!value.isNull()) { |
| Qt::KeyboardModifiers modifiers = Qt::KeyboardModifiers(value.toInt()); |
| |
| if (modifiers & Qt::ShiftModifier) { |
| QWebPage* page = createWindow(QWebPage::WebBrowserWindow); |
| page->mainFrame()->load(request); |
| return false; |
| } |
| |
| if (modifiers & Qt::AltModifier) { |
| openUrlInDefaultBrowser(request.url()); |
| return false; |
| } |
| } |
| |
| return QWebPage::acceptNavigationRequest(frame, request, type); |
| } |
| |
| void WebPage::openUrlInDefaultBrowser(const QUrl& url) |
| { |
| #ifndef QT_NO_DESKTOPSERVICES |
| if (QAction* action = qobject_cast<QAction*>(sender())) |
| QDesktopServices::openUrl(action->data().toUrl()); |
| else |
| QDesktopServices::openUrl(url); |
| #endif |
| } |
| |
| QString WebPage::userAgentForUrl(const QUrl& url) const |
| { |
| if (!m_userAgent.isEmpty()) |
| return m_userAgent; |
| return QWebPage::userAgentForUrl(url); |
| } |
| |
| bool WebPage::shouldInterruptJavaScript() |
| { |
| if (!m_interruptingJavaScriptEnabled) |
| return false; |
| return QWebPage::shouldInterruptJavaScript(); |
| } |
| |
| void WebPage::authenticationRequired(QNetworkReply* reply, QAuthenticator* authenticator) |
| { |
| QDialog* dialog = new QDialog(QApplication::activeWindow()); |
| dialog->setWindowTitle("HTTP Authentication"); |
| |
| QGridLayout* layout = new QGridLayout(dialog); |
| dialog->setLayout(layout); |
| |
| QLabel* messageLabel = new QLabel(dialog); |
| messageLabel->setWordWrap(true); |
| QString messageStr = QString("Enter with username and password for: %1"); |
| messageLabel->setText(messageStr.arg(reply->url().toString())); |
| layout->addWidget(messageLabel, 0, 1); |
| |
| #ifndef QT_NO_LINEEDIT |
| QLabel* userLabel = new QLabel("Username:", dialog); |
| layout->addWidget(userLabel, 1, 0); |
| QLineEdit* userInput = new QLineEdit(dialog); |
| layout->addWidget(userInput, 1, 1); |
| |
| QLabel* passLabel = new QLabel("Password:", dialog); |
| layout->addWidget(passLabel, 2, 0); |
| QLineEdit* passInput = new QLineEdit(dialog); |
| passInput->setEchoMode(QLineEdit::Password); |
| layout->addWidget(passInput, 2, 1); |
| #endif |
| |
| QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |
| | QDialogButtonBox::Cancel, Qt::Horizontal, dialog); |
| connect(buttonBox, SIGNAL(accepted()), dialog, SLOT(accept())); |
| connect(buttonBox, SIGNAL(rejected()), dialog, SLOT(reject())); |
| layout->addWidget(buttonBox, 3, 1); |
| |
| if (dialog->exec() == QDialog::Accepted) { |
| #ifndef QT_NO_LINEEDIT |
| authenticator->setUser(userInput->text()); |
| authenticator->setPassword(passInput->text()); |
| #endif |
| } |
| |
| delete dialog; |
| } |
| |
| void WebPage::requestPermission(QWebFrame* frame, QWebPage::Feature feature) |
| { |
| setFeaturePermission(frame, feature, PermissionGrantedByUser); |
| } |
| |
| void WebPage::featurePermissionRequestCanceled(QWebFrame*, QWebPage::Feature) |
| { |
| } |
| |
| QWebPage* WebPage::createWindow(QWebPage::WebWindowType type) |
| { |
| LauncherWindow* mw = new LauncherWindow; |
| if (type == WebModalDialog) |
| mw->setWindowModality(Qt::ApplicationModal); |
| mw->show(); |
| return mw->page(); |
| } |
| |
| QObject* WebPage::createPlugin(const QString &classId, const QUrl&, const QStringList&, const QStringList&) |
| { |
| if (classId == "alien_QLabel") { |
| QLabel* l = new QLabel; |
| l->winId(); |
| return l; |
| } |
| |
| #ifndef QT_NO_UITOOLS |
| QUiLoader loader; |
| return loader.createWidget(classId, view()); |
| #else |
| Q_UNUSED(classId); |
| return 0; |
| #endif |
| } |
| |