diff --git a/src/lib/navigation/websearchbar.cpp b/src/lib/navigation/websearchbar.cpp index 72961326e..4fc92e11a 100644 --- a/src/lib/navigation/websearchbar.cpp +++ b/src/lib/navigation/websearchbar.cpp @@ -29,6 +29,7 @@ #include "searchenginesdialog.h" #include "networkmanager.h" #include "iconprovider.h" +#include "scripts.h" #include #include @@ -106,9 +107,26 @@ void WebSearchBar::aboutToShowMenu() QMenu* menu = m_boxSearchType->menu(); menu->addSeparator(); - completeMenuWithAvailableEngines(menu); - menu->addSeparator(); - menu->addAction(IconProvider::settingsIcon(), tr("Manage Search Engines"), this, SLOT(openSearchEnginesDialog())); + + m_window->weView()->page()->runJavaScript(Scripts::getOpenSearchLinks(), [this, menu](const QVariant &res) { + const QVariantList &list = res.toList(); + Q_FOREACH (const QVariant &val, list) { + const QVariantMap &link = val.toMap(); + QUrl url = m_window->weView()->url().resolved(link.value(QSL("url")).toUrl()); + QString title = link.value(QSL("title")).toString(); + + if (url.isEmpty()) + continue; + + if (title.isEmpty()) + title = m_window->weView()->title(); + + menu->addAction(m_window->weView()->icon(), tr("Add %1 ...").arg(title), this, SLOT(addEngineFromAction()))->setData(url); + } + + menu->addSeparator(); + menu->addAction(IconProvider::settingsIcon(), tr("Manage Search Engines"), this, SLOT(openSearchEnginesDialog())); + }); } void WebSearchBar::addSuggestions(const QStringList &list) @@ -214,33 +232,6 @@ void WebSearchBar::searchInNewTab() m_window->weView(index)->load(m_searchManager->searchResult(m_activeEngine, text())); } -void WebSearchBar::completeMenuWithAvailableEngines(QMenu* menu) -{ - Q_UNUSED(menu) -#if QTWEBENGINE_DISABLED - WebView* view = m_window->weView(); - QWebEngineFrame* frame = view->page()->mainFrame(); - - QWebElementCollection elements = frame->documentElement().findAll(QLatin1String("link[rel=search]")); - foreach (const QWebElement &element, elements) { - if (element.attribute("type") != QLatin1String("application/opensearchdescription+xml")) { - continue; - } - QUrl url = view->url().resolved(QUrl::fromEncoded(element.attribute("href").toUtf8())); - QString title = element.attribute("title"); - - if (url.isEmpty()) { - continue; - } - if (title.isEmpty()) { - title = view->title(); - } - - menu->addAction(view->icon(), tr("Add %1 ...").arg(title), this, SLOT(addEngineFromAction()))->setData(url); - } -#endif -} - void WebSearchBar::addEngineFromAction() { if (QAction* action = qobject_cast(sender())) { diff --git a/src/lib/navigation/websearchbar.h b/src/lib/navigation/websearchbar.h index 109d02ccc..e4bb6290b 100644 --- a/src/lib/navigation/websearchbar.h +++ b/src/lib/navigation/websearchbar.h @@ -73,7 +73,6 @@ private: void dropEvent(QDropEvent* event); void keyPressEvent(QKeyEvent* event); - void completeMenuWithAvailableEngines(QMenu* menu); void contextMenuEvent(QContextMenuEvent* event); QCompleter* m_completer; diff --git a/src/lib/tools/scripts.cpp b/src/lib/tools/scripts.cpp index 23be7d7b6..1d28c89f2 100644 --- a/src/lib/tools/scripts.cpp +++ b/src/lib/tools/scripts.cpp @@ -190,3 +190,23 @@ QString Scripts::completeFormData(const QByteArray &data) d.replace(QL1S("'"), QL1S("\\'")); return source.arg(d); } + +QString Scripts::getOpenSearchLinks() +{ + QString source = QL1S("(function() {" + "var out = [];" + "var links = document.getElementsByTagName('link');" + "for (var i = 0; i < links.length; ++i) {" + " var e = links[i];" + " if (e.type == 'application/opensearchdescription+xml') {" + " out.push({" + " url: e.href," + " title: e.title" + " });" + " }" + "}" + "return out;" + "})()"); + + return source; +} diff --git a/src/lib/tools/scripts.h b/src/lib/tools/scripts.h index 28df339af..d1809bdda 100644 --- a/src/lib/tools/scripts.h +++ b/src/lib/tools/scripts.h @@ -34,6 +34,7 @@ public: static QString setCss(const QString &css); static QString sendPostData(const QUrl &url, const QByteArray &data); static QString completeFormData(const QByteArray &data); + static QString getOpenSearchLinks(); }; #endif // SCRIPTS_H