diff options
author | megabigbug <megabigbug@arrakis.(none)> | 2010-08-15 16:19:10 +0200 |
---|---|---|
committer | megabigbug <megabigbug@arrakis.(none)> | 2010-08-15 16:19:10 +0200 |
commit | 20879867364e31cdd8e80d0f732cf03b140e28ea (patch) | |
tree | e25978bfe64228d943ab83c7a29aa79563356119 | |
parent | wait signal (diff) | |
download | rekonq-20879867364e31cdd8e80d0f732cf03b140e28ea.tar.xz |
working opensearch suggestions
-rw-r--r-- | src/application.cpp | 3 | ||||
-rw-r--r-- | src/application.h | 3 | ||||
-rw-r--r-- | src/urlbar/urlresolver.cpp | 255 | ||||
-rw-r--r-- | src/urlbar/urlresolver.h | 29 |
4 files changed, 176 insertions, 114 deletions
diff --git a/src/application.cpp b/src/application.cpp index 231b45b7..bfe67f45 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -42,7 +42,7 @@ #include "urlbar.h" #include "sessionmanager.h" #include "adblockmanager.h" -#include "search/opensearchmanager.h" +#include "opensearchmanager.h" #include "webview.h" #include "filterurljob.h" #include "tabbar.h" @@ -325,6 +325,7 @@ OpenSearchManager *Application::opensearchManager() if (s_opensearchManager.isNull()) { s_opensearchManager = new OpenSearchManager(instance()); + s_opensearchManager.data()->setSearchProvider("google"); //TODO: use other suggestion engines } return s_opensearchManager.data(); } diff --git a/src/application.h b/src/application.h index 11943923..a08d883c 100644 --- a/src/application.h +++ b/src/application.h @@ -33,6 +33,8 @@ // Rekonq Includes #include "rekonq_defines.h" +#include "opensearchmanager.h" + // KDE Includes #include <KUniqueApplication> #include <KIcon> @@ -50,7 +52,6 @@ class HistoryManager; class MainWindow; class SessionManager; class AdBlockManager; -class OpenSearchManager; class WebView; diff --git a/src/urlbar/urlresolver.cpp b/src/urlbar/urlresolver.cpp index 189a5e46..ebd01a58 100644 --- a/src/urlbar/urlresolver.cpp +++ b/src/urlbar/urlresolver.cpp @@ -31,7 +31,7 @@ #include "application.h" #include "historymanager.h" #include "bookmarksmanager.h" -#include "search/searchengine.h" +#include "searchengine.h" // KDE Includes #include <KUriFilter> @@ -45,7 +45,7 @@ // defines #define MAX_ELEMENTS 10 - +#define MIN_SUGGESTIONS 3 // NOTE // default kurifilter plugin list (at least in my box): @@ -63,7 +63,8 @@ QRegExp UrlResolver::_browseRegexp; QRegExp UrlResolver::_searchEnginesRegexp; UrlResolver::UrlResolver(const QString &typedUrl) - : _typedString(typedUrl.trimmed()) + : QObject() + , _typedString(typedUrl.trimmed()) { if ( _browseRegexp.isEmpty() ) { @@ -108,20 +109,9 @@ UrlResolver::UrlResolver(const QString &typedUrl) UrlSearchList UrlResolver::orderedSearchItems() { - // NOTE - // the logic here is : "we wanna suggest (at least) 10 elements" - // so we have (more or less) 2 from first results (1 from QUrl Resolutions, 1 from - // search engines). - // There are 8 remaining: if bookmarkResults + historyResults <= 8, catch all, else - // catch first 4 results from the two resulting lists :) - - QTime myTime; - myTime.start(); - - UrlSearchList list; - if( _typedString == QL1S("about:") ) { + UrlSearchList list; UrlSearchItem home(UrlSearchItem::Browse, QString("about:home"), QL1S("home") ); list << home; UrlSearchItem favs(UrlSearchItem::Browse, QString("about:favorites"), QL1S("favorites") ); @@ -134,122 +124,152 @@ UrlSearchList UrlResolver::orderedSearchItems() list << hist; UrlSearchItem down(UrlSearchItem::Browse, QString("about:downloads"), QL1S("downloads") ); list << down; - + return list; } + _computedListsCount = 0; + + //compute lists + computeSuggestions(); + computeQurlFromUserInput(); + computeWebSearches(); + computeBookmarks(); + computeHistory(); + + QTime time; + time.start(); + + while (_computedListsCount < 5 && time.msec() < 1000) + { + Application::instance()->processEvents(QEventLoop::WaitForMoreEvents | QEventLoop::ExcludeUserInputEvents); + } + + return orderLists(); +} + + +UrlSearchList UrlResolver::orderLists() +{ + // NOTE + // the logic here is : "we wanna suggest (at least) 10 elements" + // so we have (more or less) 2 from first results (1 from QUrl Resolutions, 1 from + // search engines). + // There are 8 remaining: if bookmarkResults + historyResults <= 8, catch all, else + // catch first 4 results from the two resulting lists :) + + QTime myTime; + myTime.start(); + + UrlSearchList list; + if(_browseRegexp.indexIn(_typedString) != -1) { - list << qurlFromUserInputResolution(); - list << webSearchesResolution(); + list << _qurlFromUserInput; + list << _webSearches; } else { - list << webSearchesResolution(); - list << qurlFromUserInputResolution(); + list << _webSearches; + list << _qurlFromUserInput; } //find the history items that match the typed string - UrlSearchList historyList = historyResolution(); - UrlSearchItem privileged = privilegedItem(&historyList); - int historyResults = historyList.count(); + UrlSearchItem privileged = privilegedItem(&_history); + int historyCount = _history.count(); //find the bookmarks items that match the typed string - UrlSearchList bookmarksList = bookmarksResolution(); if (privileged.type == UrlSearchItem::Undefined) { - privileged = privilegedItem(&bookmarksList); + privileged = privilegedItem(&_bookmarks); } - else if(privileged.type == UrlSearchItem::History && bookmarksList.removeOne(privileged)) + else if(privileged.type == UrlSearchItem::History && _bookmarks.removeOne(privileged)) { privileged.type |= UrlSearchItem::Bookmark; } - int bookmarksResults = bookmarksList.count(); + int bookmarksCount = _bookmarks.count(); if (privileged.type != UrlSearchItem::Undefined) { list.prepend(privileged); } + + int availableEntries = MAX_ELEMENTS - list.count() - MIN_SUGGESTIONS; - int availableEntries = MAX_ELEMENTS - list.count(); - - UrlSearchList commonList; - int commonResutls = 0; + UrlSearchList common; + int commonCount = 0; //prefer items which are history items als well bookmarks item //if there are more than 1000 bookmark results, the performance impact is noticeable - if(bookmarksResults < 1000) + if(bookmarksCount < 1000) { //add as many items to the common list as there are available entries in the dropdown list UrlSearchItem urlSearchItem; - for(int i = 0; i < historyList.count(); i++) + for(int i = 0; i < _history.count(); i++) { - if (bookmarksList.removeOne(historyList.at(i))) + if (_bookmarks.removeOne(_history.at(i))) { - urlSearchItem = historyList.takeAt(i); + urlSearchItem = _history.takeAt(i); urlSearchItem.type |= UrlSearchItem::Bookmark; - commonList << urlSearchItem; - commonResutls++; - if(commonResutls >= availableEntries) + common << urlSearchItem; + commonCount++; + if(commonCount >= availableEntries) { break; } } } - commonResutls = commonList.count(); - if(commonResutls >= availableEntries) + commonCount = common.count(); + if(commonCount >= availableEntries) { - commonList = commonList.mid(0, availableEntries); - historyList = UrlSearchList(); - bookmarksList = UrlSearchList(); + common = common.mid(0, availableEntries); + _history = UrlSearchList(); + _bookmarks = UrlSearchList(); availableEntries = 0; } else //remove all items from the history and bookmarks list up to the remaining entries in the dropdown list { - availableEntries -= commonResutls; - if(historyResults >= availableEntries) + availableEntries -= commonCount; + if(historyCount >= availableEntries) { - historyList = historyList.mid(0, availableEntries); + _history = _history.mid(0, availableEntries); } - if(bookmarksResults >= availableEntries) + if(bookmarksCount >= availableEntries) { - bookmarksList = bookmarksList.mid(0, availableEntries); + _bookmarks = _bookmarks.mid(0, availableEntries); } } } else //if there are too many bookmarks items, remove all items up to the remaining entries in the dropdown list { - - if(historyResults >= availableEntries) + + if(historyCount >= availableEntries) { - historyList = historyList.mid(0, availableEntries); + _history = _history.mid(0, availableEntries); } - if(bookmarksResults >= availableEntries) + if(bookmarksCount >= availableEntries) { - bookmarksList = bookmarksList.mid(0, availableEntries); + _bookmarks = _bookmarks.mid(0, availableEntries); } UrlSearchItem urlSearchItem; - for(int i = 0; i < historyList.count(); i++) + for(int i = 0; i < _history.count(); i++) { - if (bookmarksList.removeOne(historyList.at(i))) + if (_bookmarks.removeOne(_history.at(i))) { - urlSearchItem = historyList.takeAt(i); + urlSearchItem = _history.takeAt(i); urlSearchItem.type |= UrlSearchItem::Bookmark; - commonList << urlSearchItem; + common << urlSearchItem; } } - availableEntries -= commonList.count(); + availableEntries -= common.count(); } - - UrlSearchList suggestionsList = suggestionResolution(); - historyResults = historyList.count(); - bookmarksResults = bookmarksList.count(); - commonResutls = commonList.count(); - //TODO: count suggestions entries + historyCount = _history.count(); + bookmarksCount = _bookmarks.count(); + commonCount = common.count(); //now fill the list to MAX_ELEMENTS if(availableEntries > 0) @@ -257,28 +277,36 @@ UrlSearchList UrlResolver::orderedSearchItems() int historyEntries = ((int) (availableEntries / 2)) + availableEntries % 2; int bookmarksEntries = availableEntries - historyEntries; - if (historyResults >= historyEntries && bookmarksResults >= bookmarksEntries) + if (historyCount >= historyEntries && bookmarksCount >= bookmarksEntries) { - historyList = historyList.mid(0, historyEntries); - bookmarksList = bookmarksList.mid(0, bookmarksEntries); + _history = _history.mid(0, historyEntries); + _bookmarks = _bookmarks.mid(0, bookmarksEntries); } - else if (historyResults < historyEntries && bookmarksResults >= bookmarksEntries) + else if (historyCount < historyEntries && bookmarksCount >= bookmarksEntries) { - if(historyResults + bookmarksResults > availableEntries) + if(historyCount + bookmarksCount > availableEntries) { - bookmarksList = bookmarksList.mid(0, availableEntries - historyResults); + _bookmarks = _bookmarks.mid(0, availableEntries - historyCount); } } - else if (historyResults >= historyEntries && bookmarksResults < bookmarksEntries) + else if (historyCount >= historyEntries && bookmarksCount < bookmarksEntries) { - if(historyResults + bookmarksResults > availableEntries) + if(historyCount + bookmarksCount > availableEntries) { - historyList = historyList.mid(0, availableEntries - bookmarksResults); + _history = _history.mid(0, availableEntries - bookmarksCount); } } } - - list = list + historyList + commonList + bookmarksList + suggestionsList; + + availableEntries -= _history.count(); + availableEntries -= _bookmarks.count(); + + if (_suggestions.count() > availableEntries + MIN_SUGGESTIONS) + { + _suggestions = _suggestions.mid(0, availableEntries + MIN_SUGGESTIONS); + } + + list = list + _history + common + _bookmarks + _suggestions; qWarning() << "orderedSearchItems leave: " << " elapsed: " << myTime.elapsed(); return list; @@ -289,77 +317,92 @@ UrlSearchList UrlResolver::orderedSearchItems() // PRIVATE ENGINES -// STEP 1 = QUrl from User Input (easily the best solution... ) -UrlSearchList UrlResolver::qurlFromUserInputResolution() +//QUrl from User Input (easily the best solution... ) +void UrlResolver::computeQurlFromUserInput() { - UrlSearchList list; - QString url2 = _typedString; - QUrl urlFromUserInput = QUrl::fromUserInput(url2); + QString url = _typedString; + QUrl urlFromUserInput = QUrl::fromUserInput(url); if (urlFromUserInput.isValid()) { QString gTitle = i18nc("Browse a website", "Browse"); UrlSearchItem gItem(UrlSearchItem::Browse, urlFromUserInput.toString(), gTitle); - list << gItem; + _qurlFromUserInput << gItem; } - return list; + _computedListsCount++; } -// STEP 2 = Web Searches -UrlSearchList UrlResolver::webSearchesResolution() +//webSearches +void UrlResolver::computeWebSearches() { - return UrlSearchList() << UrlSearchItem(UrlSearchItem::Search, QString(), QString()); + _webSearches = (UrlSearchList() << UrlSearchItem(UrlSearchItem::Search, QString(), QString())); + _computedListsCount++; } -// STEP 3 = history completion -UrlSearchList UrlResolver::historyResolution() +//history +void UrlResolver::computeHistory() { QList<HistoryHashItem> found = Application::historyManager()->find(_typedString); qSort(found); - UrlSearchList list; foreach (HistoryHashItem i, found) { if (_searchEnginesRegexp.indexIn(i.url) == -1) //filter all urls that are search engine results { UrlSearchItem gItem(UrlSearchItem::History, i.url, i.title); - list << gItem; + _history << gItem; } } - return list; + + _computedListsCount++; } -// STEP 4 = bookmarks completion -UrlSearchList UrlResolver::bookmarksResolution() +// bookmarks +void UrlResolver::computeBookmarks() { - UrlSearchList list; QList<KBookmark> found = Application::bookmarkProvider()->find(_typedString); + foreach (KBookmark b, found) { UrlSearchItem gItem(UrlSearchItem::Bookmark, b.url().url(), b.fullText()); - list << gItem; + _bookmarks << gItem; } - return list; + + _computedListsCount++; } -// STEP 4 = suggestion completion -UrlSearchList UrlResolver::suggestionResolution() +//opensearch suggestion +void UrlResolver::computeSuggestions() { - Application::opensearchManager()->requestSuggestion(); - while (!m_suggestionReceived) - { - Application->instance()->processEvents(QEventLoop::WaitForMore | QEventLoop::ExcludeUserInput); + if (Application::opensearchManager()->isSuggestionAvailable()) + { + connect(Application::opensearchManager(), + SIGNAL(suggestionReceived(const QStringList &)), + this, + SLOT(suggestionsReceived(const QStringList &))); + + Application::opensearchManager()->requestSuggestion(_typedString); } - - UrlSearchList list; - UrlSearchItem gItem(UrlSearchItem::Suggestion, "a", "a"); - list << gItem; + else + { + _computedListsCount++; + } +} - return list; + +void UrlResolver::suggestionsReceived(const QStringList &suggestion) +{ + foreach (QString s, suggestion) + { + UrlSearchItem gItem(UrlSearchItem::Suggestion, s, s); + _suggestions << gItem; + } + + _computedListsCount++; } diff --git a/src/urlbar/urlresolver.h b/src/urlbar/urlresolver.h index d41e3f1a..f72d6731 100644 --- a/src/urlbar/urlresolver.h +++ b/src/urlbar/urlresolver.h @@ -38,6 +38,7 @@ // Qt Includes #include <QString> #include <QList> +#include <QStringList> class UrlSearchItem { @@ -94,8 +95,10 @@ typedef QList <UrlSearchItem> UrlSearchList; // ---------------------------------------------------------------------- -class UrlResolver +class UrlResolver : public QObject { + Q_OBJECT + public: UrlResolver(const QString &typedUrl); @@ -104,15 +107,29 @@ public: private: QString _typedString; - UrlSearchList webSearchesResolution(); - UrlSearchList historyResolution(); - UrlSearchList qurlFromUserInputResolution(); - UrlSearchList bookmarksResolution(); + UrlSearchList _webSearches; + UrlSearchList _qurlFromUserInput; + UrlSearchList _history; + UrlSearchList _bookmarks; + UrlSearchList _suggestions; + + void computeWebSearches(); + void computeHistory(); + void computeQurlFromUserInput(); + void computeBookmarks(); + void computeSuggestions(); + + int _computedListsCount; + UrlSearchItem privilegedItem(UrlSearchList* list); - UrlSearchList suggestionResolution(); + UrlSearchList orderLists(); static QRegExp _browseRegexp; static QRegExp _searchEnginesRegexp; + +private slots: + void suggestionsReceived(const QStringList &suggestion); + }; // ------------------------------------------------------------------------------ |