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"