From 2b844b37bbb12c1588b1ee3eae6ee6553c6fef91 Mon Sep 17 00:00:00 2001 From: kh1 Date: Tue, 8 Jan 2013 12:46:12 +0100 Subject: [PATCH] Revert most of 227a60a427f83931ca8bdaec7509a673738f053b. The help engines findFile() does already resolve virtual folders in different namespaces, so the added code was superfluous. It did not even work properly... Implement a redirect network reply, so when a file from e.g. qtwidget is linked into qtcore, we will get the valid url set inside the address bar. This also fixes "Bookmark" handling, "Sync to Contents" as well as "Copy" and "Hover" actions. Change-Id: I418af5962d9f1d9970febb07f8f1c52e9995c58c Reviewed-by: Friedemann Kleint Reviewed-by: Christian Kandeler --- src/assistant/assistant/centralwidget.cpp | 15 ++++++-- src/assistant/assistant/centralwidget.h | 2 ++ src/assistant/assistant/helpenginewrapper.cpp | 6 ---- src/assistant/assistant/helpenginewrapper.h | 1 - src/assistant/assistant/helpviewer.cpp | 27 +-------------- src/assistant/assistant/helpviewer.h | 1 - src/assistant/assistant/helpviewer_qtb.cpp | 18 ++++------ src/assistant/assistant/helpviewer_qwv.cpp | 49 ++++++++++++++++++++------- src/assistant/help/qhelpcontentwidget.cpp | 5 +-- src/assistant/help/qhelpengine_p.h | 1 - src/assistant/help/qhelpenginecore.cpp | 2 -- 11 files changed, 61 insertions(+), 66 deletions(-) diff --git a/src/assistant/assistant/centralwidget.cpp b/src/assistant/assistant/centralwidget.cpp index 8df808f..e973739 100644 --- a/src/assistant/assistant/centralwidget.cpp +++ b/src/assistant/assistant/centralwidget.cpp @@ -339,6 +339,7 @@ void CentralWidget::connectTabBar() } // -- public slots + #ifndef QT_NO_CLIPBOARD void CentralWidget::copy() { @@ -587,6 +588,17 @@ void CentralWidget::handleSourceChanged(const QUrl &url) emit sourceChanged(url); } +void CentralWidget::slotHighlighted(const QString &link) +{ + TRACE_OBJ + QString resolvedLink = m_resolvedLinks.value(link); + if (!link.isEmpty() && resolvedLink.isEmpty()) { + resolvedLink = HelpEngineWrapper::instance().findFile(link).toString(); + m_resolvedLinks.insert(link, resolvedLink); + } + emit highlighted(resolvedLink); +} + // -- private void CentralWidget::initPrinter() @@ -609,9 +621,8 @@ void CentralWidget::connectSignals(HelpViewer *page) SIGNAL(backwardAvailable(bool))); connect(page, SIGNAL(sourceChanged(QUrl)), this, SLOT(handleSourceChanged(QUrl))); - connect(page, SIGNAL(highlighted(QString)), this, - SIGNAL(highlighted(QString))); connect(page, SIGNAL(printRequested()), this, SLOT(print())); + connect(page, SIGNAL(highlighted(QString)), this, SLOT(slotHighlighted(QString))); } bool CentralWidget::eventFilter(QObject *object, QEvent *e) diff --git a/src/assistant/assistant/centralwidget.h b/src/assistant/assistant/centralwidget.h index 2c6c4ee..4ff66a0 100644 --- a/src/assistant/assistant/centralwidget.h +++ b/src/assistant/assistant/centralwidget.h @@ -155,6 +155,7 @@ private slots: void highlightSearchTerms(); void printPreview(QPrinter *printer); void handleSourceChanged(const QUrl &url); + void slotHighlighted(const QString &link); private: void initPrinter(); @@ -168,6 +169,7 @@ private: FindWidget *m_findWidget; QStackedWidget *m_stackedWidget; TabBar *m_tabBar; + QHash m_resolvedLinks; }; QT_END_NAMESPACE diff --git a/src/assistant/assistant/helpenginewrapper.cpp b/src/assistant/assistant/helpenginewrapper.cpp index e5e8441..1fcaecc 100644 --- a/src/assistant/assistant/helpenginewrapper.cpp +++ b/src/assistant/assistant/helpenginewrapper.cpp @@ -337,12 +337,6 @@ QString HelpEngineWrapper::error() const return d->m_helpEngine->error(); } -QString HelpEngineWrapper::virtualFolderForNameSpace(const QString &nameSpace) const -{ - TRACE_OBJ - return d->m_helpEngine->d->nameSpaceVirtualFolderMap.value(nameSpace, QString()); -} - const QStringList HelpEngineWrapper::qtDocInfo(const QString &component) const { TRACE_OBJ diff --git a/src/assistant/assistant/helpenginewrapper.h b/src/assistant/assistant/helpenginewrapper.h index d352bd6..33ebf95 100644 --- a/src/assistant/assistant/helpenginewrapper.h +++ b/src/assistant/assistant/helpenginewrapper.h @@ -100,7 +100,6 @@ public: const QStringList filterAttributes() const; const QStringList filterAttributes(const QString &filterName) const; QString error() const; - QString virtualFolderForNameSpace(const QString &nameSpace) const; /* * To be called after assistant has finished looking for new documentation. diff --git a/src/assistant/assistant/helpviewer.cpp b/src/assistant/assistant/helpviewer.cpp index 314a765..17084e6 100644 --- a/src/assistant/assistant/helpviewer.cpp +++ b/src/assistant/assistant/helpviewer.cpp @@ -143,7 +143,7 @@ QString HelpViewer::mimeFromUrl(const QUrl &url) return QLatin1String(e->mimeType); ++e; } - return QLatin1String(""); + return QLatin1String("application/octet-stream"); } bool HelpViewer::launchWithExternalApp(const QUrl &url) @@ -177,31 +177,6 @@ bool HelpViewer::launchWithExternalApp(const QUrl &url) return false; } -QString HelpViewer::fixupVirtualFolderForUrl(const HelpEngineWrapper *engine, const QUrl &url, bool *fixed) -{ - TRACE_OBJ - Q_ASSERT(engine); - - QString ret = url.toString(); - const QString virtualFolder = engine->virtualFolderForNameSpace(url.host()); - QString effectiveVirtualFolder = virtualFolder; - const QStringList tokens = url.path().split('/'); - Q_FOREACH (const QString& token, tokens) { - if (!token.isEmpty()) { - effectiveVirtualFolder = token; - break; - } - } - - if (QString::localeAwareCompare(effectiveVirtualFolder, virtualFolder)) { - ret = url.scheme() + QLatin1String("://") + url.host() + QLatin1Char('/') - + virtualFolder + QLatin1String("/..") + url.path(); - } - if (fixed && engine->findFile(ret).isValid()) - *fixed = true; - return ret; -} - // -- public slots void HelpViewer::home() diff --git a/src/assistant/assistant/helpviewer.h b/src/assistant/assistant/helpviewer.h index e614858..a7c3893 100644 --- a/src/assistant/assistant/helpviewer.h +++ b/src/assistant/assistant/helpviewer.h @@ -110,7 +110,6 @@ public: static bool canOpenPage(const QString &url); static QString mimeFromUrl(const QUrl &url); static bool launchWithExternalApp(const QUrl &url); - static QString fixupVirtualFolderForUrl(const HelpEngineWrapper *engine, const QUrl &url, bool *fixed = 0); public slots: #ifndef QT_NO_CLIPBOARD diff --git a/src/assistant/assistant/helpviewer_qtb.cpp b/src/assistant/assistant/helpviewer_qtb.cpp index 146a55b..debcf67 100644 --- a/src/assistant/assistant/helpviewer_qtb.cpp +++ b/src/assistant/assistant/helpviewer_qtb.cpp @@ -163,18 +163,14 @@ void HelpViewer::setSource(const QUrl &url) return; emit loadStarted(); - QString string = url.toString(); - const HelpEngineWrapper &engine = HelpEngineWrapper::instance(); - QUrl resolvedUrl = (string == QLatin1String("help") ? LocalHelpFile : - engine.findFile(string)); - bool fileFound = resolvedUrl.isValid(); - if (!fileFound && isLocalUrl(url)) - resolvedUrl = fixupVirtualFolderForUrl(&engine, url, &fileFound); + bool helpOrAbout = (url.toString() == QLatin1String("help")); + const QUrl resolvedUrl = (helpOrAbout ? LocalHelpFile : HelpEngineWrapper::instance().findFile(url)); QTextBrowser::setSource(resolvedUrl); - if (!fileFound) { - setHtml(string == QLatin1String("about:blank") ? AboutBlank - : PageNotFoundMessage.arg(url.toString())); + + if (!resolvedUrl.isValid()) { + helpOrAbout = (url.toString() == QLatin1String("about:blank")); + setHtml(helpOrAbout ? AboutBlank : PageNotFoundMessage.arg(url.toString())); } emit loadFinished(true); } @@ -382,7 +378,7 @@ QVariant HelpViewer::loadResource(int type, const QUrl &name) TRACE_OBJ QByteArray ba; if (type < 4) { - QUrl url = fixupVirtualFolderForUrl(&HelpEngineWrapper::instance(), name); + const QUrl url = HelpEngineWrapper::instance().findFile(name); ba = HelpEngineWrapper::instance().fileData(url); if (url.toString().endsWith(QLatin1String(".svg"), Qt::CaseInsensitive)) { QImage image; diff --git a/src/assistant/assistant/helpviewer_qwv.cpp b/src/assistant/assistant/helpviewer_qwv.cpp index 81fb828..57cfa40 100644 --- a/src/assistant/assistant/helpviewer_qwv.cpp +++ b/src/assistant/assistant/helpviewer_qwv.cpp @@ -47,6 +47,7 @@ #include "openpagesmanager.h" #include "tracer.h" +#include #include #include #include @@ -133,6 +134,25 @@ qint64 HelpNetworkReply::readData(char *buffer, qint64 maxlen) return len; } +// -- HelpRedirectNetworkReply + +class HelpRedirectNetworkReply : public QNetworkReply +{ +public: + HelpRedirectNetworkReply(const QNetworkRequest &request, const QUrl &newUrl) + { + setRequest(request); + setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 301); + setAttribute(QNetworkRequest::RedirectionTargetAttribute, newUrl); + + QTimer::singleShot(0, this, SIGNAL(finished())); + } + +protected: + void abort() { TRACE_OBJ } + qint64 readData(char*, qint64) { TRACE_OBJ return qint64(-1); } +}; + // -- HelpNetworkAccessManager class HelpNetworkAccessManager : public QNetworkAccessManager @@ -151,24 +171,21 @@ HelpNetworkAccessManager::HelpNetworkAccessManager(QObject *parent) TRACE_OBJ } -QNetworkReply *HelpNetworkAccessManager::createRequest(Operation /*op*/, - const QNetworkRequest &request, QIODevice* /*outgoingData*/) +QNetworkReply *HelpNetworkAccessManager::createRequest(Operation, const QNetworkRequest &request, QIODevice*) { TRACE_OBJ - QString url = request.url().toString(); - const HelpEngineWrapper &engine = HelpEngineWrapper::instance(); - bool fileFound = engine.findFile(url).isValid(); - if (!fileFound && HelpViewer::isLocalUrl(request.url())) - url = HelpViewer::fixupVirtualFolderForUrl(&engine, request.url(), &fileFound); + const QUrl url = engine.findFile(request.url()); + if (url.isValid() && (url != request.url())) + return new HelpRedirectNetworkReply(request, url); - const QString &mimeType = HelpViewer::mimeFromUrl(url); - const QByteArray &data = fileFound ? engine.fileData(url) : QString::fromLatin1(g_htmlPage) - .arg(g_percent1, g_percent2, HelpViewer::tr("Error loading: %1").arg(url), g_percent4).toUtf8(); + if (url.isValid()) + return new HelpNetworkReply(request, engine.fileData(url), HelpViewer::mimeFromUrl(url)); - return new HelpNetworkReply(request, data, mimeType.isEmpty() - ? QLatin1String("application/octet-stream") : mimeType); + return new HelpNetworkReply(request, QString::fromLatin1(g_htmlPage).arg(g_percent1, g_percent2, + HelpViewer::tr("Error loading: %1").arg(request.url().toString()), g_percent4).toUtf8(), + QLatin1String("text/html")); } // -- HelpPage @@ -223,6 +240,13 @@ void HelpPage::triggerAction(WebAction action, bool checked) QWebPage::triggerAction(action, checked); break; } + +#ifndef QT_NO_CLIPBOARD + if (action == CopyLinkToClipboard || action == CopyImageUrlToClipboard) { + const QString link = QApplication::clipboard()->text(); + QApplication::clipboard()->setText(HelpEngineWrapper::instance().findFile(link).toString()); + } +#endif } bool HelpPage::acceptNavigationRequest(QWebFrame *, @@ -403,6 +427,7 @@ bool HelpViewer::findText(const QString &text, FindFlags flags, bool incremental } // -- public slots + #ifndef QT_NO_CLIPBOARD void HelpViewer::copy() { diff --git a/src/assistant/help/qhelpcontentwidget.cpp b/src/assistant/help/qhelpcontentwidget.cpp index e25dd03..6697ba6 100644 --- a/src/assistant/help/qhelpcontentwidget.cpp +++ b/src/assistant/help/qhelpcontentwidget.cpp @@ -541,11 +541,8 @@ QModelIndex QHelpContentWidget::indexOf(const QUrl &link) contentModel->contentItemAt(contentModel->index(i, 0)); if (itm && itm->url().host() == link.host()) { QString path = link.path(); - if (path.startsWith(QLatin1Char('/'))) - path = path.mid(1); - if (searchContentItem(contentModel, contentModel->index(i, 0), path)) { + if (searchContentItem(contentModel, contentModel->index(i, 0), link.path())) return m_syncIndex; - } } } return QModelIndex(); diff --git a/src/assistant/help/qhelpengine_p.h b/src/assistant/help/qhelpengine_p.h index a24b517..19df280 100644 --- a/src/assistant/help/qhelpengine_p.h +++ b/src/assistant/help/qhelpengine_p.h @@ -89,7 +89,6 @@ public: QMap fileNameReaderMap; QMultiMap virtualFolderMap; QStringList orderedFileNameList; - QHash nameSpaceVirtualFolderMap; QHelpCollectionHandler *collectionHandler; QString currentFilter; diff --git a/src/assistant/help/qhelpenginecore.cpp b/src/assistant/help/qhelpenginecore.cpp index 4f05b2e..8695cb3 100644 --- a/src/assistant/help/qhelpenginecore.cpp +++ b/src/assistant/help/qhelpenginecore.cpp @@ -88,7 +88,6 @@ void QHelpEngineCorePrivate::clearMaps() fileNameReaderMap.clear(); virtualFolderMap.clear(); orderedFileNameList.clear(); - nameSpaceVirtualFolderMap.clear(); } bool QHelpEngineCorePrivate::setup() @@ -129,7 +128,6 @@ bool QHelpEngineCorePrivate::setup() fileNameReaderMap.insert(absFileName, reader); virtualFolderMap.insert(info.folderName, reader); orderedFileNameList.append(absFileName); - nameSpaceVirtualFolderMap.insert(info.namespaceName, info.folderName); } q->currentFilter(); emit q->setupFinished(); -- 2.7.4