diff -up firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.cpp.gnome-shell-search-fixes firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.cpp --- firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.cpp.gnome-shell-search-fixes 2020-04-07 08:01:50.587124776 +0200 +++ firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.cpp 2020-04-07 10:14:02.530380225 +0200 @@ -26,6 +26,8 @@ #include "nsIStringBundle.h" #include "imgIContainer.h" #include "imgITools.h" +#include "nsNetCID.h" +#include "nsIIOService.h" #include "mozilla/gfx/DataSurfaceHelpers.h" @@ -289,20 +291,12 @@ AsyncFaviconDataReady::OnComplete(nsIURI } void nsGNOMEShellSearchProvider::ComposeSearchResultReply( - DBusMessage* reply, const char* aSearchTerm) { + DBusMessage* reply, const char* aSearchTerm, bool aSearchOnly) { uint32_t childCount = 0; - nsresult rv = mHistResultContainer->GetChildCount(&childCount); - if (NS_FAILED(rv) || childCount == 0) { - return; - } - - // Obtain the favicon service and get the favicon for the specified page - nsCOMPtr favIconSvc( - do_GetService("@mozilla.org/browser/favicon-service;1")); - nsCOMPtr ios(do_GetService(NS_IOSERVICE_CONTRACTID)); + nsresult rv = NS_OK; - if (childCount > MAX_SEARCH_RESULTS_NUM) { - childCount = MAX_SEARCH_RESULTS_NUM; + if (!aSearchOnly) { + nsresult rv = mHistResultContainer->GetChildCount(&childCount); } DBusMessageIter iter; @@ -310,30 +304,41 @@ void nsGNOMEShellSearchProvider::Compose DBusMessageIter iterArray; dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &iterArray); - for (uint32_t i = 0; i < childCount; i++) { - nsCOMPtr child; - mHistResultContainer->GetChild(i, getter_AddRefs(child)); - if (NS_WARN_IF(NS_FAILED(rv))) { - continue; - } - if (!IsHistoryResultNodeURI(child)) { - continue; + if (NS_SUCCEEDED(rv) && childCount > 0) { + // Obtain the favicon service and get the favicon for the specified page + nsCOMPtr favIconSvc( + do_GetService("@mozilla.org/browser/favicon-service;1")); + nsCOMPtr ios(do_GetService(NS_IOSERVICE_CONTRACTID)); + + if (childCount > MAX_SEARCH_RESULTS_NUM) { + childCount = MAX_SEARCH_RESULTS_NUM; } - nsAutoCString uri; - child->GetUri(uri); + for (uint32_t i = 0; i < childCount; i++) { + nsCOMPtr child; + mHistResultContainer->GetChild(i, getter_AddRefs(child)); + if (NS_WARN_IF(NS_FAILED(rv))) { + continue; + } + if (!child || !IsHistoryResultNodeURI(child)) { + continue; + } - nsCOMPtr iconIri; - ios->NewURI(uri, nullptr, nullptr, getter_AddRefs(iconIri)); - nsCOMPtr callback = - new AsyncFaviconDataReady(this, i, mSearchSerial); - favIconSvc->GetFaviconDataForPage(iconIri, callback, 0); + nsAutoCString uri; + child->GetUri(uri); - nsAutoCString idKey; - GetIDKeyForURI(i, uri, idKey); + nsCOMPtr iconIri; + ios->NewURI(uri, nullptr, nullptr, getter_AddRefs(iconIri)); + nsCOMPtr callback = + new AsyncFaviconDataReady(this, i, mSearchSerial); + favIconSvc->GetFaviconDataForPage(iconIri, callback, 0); - const char* id = idKey.get(); - dbus_message_iter_append_basic(&iterArray, DBUS_TYPE_STRING, &id); + nsAutoCString idKey; + GetIDKeyForURI(i, uri, idKey); + + const char* id = idKey.get(); + dbus_message_iter_append_basic(&iterArray, DBUS_TYPE_STRING, &id); + } } nsPrintfCString searchString("%s:%s", KEYWORD_SEARCH_STRING, aSearchTerm); @@ -346,7 +351,7 @@ void nsGNOMEShellSearchProvider::Compose DBusHandlerResult nsGNOMEShellSearchProvider::GetInitialResultSet( DBusMessage* aMsg) { DBusMessage* reply; - char** stringArray; + char** stringArray = nullptr; int elements; if (!dbus_message_get_args(aMsg, nullptr, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, @@ -356,9 +361,10 @@ DBusHandlerResult nsGNOMEShellSearchProv } else { reply = dbus_message_new_method_return(aMsg); nsresult rv = NewHistorySearch(stringArray[0]); - if (NS_SUCCEEDED(rv)) { - ComposeSearchResultReply(reply, stringArray[0]); - } + ComposeSearchResultReply(reply, stringArray[0], + /* search only */ NS_FAILED(rv)); + } + if (stringArray) { dbus_free_string_array(stringArray); } @@ -384,9 +390,8 @@ DBusHandlerResult nsGNOMEShellSearchProv } else { reply = dbus_message_new_method_return(aMsg); nsresult rv = NewHistorySearch(stringArray[0]); - if (NS_SUCCEEDED(rv)) { - ComposeSearchResultReply(reply, stringArray[0]); - } + ComposeSearchResultReply(reply, stringArray[0], + /* search only */ NS_FAILED(rv)); } if (unusedArray) { @@ -556,6 +561,10 @@ void nsGNOMEShellSearchProvider::LaunchW nsCOMPtr child; mHistResultContainer->GetChild(keyIndex, getter_AddRefs(child)); + if (!child) { + return; + } + nsAutoCString uri; nsresult rv = child->GetUri(uri); if (NS_FAILED(rv)) { diff -up firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.h.gnome-shell-search-fixes firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.h --- firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.h.gnome-shell-search-fixes 2020-04-07 08:01:50.587124776 +0200 +++ firefox-75.0/browser/components/shell/nsGNOMEShellSearchProvider.h 2020-04-07 09:56:30.857553820 +0200 @@ -70,7 +70,8 @@ class nsGNOMEShellSearchProvider : publi bool IsHistoryResultNodeURI(nsINavHistoryResultNode* aHistoryNode); void AppendResultID(DBusMessageIter* aIter, const char* aID); void AppendSearchID(DBusMessageIter* aIter, const char* aID); - void ComposeSearchResultReply(DBusMessage* aReply, const char* aSearchTerm); + void ComposeSearchResultReply(DBusMessage* aReply, const char* aSearchTerm, + bool aSearchOnly); void LaunchWithID(const char* aID, uint32_t aTimeStamp); void LaunchWithAllResults(uint32_t aTimeStamp);