File indexing completed on 2024-05-12 05:38:18

0001 /*
0002     SPDX-FileCopyrightText: 2007 Glenn Ergeerts <glenn.ergeerts@telenet.be>
0003     SPDX-FileCopyrightText: 2012 Marco Gulino <marco.gulino@xpeppers.com>
0004     SPDX-FileCopyrightText: 2023 Harald Sitter <sitter@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "bookmarksrunner.h"
0010 #include "browsers/browser.h"
0011 
0012 #include <QDebug>
0013 #include <QDir>
0014 #include <QList>
0015 #include <QStack>
0016 #include <QUrl>
0017 
0018 #include <KApplicationTrader>
0019 #include <KConfigGroup>
0020 #include <KIO/OpenUrlJob>
0021 #include <KLocalizedString>
0022 #include <KSharedConfig>
0023 
0024 #include <defaultservice.h>
0025 
0026 #include "bookmarkmatch.h"
0027 #include "bookmarksrunner_defs.h"
0028 #include "browserfactory.h"
0029 
0030 K_PLUGIN_CLASS_WITH_JSON(BookmarksRunner, "plasma-runner-bookmarks.json")
0031 
0032 BookmarksRunner::BookmarksRunner(QObject *parent, const KPluginMetaData &metaData)
0033     : KRunner::AbstractRunner(parent, metaData)
0034     , m_browser(nullptr)
0035     , m_browserFactory(new BrowserFactory(this))
0036 {
0037     addSyntax(QStringLiteral(":q:"), i18n("Finds web browser bookmarks matching :q:."));
0038     addSyntax(i18nc("list of all web browser bookmarks", "bookmarks"), i18n("List all web browser bookmarks"));
0039 
0040     connect(this, &KRunner::AbstractRunner::prepare, this, &BookmarksRunner::prep);
0041     setMinLetterCount(3);
0042 }
0043 
0044 void BookmarksRunner::prep()
0045 {
0046     auto browser = m_browserFactory->find(findBrowserName(), this);
0047     if (m_browser != browser) {
0048         m_browser = browser;
0049         connect(this, &KRunner::AbstractRunner::teardown, dynamic_cast<QObject *>(m_browser), [this]() {
0050             m_browser->teardown();
0051         });
0052     }
0053     m_browser->prepare();
0054 }
0055 
0056 void BookmarksRunner::match(KRunner::RunnerContext &context)
0057 {
0058     const QString term = context.query();
0059     bool allBookmarks = term.compare(i18nc("list of all konqueror bookmarks", "bookmarks"), Qt::CaseInsensitive) == 0;
0060 
0061     const QList<BookmarkMatch> matches = m_browser->match(term, allBookmarks);
0062     for (BookmarkMatch match : matches) {
0063         if (!context.isValid())
0064             return;
0065         context.addMatch(match.asQueryMatch(this));
0066     }
0067 }
0068 
0069 QString BookmarksRunner::findBrowserName()
0070 {
0071     const auto service = DefaultService::browser();
0072     return service ? service->exec() : DefaultService::legacyBrowserExec();
0073 }
0074 
0075 void BookmarksRunner::run(const KRunner::RunnerContext & /*context*/, const KRunner::QueryMatch &action)
0076 {
0077     const QString term = action.data().toString();
0078     QUrl url = QUrl(term);
0079 
0080     // support urls like "kde.org" by transforming them to https://kde.org
0081     if (url.scheme().isEmpty()) {
0082         const int idx = term.indexOf('/');
0083 
0084         url.clear();
0085         url.setHost(term.left(idx));
0086         if (idx != -1) {
0087             // allow queries
0088             const int queryStart = term.indexOf('?', idx);
0089             int pathLength = -1;
0090             if ((queryStart > -1) && (idx < queryStart)) {
0091                 pathLength = queryStart - idx;
0092                 url.setQuery(term.mid(queryStart));
0093             }
0094 
0095             url.setPath(term.mid(idx, pathLength));
0096         }
0097         url.setScheme(QStringLiteral("http"));
0098     }
0099 
0100     auto job = new KIO::OpenUrlJob(url);
0101     job->start();
0102 }
0103 
0104 #include "bookmarksrunner.moc"