File indexing completed on 2024-04-21 04:42:35

0001 /*
0002  * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
0003  * Copyright (C) 2006 George Staikos <staikos@kde.org>
0004  * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
0005  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
0006  * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org>
0007  *
0008  * All rights reserved.
0009  *
0010  * Redistribution and use in source and binary forms, with or without
0011  * modification, are permitted provided that the following conditions
0012  * are met:
0013  * 1. Redistributions of source code must retain the above copyright
0014  *    notice, this list of conditions and the following disclaimer.
0015  * 2. Redistributions in binary form must reproduce the above copyright
0016  *    notice, this list of conditions and the following disclaimer in the
0017  *    documentation and/or other materials provided with the distribution.
0018  *
0019  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
0020  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0021  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
0022  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
0023  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
0024  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
0025  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
0026  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
0027  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
0028  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
0029  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0030  */
0031 
0032 #include "kwebkitpart_demo_debug.h"
0033 
0034 #include <KWebView>
0035 
0036 #include <KAboutData>
0037 #include <KUriFilter>
0038 #include <KLineEdit>
0039 #include <KLocalizedString>
0040 
0041 #include <QInputDialog>
0042 #include <QWebPage>
0043 #include <QWebView>
0044 #include <QWebFrame>
0045 #include <QWebSettings>
0046 #include <QWebElement>
0047 #include <QWebElementCollection>
0048 
0049 #if !defined(QT_NO_PRINTER)
0050 #include <QPrintPreviewDialog>
0051 #endif
0052 
0053 #include <QCompleter>
0054 #include <QMainWindow>
0055 #include <QMenu>
0056 #include <QMenuBar>
0057 #include <QProgressBar>
0058 #include <QStatusBar>
0059 #include <QStringListModel>
0060 #include <QToolBar>
0061 #include <QToolTip>
0062 #include <QDir>
0063 #include <QFile>
0064 #include <QApplication>
0065 #include <QCommandLineParser>
0066 
0067 
0068 class MainWindow : public QMainWindow
0069 {
0070     Q_OBJECT
0071 public:
0072     MainWindow(const QString& url = QString()): currentZoom(100) {
0073         view = new KWebView(this);
0074         setCentralWidget(view);
0075 
0076         connect(view, SIGNAL(loadFinished(bool)),
0077                 this, SLOT(loadFinished()));
0078         connect(view, SIGNAL(titleChanged(QString)),
0079                 this, SLOT(setWindowTitle(QString)));
0080         connect(view->page(), SIGNAL(linkHovered(QString,QString,QString)),
0081                 this, SLOT(showLinkHover(QString,QString)));
0082         connect(view->page(), SIGNAL(windowCloseRequested()), this, SLOT(deleteLater()));
0083 
0084         setupUI();
0085 
0086         QUrl qurl(KUriFilter::self()->filteredUri(url, QStringList() << "kshorturifilter"));
0087         if (qurl.isValid()) {
0088             urlEdit->setText(qurl.toEncoded());
0089             view->load(qurl);
0090 
0091             // the zoom values are chosen to be like in Mozilla Firefox 3
0092             zoomLevels << 30 << 50 << 67 << 80 << 90;
0093             zoomLevels << 100;
0094             zoomLevels << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300;
0095         }
0096     }
0097 
0098     QWebPage* webPage() const {
0099         return view->page();
0100     }
0101 
0102     QWebView* webView() const {
0103         return view;
0104     }
0105 
0106 protected Q_SLOTS:
0107 
0108     void changeLocation() {
0109         QUrl url (KUriFilter::self()->filteredUri(urlEdit->text(), QStringList() << "kshorturifilter"));
0110         view->load(url);
0111         view->setFocus(Qt::OtherFocusReason);
0112     }
0113 
0114     void loadFinished() {
0115         urlEdit->setText(view->url().toString());
0116 
0117         QUrl::FormattingOptions opts;
0118         opts |= QUrl::RemoveScheme;
0119         opts |= QUrl::RemoveUserInfo;
0120         opts |= QUrl::StripTrailingSlash;
0121         QString s = view->url().toString(opts);
0122         s = s.mid(2);
0123         if (s.isEmpty())
0124             return;
0125 
0126         if (!urlList.contains(s))
0127             urlList += s;
0128         urlModel.setStringList(urlList);
0129     }
0130 
0131     void showLinkHover(const QString &link, const QString &toolTip) {
0132         statusBar()->showMessage(link);
0133 #ifndef QT_NO_TOOLTIP
0134         if (!toolTip.isEmpty())
0135             QToolTip::showText(QCursor::pos(), toolTip);
0136 #endif
0137     }
0138 
0139     void zoomIn() {
0140         int i = zoomLevels.indexOf(currentZoom);
0141         Q_ASSERT(i >= 0);
0142         if (i < zoomLevels.count() - 1)
0143             currentZoom = zoomLevels[i + 1];
0144 
0145         view->setZoomFactor(qreal(currentZoom)/100.0);
0146     }
0147 
0148     void zoomOut() {
0149         int i = zoomLevels.indexOf(currentZoom);
0150         Q_ASSERT(i >= 0);
0151         if (i > 0)
0152             currentZoom = zoomLevels[i - 1];
0153 
0154         view->setZoomFactor(qreal(currentZoom)/100.0);
0155     }
0156 
0157     void resetZoom()
0158     {
0159        currentZoom = 100;
0160        view->setZoomFactor(1.0);
0161     }
0162 
0163     void toggleZoomTextOnly(bool b)
0164     {
0165         view->page()->settings()->setAttribute(QWebSettings::ZoomTextOnly, b);
0166     }
0167 
0168     void print() {
0169 #if !defined(QT_NO_PRINTER)
0170         QScopedPointer<QPrintPreviewDialog> dlg (new QPrintPreviewDialog(this));
0171         connect(dlg.data(), SIGNAL(paintRequested(QPrinter*)),
0172                 view, SLOT(print(QPrinter*)));
0173         dlg->exec();
0174 #endif
0175     }
0176 
0177     void setEditable(bool on) {
0178         view->page()->setContentEditable(on);
0179         formatMenuAction->setVisible(on);
0180     }
0181 
0182     void dumpHtml() {
0183         qCDebug(KWEBKITPART_DEMO_LOG) << "HTML: " << view->page()->mainFrame()->toHtml();
0184     }
0185 
0186     void selectElements() {
0187         bool ok;
0188         QString str = QInputDialog::getText(this,
0189                                             i18nc("input dialog window title for selecting html elements", "Select elements"),
0190                                             i18nc("input dialog text for selecting html elements", "Choose elements"),
0191                                             QLineEdit::Normal,
0192                                             QLatin1String("a"), &ok);
0193         if (ok && !str.isEmpty()) {
0194             QWebElementCollection collection = view->page()->mainFrame()->findAllElements(str);
0195             const int count = collection.count();
0196             for (int i=0; i < count; i++)
0197                 collection.at(i).setStyleProperty("background-color", "yellow");
0198             statusBar()->showMessage(i18np("%1 element selected", "%1 elements selected", count), 5000);
0199         }
0200     }
0201 
0202 public Q_SLOTS:
0203 
0204     void newWindow(const QString &url = QString()) {
0205         MainWindow *mw = new MainWindow(url);
0206         mw->show();
0207     }
0208 
0209 private:
0210 
0211     QVector<int> zoomLevels;
0212     int currentZoom;
0213 
0214     // create the status bar, tool bar & menu
0215     void setupUI() {
0216         progress = new QProgressBar(this);
0217         progress->setRange(0, 100);
0218         progress->setMinimumSize(100, 20);
0219         progress->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
0220         progress->hide();
0221         statusBar()->addPermanentWidget(progress);
0222 
0223         connect(view, SIGNAL(loadProgress(int)), progress, SLOT(show()));
0224         connect(view, SIGNAL(loadProgress(int)), progress, SLOT(setValue(int)));
0225         connect(view, SIGNAL(loadFinished(bool)), progress, SLOT(hide()));
0226 
0227         urlEdit = new KLineEdit(this);
0228         urlEdit->setSizePolicy(QSizePolicy::Expanding, urlEdit->sizePolicy().verticalPolicy());
0229         connect(urlEdit, SIGNAL(returnPressed()),
0230                 SLOT(changeLocation()));
0231         QCompleter *completer = new QCompleter(this);
0232         urlEdit->setCompleter(completer);
0233         completer->setModel(&urlModel);
0234 
0235         QToolBar *bar = addToolBar("Navigation");
0236         bar->addAction(view->pageAction(QWebPage::Back));
0237         bar->addAction(view->pageAction(QWebPage::Forward));
0238         bar->addAction(view->pageAction(QWebPage::Reload));
0239         bar->addAction(view->pageAction(QWebPage::Stop));
0240         bar->addWidget(urlEdit);
0241 
0242         QMenu *fileMenu = menuBar()->addMenu(i18n("&File"));
0243         QAction *newWindow = fileMenu->addAction(i18n("New Window"), this, SLOT(newWindow()));
0244 
0245         fileMenu->addAction(i18n("Print"), this, SLOT(print()));
0246         fileMenu->addAction(i18n("Close"), this, SLOT(close()));
0247 
0248         QMenu *editMenu = menuBar()->addMenu(i18n("&Edit"));
0249         editMenu->addAction(view->pageAction(QWebPage::Undo));
0250         editMenu->addAction(view->pageAction(QWebPage::Redo));
0251         editMenu->addSeparator();
0252         editMenu->addAction(view->pageAction(QWebPage::Cut));
0253         editMenu->addAction(view->pageAction(QWebPage::Copy));
0254         editMenu->addAction(view->pageAction(QWebPage::Paste));
0255         editMenu->addSeparator();
0256         QAction *setEditable = editMenu->addAction(i18n("Set Editable"), this, SLOT(setEditable(bool)));
0257         setEditable->setCheckable(true);
0258 
0259         QMenu *viewMenu = menuBar()->addMenu(i18n("&View"));
0260         viewMenu->addAction(view->pageAction(QWebPage::Stop));
0261         viewMenu->addAction(view->pageAction(QWebPage::Reload));
0262         viewMenu->addSeparator();
0263         QAction *zoomIn = viewMenu->addAction(i18n("Zoom &In"), this, SLOT(zoomIn()));
0264         QAction *zoomOut = viewMenu->addAction(i18n("Zoom &Out"), this, SLOT(zoomOut()));
0265         QAction *resetZoom = viewMenu->addAction(i18n("Reset Zoom"), this, SLOT(resetZoom()));
0266         QAction *zoomTextOnly = viewMenu->addAction(i18n("Zoom Text Only"), this, SLOT(toggleZoomTextOnly(bool)));
0267         zoomTextOnly->setCheckable(true);
0268         zoomTextOnly->setChecked(false);
0269         viewMenu->addSeparator();
0270         viewMenu->addAction(i18n("Dump HTML"), this, SLOT(dumpHtml()));
0271 
0272         QMenu *formatMenu = new QMenu(i18n("F&ormat"));
0273         formatMenuAction = menuBar()->addMenu(formatMenu);
0274         formatMenuAction->setVisible(false);
0275         formatMenu->addAction(view->pageAction(QWebPage::ToggleBold));
0276         formatMenu->addAction(view->pageAction(QWebPage::ToggleItalic));
0277         formatMenu->addAction(view->pageAction(QWebPage::ToggleUnderline));
0278         QMenu *writingMenu = formatMenu->addMenu(i18n("Writing Direction"));
0279         writingMenu->addAction(view->pageAction(QWebPage::SetTextDirectionDefault));
0280         writingMenu->addAction(view->pageAction(QWebPage::SetTextDirectionLeftToRight));
0281         writingMenu->addAction(view->pageAction(QWebPage::SetTextDirectionRightToLeft));
0282 
0283         newWindow->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));
0284         view->pageAction(QWebPage::Back)->setShortcut(QKeySequence::Back);
0285         view->pageAction(QWebPage::Stop)->setShortcut(Qt::Key_Escape);
0286         view->pageAction(QWebPage::Forward)->setShortcut(QKeySequence::Forward);
0287         view->pageAction(QWebPage::Reload)->setShortcut(QKeySequence::Refresh);
0288         view->pageAction(QWebPage::Undo)->setShortcut(QKeySequence::Undo);
0289         view->pageAction(QWebPage::Redo)->setShortcut(QKeySequence::Redo);
0290         view->pageAction(QWebPage::Cut)->setShortcut(QKeySequence::Cut);
0291         view->pageAction(QWebPage::Copy)->setShortcut(QKeySequence::Copy);
0292         view->pageAction(QWebPage::Paste)->setShortcut(QKeySequence::Paste);
0293         zoomIn->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Plus));
0294         zoomOut->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Minus));
0295         resetZoom->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
0296         view->pageAction(QWebPage::ToggleBold)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_B));
0297         view->pageAction(QWebPage::ToggleItalic)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_I));
0298         view->pageAction(QWebPage::ToggleUnderline)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_U));
0299 
0300         QMenu *toolsMenu = menuBar()->addMenu(i18n("&Tools"));
0301         toolsMenu->addAction(i18n("Select elements..."), this, SLOT(selectElements()));
0302 
0303     }
0304 
0305     QWebView *view;
0306     KLineEdit *urlEdit;
0307     QProgressBar *progress;
0308 
0309     QAction *formatMenuAction;
0310 
0311     QStringList urlList;
0312     QStringListModel urlModel;
0313 };
0314 
0315 class URLLoader : public QObject
0316 {
0317     Q_OBJECT
0318 public:
0319     URLLoader(QWebView* view, const QString& inputFileName)
0320         : m_view(view)
0321         , m_stdOut(stdout)
0322     {
0323         init(inputFileName);
0324     }
0325 
0326 public Q_SLOTS:
0327     void loadNext()
0328     {
0329         QString qstr;
0330         if (getUrl(qstr)) {
0331             QUrl url(qstr, QUrl::StrictMode);
0332             if (url.isValid()) {
0333                 m_stdOut << "Loading " << qstr << " ......" << endl;
0334                 m_view->load(url);
0335             } else
0336                 loadNext();
0337         } else
0338             disconnect(m_view, nullptr, this, nullptr);
0339     }
0340 
0341 private:
0342     void init(const QString& inputFileName)
0343     {
0344         QFile inputFile(inputFileName);
0345         if (inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
0346             QTextStream stream(&inputFile);
0347             QString line;
0348             while (true) {
0349                 line = stream.readLine();
0350                 if (line.isNull())
0351                     break;
0352                 m_urls.append(line);
0353             }
0354         } else {
0355             qCDebug(KWEBKITPART_DEMO_LOG) << "Can't open list file";
0356             exit(0);
0357         }
0358         m_index = 0;
0359         inputFile.close();
0360     }
0361 
0362     bool getUrl(QString& qstr)
0363     {
0364         if (m_index == m_urls.size())
0365             return false;
0366 
0367         qstr = m_urls[m_index++];
0368         return true;
0369     }
0370 
0371 private:
0372     QVector<QString> m_urls;
0373     int m_index;
0374     QWebView* m_view;
0375     QTextStream m_stdOut;
0376 };
0377 
0378 
0379 int main(int argc, char **argv)
0380 {
0381     KAboutData about("KDELauncher", i18n("KDELauncher"), "0.0000013");
0382     QApplication app(argc, argv);
0383     QCommandLineParser parser;
0384     KAboutData::setApplicationData(about);
0385     parser.addVersionOption();
0386     parser.addHelpOption();
0387     //PORTING SCRIPT: adapt aboutdata variable if necessary
0388     about.setupCommandLine(&parser);
0389     parser.process(app);
0390     about.processCommandLine(&parser);
0391 
0392     QString url = QString("%1/%2").arg(QDir::homePath()).arg(QLatin1String("index.html"));
0393 
0394     QWebSettings::setMaximumPagesInCache(4);
0395 
0396     QWebSettings::setObjectCacheCapacities((16*1024*1024) / 8, (16*1024*1024) / 8, 16*1024*1024);
0397 
0398     QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
0399     QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
0400 
0401     const QStringList args = app.arguments();
0402 
0403     if (args.contains(QLatin1String("-r"))) {
0404         // robotized
0405         QString listFile = args.at(2);
0406         if (!(args.count() == 3) && QFile::exists(listFile)) {
0407             qCDebug(KWEBKITPART_DEMO_LOG) << "Usage: KDELauncher -r listfile";
0408             exit(0);
0409         }
0410         MainWindow window;
0411         QWebView *view = window.webView();
0412         URLLoader loader(view, listFile);
0413         QObject::connect(view, SIGNAL(loadFinished(bool)), &loader, SLOT(loadNext()));
0414         loader.loadNext();
0415         window.show();
0416         return app.exec();
0417     } else {
0418         if (args.count() > 1)
0419             url = args.at(1);
0420 
0421         MainWindow window(url);
0422 
0423         // Opens every given urls in new windows
0424         for (int i = 2; i < args.count(); i++)
0425             window.newWindow(args.at(i));
0426 
0427         window.show();
0428         return app.exec();
0429     }
0430 }
0431 
0432 #include "main.moc"