nsresult nsUrlClassifierLookupCallback::HandleResults() { if (!mResults) { // No results, this URI is clean. return mCallback->HandleEvent(NS_LITERAL_CSTRING("")); } nsTArray<nsCString> tables; // Build a stringified list of result tables. for (PRUint32 i = 0; i < mResults->Length(); i++) { LookupResult& result = mResults->ElementAt(i); // Leave out results that weren't confirmed, as their existence on // the list can't be verified. Also leave out randomly-generated // noise. if (!result.Confirmed() || result.mNoise) { LOG(("Skipping result from table %s", result.mTableName.get())); continue; } LOG(("Confirmed result from table %s", result.mTableName.get())); if (tables.IndexOf(result.mTableName) == nsTArray<nsCString>::NoIndex) { tables.AppendElement(result.mTableName); } } // Some parts of this gethash request generated no hits at all. // Prefixes must have been removed from the database since our last update. // Save the prefixes we checked to prevent repeated requests // until the next update. nsAutoPtr<PrefixArray> cacheMisses(new PrefixArray()); if (cacheMisses) { for (uint32 i = 0; i < mResults->Length(); i++) { LookupResult &result = mResults->ElementAt(i); if (!result.Confirmed()) { cacheMisses->AppendElement(result.PrefixHash()); } } // Hands ownership of the miss array back to the worker thread. mDBService->CacheMisses(cacheMisses.forget()); } if (mCacheResults) { // This hands ownership of the cache results array back to the worker // thread. mDBService->CacheCompletions(mCacheResults.forget()); } nsCAutoString tableStr; for (PRUint32 i = 0; i < tables.Length(); i++) { if (i != 0) tableStr.Append(','); tableStr.Append(tables[i]); } return mCallback->HandleEvent(tableStr); }
PLDHashOperator RemoveAllSignalHandlers(const nsAString& aKey, nsAutoPtr<BluetoothSignalObserverList>& aData, void* aUserArg) { aData->RemoveObserver(static_cast<BluetoothSignalObserver*>(aUserArg)); return aData->Length() ? PL_DHASH_NEXT : PL_DHASH_REMOVE; }
PLDHashOperator RemoveAllSignalHandlers(const nsAString& aKey, nsAutoPtr<BluetoothSignalObserverList>& aData, void* aUserArg) { BluetoothSignalObserver* handler = static_cast<BluetoothSignalObserver*>(aUserArg); aData->RemoveObserver(handler); // We shouldn't have duplicate instances in the ObserverList, but there's // no appropriate way to do duplication check while registering, so // assertions are added here. MOZ_ASSERT(!aData->RemoveObserver(handler)); return aData->Length() ? PL_DHASH_NEXT : PL_DHASH_REMOVE; }
NS_IMETHODIMP nsUrlClassifierLookupCallback::Completion(const nsACString& completeHash, const nsACString& tableName, PRUint32 chunkId, bool verified) { LOG(("nsUrlClassifierLookupCallback::Completion [%p, %s, %d, %d]", this, PromiseFlatCString(tableName).get(), chunkId, verified)); mozilla::safebrowsing::Completion hash; hash.Assign(completeHash); // Send this completion to the store for caching. if (!mCacheResults) { mCacheResults = new CacheResultArray(); if (!mCacheResults) return NS_ERROR_OUT_OF_MEMORY; } if (verified) { CacheResult result; result.entry.addChunk = chunkId; result.entry.hash.complete = hash; result.table = tableName; // OK if this fails, we just won't cache the item. mCacheResults->AppendElement(result); } // Check if this matched any of our results. for (PRUint32 i = 0; i < mResults->Length(); i++) { LookupResult& result = mResults->ElementAt(i); // Now, see if it verifies a lookup if (result.CompleteHash() == hash && result.mTableName.Equals(tableName)) { result.mProtocolConfirmed = true; } } return NS_OK; }