SearchEngines: Bring back support to add engine from page

remotes/origin/falkon
David Rosca 11 years ago
parent 67b5a5337b
commit ced9c8553c
  1. 51
      src/lib/navigation/websearchbar.cpp
  2. 1
      src/lib/navigation/websearchbar.h
  3. 20
      src/lib/tools/scripts.cpp
  4. 1
      src/lib/tools/scripts.h

@ -29,6 +29,7 @@
#include "searchenginesdialog.h"
#include "networkmanager.h"
#include "iconprovider.h"
#include "scripts.h"
#include <QMimeData>
#include <QAbstractItemView>
@ -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<QAction*>(sender())) {

@ -73,7 +73,6 @@ private:
void dropEvent(QDropEvent* event);
void keyPressEvent(QKeyEvent* event);
void completeMenuWithAvailableEngines(QMenu* menu);
void contextMenuEvent(QContextMenuEvent* event);
QCompleter* m_completer;

@ -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;
}

@ -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

Loading…
Cancel
Save