/* static */ bool MatchAutoCompleteFunction::findBeginning(const nsDependentCSubstring &aToken, const nsACString &aSourceString) { NS_PRECONDITION(!aToken.IsEmpty(), "Don't search for an empty token!"); // We can't use StringBeginsWith here, unfortunately. Although it will // happily take a case-insensitive UTF8 comparator, it eventually calls // nsACString::Equals, which checks that the two strings contain the same // number of bytes before calling the comparator. This is clearly not what // we want. const_char_iterator tokenStart(aToken.BeginReading()), tokenEnd(aToken.EndReading()), sourceStart(aSourceString.BeginReading()), sourceEnd(aSourceString.EndReading()); PRBool dummy; while (sourceStart < sourceEnd && CaseInsensitiveUTF8CharsEqual(sourceStart, tokenStart, sourceEnd, tokenEnd, &sourceStart, &tokenStart, &dummy)) { // We found the token! if (tokenStart >= tokenEnd) { return true; } } // We don't need to check CaseInsensitiveUTF8CharsEqual's error condition // (stored in |dummy|), since the function will return false if it // encounters an error. return false; }
bool VLPrefixSet::GetSmallestPrefix(nsDependentCSubstring& aOutString) { PrefixString* pick = nullptr; for (auto iter = mMap.ConstIter(); !iter.Done(); iter.Next()) { PrefixString* str = iter.Data(); if (!str->get()) { continue; } if (aOutString.IsEmpty()) { aOutString.Rebind(str->get(), iter.Key()); pick = str; continue; } nsDependentCSubstring cur(str->get(), iter.Key()); if (cur < aOutString) { aOutString.Rebind(str->get(), iter.Key()); pick = str; } } if (pick) { pick->next(); } return pick != nullptr; }
/* static */ bool MatchAutoCompleteFunction::findBeginningCaseSensitive( const nsDependentCSubstring &aToken, const nsACString &aSourceString) { NS_PRECONDITION(!aToken.IsEmpty(), "Don't search for an empty token!"); return StringBeginsWith(aSourceString, aToken); }
nsresult nsNetscapeProfileMigratorBase::ImportNetscapeCookies(nsIFile* aCookiesFile) { nsresult rv; nsCOMPtr<nsIInputStream> cookiesStream; rv = NS_NewLocalFileInputStream(getter_AddRefs(cookiesStream), aCookiesFile); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsILineInputStream> lineInputStream(do_QueryInterface(cookiesStream)); // This code is copied from mozilla/netwerk/cookie/src/nsCookieManager.cpp static NS_NAMED_LITERAL_CSTRING(kTrue, "TRUE"); nsCAutoString buffer; PRBool isMore = PR_TRUE; PRInt32 hostIndex = 0, isDomainIndex, pathIndex, secureIndex, expiresIndex, nameIndex, cookieIndex; PRInt32 numInts; PRInt64 expires; PRBool isDomain; PRInt64 currentTime = PR_Now() / PR_USEC_PER_SEC; nsCOMPtr<nsICookieManager2> cookieManager(do_GetService(NS_COOKIEMANAGER_CONTRACTID, &rv)); if (NS_FAILED(rv)) return rv; /* file format is: * * host \t isDomain \t path \t secure \t expires \t name \t cookie * * if this format isn't respected we move onto the next line in the file. * isDomain is "TRUE" or "FALSE" (default to "FALSE") * isSecure is "TRUE" or "FALSE" (default to "TRUE") * expires is a PRInt64 integer * note 1: cookie can contain tabs. * note 2: cookies are written in order of lastAccessed time: * most-recently used come first; least-recently-used come last. */ while (isMore && NS_SUCCEEDED(lineInputStream->ReadLine(buffer, &isMore))) { if (buffer.IsEmpty() || buffer.First() == '#') continue; // this is a cheap, cheesy way of parsing a tab-delimited line into // string indexes, which can be lopped off into substrings. just for // purposes of obfuscation, it also checks that each token was found. // todo: use iterators? if ((isDomainIndex = buffer.FindChar('\t', hostIndex) + 1) == 0 || (pathIndex = buffer.FindChar('\t', isDomainIndex) + 1) == 0 || (secureIndex = buffer.FindChar('\t', pathIndex) + 1) == 0 || (expiresIndex = buffer.FindChar('\t', secureIndex) + 1) == 0 || (nameIndex = buffer.FindChar('\t', expiresIndex) + 1) == 0 || (cookieIndex = buffer.FindChar('\t', nameIndex) + 1) == 0) continue; // check the expirytime first - if it's expired, ignore // nullstomp the trailing tab, to avoid copying the string char *iter = buffer.BeginWriting(); *(iter += nameIndex - 1) = char(0); numInts = PR_sscanf(buffer.get() + expiresIndex, "%lld", &expires); if (numInts != 1 || expires < currentTime) continue; isDomain = Substring(buffer, isDomainIndex, pathIndex - isDomainIndex - 1).Equals(kTrue); const nsDependentCSubstring host = Substring(buffer, hostIndex, isDomainIndex - hostIndex - 1); // check for bad legacy cookies (domain not starting with a dot, or containing a port), // and discard if (isDomain && !host.IsEmpty() && host.First() != '.' || host.FindChar(':') != -1) continue; // create a new nsCookie and assign the data. rv = cookieManager->Add(host, Substring(buffer, pathIndex, secureIndex - pathIndex - 1), Substring(buffer, nameIndex, cookieIndex - nameIndex - 1), Substring(buffer, cookieIndex, buffer.Length() - cookieIndex), Substring(buffer, secureIndex, expiresIndex - secureIndex - 1).Equals(kTrue), PR_FALSE, // isHttpOnly PR_FALSE, // isSession expires); } return rv; }