NS_IMETHODIMP nsUrlClassifierLookupCallback::LookupComplete(nsTArray<LookupResult>* results) { NS_ASSERTION(mResults == nsnull, "Should only get one set of results per nsUrlClassifierLookupCallback!"); if (!results) { HandleResults(); return NS_OK; } mResults = results; // Check the results entries that need to be completed. for (PRUint32 i = 0; i < results->Length(); i++) { LookupResult& result = results->ElementAt(i); // We will complete partial matches and matches that are stale. if (!result.Confirmed()) { nsCOMPtr<nsIUrlClassifierHashCompleter> completer; if (mDBService->GetCompleter(result.mTableName, getter_AddRefs(completer))) { nsCAutoString partialHash; partialHash.Assign(reinterpret_cast<char*>(&result.hash.prefix), PREFIX_SIZE); nsresult rv = completer->Complete(partialHash, this); if (NS_SUCCEEDED(rv)) { mPendingCompletions++; } } else { // For tables with no hash completer, a complete hash match is // good enough, we'll consider it fresh. if (result.Complete()) { result.mFresh = true; } else { NS_WARNING("Partial match in a table without a valid completer, ignoring partial match."); } } } } if (mPendingCompletions == 0) { // All results were complete, we're ready! HandleResults(); } return NS_OK; }
NS_IMETHODIMP nsUrlClassifierLookupCallback::LookupComplete(nsTArray<LookupResult>* results) { NS_ASSERTION(mResults == nullptr, "Should only get one set of results per nsUrlClassifierLookupCallback!"); if (!results) { HandleResults(); return NS_OK; } mResults = results; // Check the results entries that need to be completed. for (uint32_t i = 0; i < results->Length(); i++) { LookupResult& result = results->ElementAt(i); // We will complete partial matches and matches that are stale. if (!result.Confirmed()) { nsCOMPtr<nsIUrlClassifierHashCompleter> completer; nsCString gethashUrl; nsresult rv; nsCOMPtr<nsIUrlListManager> listManager = do_GetService( "@mozilla.org/url-classifier/listmanager;1", &rv); NS_ENSURE_SUCCESS(rv, rv); rv = listManager->GetGethashUrl(result.mTableName, gethashUrl); NS_ENSURE_SUCCESS(rv, rv); LOG(("The match from %s needs to be completed at %s", result.mTableName.get(), gethashUrl.get())); // gethashUrls may be empty in 2 cases: test tables, and on startup where // we may have found a prefix in an existing table before the listmanager // has registered the table. In the second case we should not call // complete. if ((!gethashUrl.IsEmpty() || StringBeginsWith(result.mTableName, NS_LITERAL_CSTRING("test-"))) && mDBService->GetCompleter(result.mTableName, getter_AddRefs(completer))) { nsAutoCString partialHash; partialHash.Assign(reinterpret_cast<char*>(&result.hash.prefix), PREFIX_SIZE); nsresult rv = completer->Complete(partialHash, gethashUrl, this); if (NS_SUCCEEDED(rv)) { mPendingCompletions++; } } else { // For tables with no hash completer, a complete hash match is // good enough, we'll consider it fresh, even if it hasn't been updated // in 45 minutes. if (result.Complete()) { result.mFresh = true; LOG(("Skipping completion in a table without a valid completer (%s).", result.mTableName.get())); } else { NS_WARNING("Partial match in a table without a valid completer, ignoring partial match."); } } } } if (mPendingCompletions == 0) { // All results were complete, we're ready! HandleResults(); } return NS_OK; }