diff --git a/autotests/shelltest.cpp b/autotests/shelltest.cpp index 054532964..888227d6e 100644 --- a/autotests/shelltest.cpp +++ b/autotests/shelltest.cpp @@ -23,6 +23,16 @@ static const QUrl makeUrlFromCwd( const QString& u, const QString& ref = QString return url; } +static bool fileExist_always_Func( const QString& ) +{ + return true; +} + +static bool fileExist_never_Func( const QString& ) +{ + return false; +} + class ShellTest : public QObject { @@ -42,28 +52,39 @@ void ShellTest::initTestCase() void ShellTest::testUrlArgs_data() { QTest::addColumn( "arg" ); + QTest::addColumn( "exists" ); QTest::addColumn( "resUrl" ); // local files QTest::newRow( "foo.pdf, exist" ) << "foo.pdf" + << true << makeUrlFromCwd( QStringLiteral("foo.pdf") ); QTest::newRow( "foo.pdf, !exist" ) << "foo.pdf" + << false << makeUrlFromCwd( QStringLiteral("foo.pdf") ); - QTest::newRow( "foo#bar.pdf, !exist" ) + QTest::newRow( "foo#bar.pdf, exist" ) << "foo#bar.pdf" + << true << makeUrlFromCwd( QStringLiteral("foo#bar.pdf") ); + QTest::newRow( "foo#bar.pdf, !exist" ) + << "foo#bar.pdf" + << false + << makeUrlFromCwd( QStringLiteral("foo"), QStringLiteral("bar.pdf") ); QTest::newRow( "foo.pdf#anchor, !exist" ) << "foo.pdf#anchor" + << false << makeUrlFromCwd( QStringLiteral("foo.pdf"), QStringLiteral("anchor") ); QTest::newRow( "#207461" ) << "file:///tmp/file%20with%20spaces.pdf" + << true << QUrl( QStringLiteral("file:///tmp/file%20with%20spaces.pdf") ); // non-local files QTest::newRow( "http://kde.org/foo.pdf" ) << "http://kde.org/foo.pdf" + << true << QUrl( QStringLiteral("http://kde.org/foo.pdf") ); // make sure we don't have a fragment QUrl hashInName( QStringLiteral("http://kde.org") ); @@ -72,28 +93,33 @@ void ShellTest::testUrlArgs_data() QVERIFY( hashInName.fragment().isEmpty() ); QTest::newRow( "http://kde.org/foo#bar.pdf" ) << "http://kde.org/foo#bar.pdf" + << true << hashInName; QUrl withAnchor( QStringLiteral("http://kde.org/foo.pdf") ); withAnchor.setFragment( QStringLiteral("anchor") ); QTest::newRow( "http://kde.org/foo.pdf#anchor" ) << "http://kde.org/foo.pdf#anchor" + << true << withAnchor; QTest::newRow( "#207461" ) << "http://homepages.inf.ed.ac.uk/mef/file%20with%20spaces.pdf" + << true << QUrl( QStringLiteral("http://homepages.inf.ed.ac.uk/mef/file%20with%20spaces.pdf") ); QUrl openOnPage3 = QUrl( QStringLiteral("http://itzsimpl.info/lectures/CG/L2-transformations.pdf") ); openOnPage3.setFragment( QStringLiteral("3") ); QTest::newRow( "RR124738" ) << "http://itzsimpl.info/lectures/CG/L2-transformations.pdf#3" + << true << openOnPage3; } void ShellTest::testUrlArgs() { QFETCH( QString, arg ); + QFETCH( bool, exists ); QFETCH( QUrl, resUrl ); qDebug() << "Expected url:" << resUrl << "path =" << resUrl.path() << "fragment =" << resUrl.fragment(); - QUrl url = ShellUtils::urlFromArg( arg ); + QUrl url = ShellUtils::urlFromArg( arg, exists ? fileExist_always_Func : fileExist_never_Func ); QCOMPARE( url, resUrl ); } diff --git a/shell/okular_main.cpp b/shell/okular_main.cpp index b4de3d447..2285f64a9 100644 --- a/shell/okular_main.cpp +++ b/shell/okular_main.cpp @@ -33,7 +33,7 @@ static bool attachUniqueInstance(const QStringList &paths, const QString &serial return false; const QString page = ShellUtils::page(serializedOptions); - iface.call(QStringLiteral("openDocument"), ShellUtils::urlFromArg(paths[0], page).url(), serializedOptions); + iface.call(QStringLiteral("openDocument"), ShellUtils::urlFromArg(paths[0], ShellUtils::qfileExistFunc(), page).url(), serializedOptions); if (!ShellUtils::noRaise(serializedOptions)) { iface.call(QStringLiteral("tryRaise")); } @@ -103,7 +103,7 @@ static bool attachExistingInstance(const QStringList &paths, const QString &seri { // Page only makes sense if we are opening one file const QString page = ShellUtils::page(serializedOptions); - path = ShellUtils::urlFromArg(arg, page).url(); + path = ShellUtils::urlFromArg(arg, ShellUtils::qfileExistFunc(), page).url(); } // Returns false if it can't fit another document @@ -166,7 +166,7 @@ Status main(const QStringList &paths, const QString &serializedOptions) { // Page only makes sense if we are opening one file const QString page = ShellUtils::page(serializedOptions); - const QUrl url = ShellUtils::urlFromArg(paths[i], page); + const QUrl url = ShellUtils::urlFromArg(paths[i], ShellUtils::qfileExistFunc(), page); if ( shell->openDocument( url, serializedOptions) ) { ++i; diff --git a/shell/shellutils.cpp b/shell/shellutils.cpp index 11fe7d1a9..1b280199f 100644 --- a/shell/shellutils.cpp +++ b/shell/shellutils.cpp @@ -20,7 +20,22 @@ namespace ShellUtils { -QUrl urlFromArg( const QString& _arg, const QString& pageArg ) +namespace detail +{ + +bool qfileExistFunc( const QString& fileName ) +{ + return QFile::exists( fileName ); +} + +} + +FileExistFunc qfileExistFunc() +{ + return detail::qfileExistFunc; +} + +QUrl urlFromArg( const QString& _arg, FileExistFunc exist_func, const QString& pageArg ) { #if QT_VERSION >= 0x050400 QUrl url = QUrl::fromUserInput(_arg, QDir::currentPath(), QUrl::AssumeLocalFile); @@ -39,12 +54,9 @@ QUrl urlFromArg( const QString& _arg, const QString& pageArg ) // but something like /tmp/foo.pdf#bar is foo.pdf plus an anchor "bar" const QString path = url.path(); int hashIndex = path.lastIndexOf( QLatin1Char ( '#' ) ); - int lastDotIndex = path.lastIndexOf( QLatin1Char ( '.' ) ); - // make sure that we don't change the path if .pdf comes after the # - if ( hashIndex != -1 && hashIndex > lastDotIndex) { + if ( hashIndex != -1 && !exist_func(path) ) { url.setPath( path.left( hashIndex ) ); url.setFragment( path.mid( hashIndex + 1 ) ); - qDebug() << "Added fragment to url:" << url.path() << url.fragment(); } } else if ( !url.fragment().isEmpty() ) { // make sure something like http://example.org/foo#bar.pdf is treated as a path name diff --git a/shell/shellutils.h b/shell/shellutils.h index 16370e758..ab874d5cb 100644 --- a/shell/shellutils.h +++ b/shell/shellutils.h @@ -19,7 +19,10 @@ class QCommandLineParser; namespace ShellUtils { -QUrl urlFromArg(const QString& _arg, const QString& pageArg = QString() ); +typedef bool (*FileExistFunc)( const QString& fileName ); + +FileExistFunc qfileExistFunc(); +QUrl urlFromArg(const QString& _arg, FileExistFunc exist_func, const QString& pageArg = QString() ); QString serializeOptions(const QCommandLineParser &args); QString serializeOptions(bool startInPresentation, bool showPrintDialog, bool unique, bool noRaise, const QString &page); bool unserializeOptions(const QString &serializedOptions, bool *presentation, bool *print, bool *unique, bool *noraise, QString *page);