diff -r 000000000000 -r 4f2f89ce4247 WebKitTools/QtTestBrowser/webpage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKitTools/QtTestBrowser/webpage.cpp Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies) + * Copyright (C) 2009 Girish Ramakrishnan + * Copyright (C) 2006 George Staikos + * Copyright (C) 2006 Dirk Mueller + * Copyright (C) 2006 Zack Rusin + * Copyright (C) 2006 Simon Hausmann + * + * 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 +#include +#include +#include +#include +#include + +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(requestPermissionFromUser(QWebFrame*, QWebPage::PermissionDomain)), this, SLOT(requestPermission(QWebFrame*, QWebPage::PermissionDomain))); + connect(this, SIGNAL(checkPermissionFromUser(QWebFrame*, QWebPage::PermissionDomain, QWebPage::PermissionPolicy&)), this, SLOT(checkPermission(QWebFrame*, QWebPage::PermissionDomain, QWebPage::PermissionPolicy&))); + connect(this, SIGNAL(cancelRequestsForPermission(QWebFrame*, QWebPage::PermissionDomain)), this, SLOT(cancelRequestsForPermission(QWebFrame*, QWebPage::PermissionDomain))); +} + +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(option); + QWebPage::ErrorPageExtensionReturn* errorPage = static_cast(output); + + errorPage->content = QString("Failed loading page%1") + .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) +{ + if (QAction* action = qobject_cast(sender())) + QDesktopServices::openUrl(action->data().toUrl()); + else + QDesktopServices::openUrl(url); +} + +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); + + 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); + + 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) { + authenticator->setUser(userInput->text()); + authenticator->setPassword(passInput->text()); + } + + delete dialog; +} + +void WebPage::requestPermission(QWebFrame* frame, QWebPage::PermissionDomain domain) +{ + setUserPermission(frame, domain, PermissionGranted); +} + +void WebPage::checkPermission(QWebFrame* frame, QWebPage::PermissionDomain domain, QWebPage::PermissionPolicy& policy) +{ + switch (domain) { + case NotificationsPermissionDomain: + policy = PermissionGranted; + break; + default: + break; + } +} + +void WebPage::cancelRequestsForPermission(QWebFrame*, QWebPage::PermissionDomain) +{ +} + +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 +} +