Bug 320666 (send more information for observers), bug 320835 (add ability to get hidden results), bug 320330 (max results option), and general observer cleanup. r=annie.sullivan@gmail.com

Original committer: brettw%gmail.com
Original revision: 1.43
Original date: 2005/12/21 01:00:38
This commit is contained in:
benjamin%smedbergs.us 2006-07-18 16:14:36 +00:00
Родитель 6415e838f6
Коммит 42480b1b59
1 изменённых файлов: 205 добавлений и 83 удалений

Просмотреть файл

@ -727,7 +727,9 @@ nsNavHistory::InternalAdd(nsIURI* aURI, nsIURI* aReferrer, PRInt64 aSessionID,
NS_ENSURE_SUCCESS(rv, rv);
}
rv = AddVisit(aReferrer, pageID, aVisitDate, aTransitionType);
PRInt64 visitID, referringID;
rv = AddVisit(aReferrer, pageID, aVisitDate, aTransitionType,
&visitID, &referringID);
if (aPageID)
*aPageID = pageID;
@ -748,7 +750,8 @@ nsNavHistory::InternalAdd(nsIURI* aURI, nsIURI* aReferrer, PRInt64 aSessionID,
// case they need to use the DB
transaction.Commit();
ENUMERATE_WEAKARRAY(mObservers, nsINavHistoryObserver,
OnAddURI(aURI, aVisitDate))
OnVisit(aURI, visitID, aVisitDate, aSessionID,
referringID, aTransitionType));
return NS_OK;
}
@ -832,9 +835,13 @@ nsNavHistory::InternalAddNewPage(nsIURI* aURI, const PRUnichar* aTitle,
// page and use it as the parent. This will get messed up if one page is
// open in more than one tab/window at once, but should be good enough for
// most cases.
//
// The visit ID of the referrer that this function computes will be put
// into referringID.
nsresult nsNavHistory::AddVisit(nsIURI* aReferrer, PRInt64 aPageID,
PRTime aTime, PRInt32 aTransitionType)
PRTime aTime, PRInt32 aTransitionType,
PRInt64* visitID, PRInt64 *referringID)
{
nsresult rv;
PRInt64 fromStep = 0;
@ -858,6 +865,7 @@ nsresult nsNavHistory::AddVisit(nsIURI* aReferrer, PRInt64 aPageID,
mLastSessionID ++;
sessionID = mLastSessionID;
}
*referringID = fromStep;
mozStorageStatementScoper scoper(mDBInsertVisit);
@ -874,7 +882,8 @@ nsresult nsNavHistory::AddVisit(nsIURI* aReferrer, PRInt64 aPageID,
rv = mDBInsertVisit->Execute();
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
return mDBConn->GetLastInsertRowID(visitID);
}
@ -1121,16 +1130,7 @@ nsNavHistory::GetHasHistoryEntries(PRBool* aHasEntries)
NS_IMETHODIMP
nsNavHistory::SetPageUserTitle(nsIURI* aURI, const nsAString& aUserTitle)
{
nsCOMPtr<mozIStorageStatement> statement;
nsresult rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_history SET user_title = ?2 WHERE url = ?1"),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
rv = BindStatementURI(statement, 0, aURI);
NS_ENSURE_SUCCESS(rv, rv);
rv = statement->BindStringParameter(1, aUserTitle);
NS_ENSURE_SUCCESS(rv, rv);
return statement->Execute();
return SetPageTitleInternal(aURI, PR_TRUE, aUserTitle);
}
@ -1311,7 +1311,7 @@ nsNavHistory::ExecuteQueries(nsINavHistoryQuery** aQueries, PRUint32 aQueryCount
// conditions we want on all history queries, this just selects history
// entries that are "active"
NS_NAMED_LITERAL_CSTRING(commonConditions,
"h.visit_count > 0 AND h.hidden <> 1");
"h.visit_count > 0 ");
// Query string: Output parameters should be in order of kGetInfoIndex_*
// WATCH OUT: nsNavBookmarks::Init also creates some statements that share
@ -1362,9 +1362,11 @@ nsNavHistory::ExecuteQueries(nsINavHistoryQuery** aQueries, PRUint32 aQueryCount
}
}
queryString += commonConditions;
if (! options->IncludeHidden())
queryString += NS_LITERAL_CSTRING("AND h.hidden <> 1 ");
if (! conditions.IsEmpty()) {
queryString += NS_LITERAL_CSTRING(" AND (") + conditions +
NS_LITERAL_CSTRING(")");
queryString += NS_LITERAL_CSTRING("AND (") + conditions +
NS_LITERAL_CSTRING(") ");
}
queryString += groupBy;
@ -1378,6 +1380,12 @@ nsNavHistory::ExecuteQueries(nsINavHistoryQuery** aQueries, PRUint32 aQueryCount
case nsINavHistoryQueryOptions::SORT_BY_TITLE_DESCENDING:
// the DB doesn't have indices on titles, and we need to do special
// sorting for locales. This type of sorting is done only at the end.
//
// If the user wants few results, we limit them by date, necessitating
// a sort by date here (see the IDL definition for maxResults). We'll
// still do the official sort by title later.
if (options->MaxResults() > 0)
queryString += NS_LITERAL_CSTRING(" ORDER BY v.visit_date DESC");
break;
case nsINavHistoryQueryOptions::SORT_BY_DATE_ASCENDING:
queryString += NS_LITERAL_CSTRING(" ORDER BY v.visit_date ASC");
@ -1400,6 +1408,14 @@ nsNavHistory::ExecuteQueries(nsINavHistoryQuery** aQueries, PRUint32 aQueryCount
default:
NS_NOTREACHED("Invalid sorting mode");
}
// limit clause if there are 'maxResults'
if (options->MaxResults() > 0) {
queryString += NS_LITERAL_CSTRING(" LIMIT ");
queryString.AppendInt(options->MaxResults());
queryString.AppendLiteral(" ");
}
printf("Constructed the query: %s\n", PromiseFlatCString(queryString).get());
// Put this in a transaction. Even though we are only reading, this will
@ -1728,20 +1744,6 @@ nsNavHistory::RemovePagesFromHost(const nsACString& aHost, PRBool aEntireDomain)
revHostSlash.Truncate(revHostSlash.Length() - 1);
revHostSlash.Append(NS_LITERAL_STRING("/"));
// see if we have to pass all deletes to the observers
PRBool hasObservers = PR_FALSE;
for (PRUint32 i = 0; i < mObservers.Length(); ++i) {
const nsCOMPtr<nsINavHistoryObserver> &obs = mObservers[i];
if (obs) {
PRBool allDetails = PR_FALSE;
obs->GetWantAllDetails(&allDetails);
if (allDetails) {
hasObservers = PR_TRUE;
break;
}
}
}
// how we are selecting host names
nsCAutoString conditionString;
if (aEntireDomain)
@ -1756,31 +1758,31 @@ nsNavHistory::RemovePagesFromHost(const nsACString& aHost, PRBool aEntireDomain)
// Note also that we *include* bookmarked items here. We generally want to
// send out delete notifications for bookmarked items since in general,
// deleting the visits (like we always do) will cause the item to disappear
// from history views.
// from history views. This will also cause all visit dates to be deleted,
// which affects many bookmark views
nsCStringArray deletedURIs;
nsCOMPtr<mozIStorageStatement> statement;
if (hasObservers) {
// create statement depending on delete type
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT url FROM moz_history h ") + conditionString,
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
rv = statement->BindStringParameter(0, revHostDot);
NS_ENSURE_SUCCESS(rv, rv);
if (aEntireDomain) {
rv = statement->BindStringParameter(1, revHostSlash);
NS_ENSURE_SUCCESS(rv, rv);
}
PRBool hasMore = PR_FALSE;
while ((statement->ExecuteStep(&hasMore) == NS_OK) && hasMore) {
nsCAutoString thisURIString;
if (NS_FAILED(statement->GetUTF8String(0, thisURIString)) ||
thisURIString.IsEmpty())
continue; // no URI
if (! deletedURIs.AppendCString(thisURIString))
return NS_ERROR_OUT_OF_MEMORY;
}
// create statement depending on delete type
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT url FROM moz_history h ") + conditionString,
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
rv = statement->BindStringParameter(0, revHostDot);
NS_ENSURE_SUCCESS(rv, rv);
if (aEntireDomain) {
rv = statement->BindStringParameter(1, revHostSlash);
NS_ENSURE_SUCCESS(rv, rv);
}
PRBool hasMore = PR_FALSE;
while ((statement->ExecuteStep(&hasMore) == NS_OK) && hasMore) {
nsCAutoString thisURIString;
if (NS_FAILED(statement->GetUTF8String(0, thisURIString)) ||
thisURIString.IsEmpty())
continue; // no URI
if (! deletedURIs.AppendCString(thisURIString))
return NS_ERROR_OUT_OF_MEMORY;
}
// first, delete all the visits
@ -1828,10 +1830,6 @@ nsNavHistory::RemovePagesFromHost(const nsACString& aHost, PRBool aEntireDomain)
const nsCOMPtr<nsINavHistoryObserver> &obs = mObservers.ElementAt(observerIndex);
if (! obs)
continue;
PRBool allDetails = PR_FALSE;
obs->GetWantAllDetails(&allDetails);
if (! allDetails)
continue;
// send it all the URIs
for (PRInt32 i = 0; i < deletedURIs.Count(); i ++) {
@ -1872,6 +1870,8 @@ nsNavHistory::RemoveAllPages()
NS_IMETHODIMP
nsNavHistory::HidePage(nsIURI *aURI)
{
return NS_ERROR_NOT_IMPLEMENTED;
/*
// for speed to save disk accesses
mozStorageTransaction transaction(mDBConn, PR_FALSE,
mozIStorageConnection::TRANSACTION_EXCLUSIVE);
@ -1930,6 +1930,7 @@ nsNavHistory::HidePage(nsIURI *aURI)
EmptyString()))
return NS_OK;
*/
}
@ -2041,45 +2042,33 @@ nsNavHistory::IsVisited(nsIURI *aURI, PRBool *_retval)
// nsNavHistory::SetPageTitle
//
// This sets the page "real" title. Use nsINavHistory::SetPageUserTitle to
// set any user-defined title.
NS_IMETHODIMP
nsNavHistory::SetPageTitle(nsIURI *aURI,
const nsAString & aTitle)
{
nsresult rv;
nsCOMPtr<mozIStorageStatement> dbModStatement;
rv = mDBConn->CreateStatement(
NS_LITERAL_CSTRING("UPDATE moz_history SET title = ?1 WHERE url = ?2"),
getter_AddRefs(dbModStatement));
NS_ENSURE_SUCCESS(rv, rv);
// title
dbModStatement->BindStringParameter(0, aTitle);
NS_ENSURE_SUCCESS(rv, rv);
// url
rv = BindStatementURI(dbModStatement, 1, aURI);
NS_ENSURE_SUCCESS(rv, rv);
rv = dbModStatement->Execute();
NS_ENSURE_SUCCESS(rv, rv);
// observers
ENUMERATE_WEAKARRAY(mObservers, nsINavHistoryObserver,
OnPageChanged(aURI,
nsINavHistoryObserver::ATTRIBUTE_TITLE,
aTitle))
return NS_OK;
return SetPageTitleInternal(aURI, PR_FALSE, aTitle);
}
// nsNavHistory::GetURIGeckoFlags
//
// FIXME: should we try to use annotations for this stuff?
NS_IMETHODIMP
nsNavHistory::GetURIGeckoFlags(nsIURI* aURI, PRUint32* aResult)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
// nsNavHistory::SetURIGeckoFlags
//
// FIXME: should we try to use annotations for this stuff?
NS_IMETHODIMP
nsNavHistory::SetURIGeckoFlags(nsIURI* aURI, PRUint32 aFlags)
{
@ -2687,6 +2676,111 @@ nsNavHistory::TitleForDomain(const nsString& domain, nsAString& aTitle)
}
// nsNavHistory::SetPageTitleInternal
//
// Called to set either the user-defined title (aIsUserTitle=true) or the
// "real" page title (aIsUserTitle=false) for the given URI. Used as a
// backend for SetPageUserTitle and SetTitle
//
// Will fail for pages that are not in the DB. To clear the corresponding
// title, use aTitle.SetIsVoid(). Sending an empty string will save an
// empty string instead of clearing it.
nsresult
nsNavHistory::SetPageTitleInternal(nsIURI* aURI, PRBool aIsUserTitle,
const nsAString& aTitle)
{
nsresult rv;
mozStorageTransaction transaction(mDBConn, PR_TRUE);
// first, make sure the page exists, and fetch the old title (we need the one
// that isn't changing to send notifications)
nsAutoString title;
nsAutoString userTitle;
{ // scope for statement
mozStorageStatementScoper infoScoper(mDBGetURLPageInfo);
rv = BindStatementURI(mDBGetURLPageInfo, 0, aURI);
NS_ENSURE_SUCCESS(rv, rv);
PRBool hasURL = PR_FALSE;
rv = mDBGetURLPageInfo->ExecuteStep(&hasURL);
NS_ENSURE_SUCCESS(rv, rv);
if (! hasURL) {
// we don't have the URL, give up
return NS_ERROR_NOT_AVAILABLE;
}
// page title
PRInt32 titleType;
rv = mDBGetURLPageInfo->GetTypeOfIndex(kGetInfoIndex_Title, &titleType);
NS_ENSURE_SUCCESS(rv, rv);
if (titleType == mozIStorageValueArray::VALUE_TYPE_NULL) {
title.SetIsVoid(PR_TRUE);
} else {
rv = mDBGetURLPageInfo->GetString(kGetInfoIndex_Title, title);
NS_ENSURE_SUCCESS(rv, rv);
}
// user title
rv = mDBGetURLPageInfo->GetTypeOfIndex(kGetInfoIndex_UserTitle, &titleType);
NS_ENSURE_SUCCESS(rv, rv);
if (titleType == mozIStorageValueArray::VALUE_TYPE_NULL) {
userTitle.SetIsVoid(PR_TRUE);
} else {
rv = mDBGetURLPageInfo->GetString(kGetInfoIndex_UserTitle, userTitle);
NS_ENSURE_SUCCESS(rv, rv);
}
}
// It is actually common to set the title to be the same thing it used to
// be. For example, going to any web page will always cause a title to be set,
// even though it will often be unchanged since the last visit. In these
// cases, we can avoid DB writing and (most significantly) observer overhead.
if (aIsUserTitle && aTitle.IsVoid() == userTitle.IsVoid() &&
aTitle == userTitle)
return NS_OK;
if (! aIsUserTitle && aTitle.IsVoid() == title.IsVoid() &&
aTitle == title)
return NS_OK;
nsCOMPtr<mozIStorageStatement> dbModStatement;
if (aIsUserTitle) {
userTitle = aTitle;
rv = mDBConn->CreateStatement(
NS_LITERAL_CSTRING("UPDATE moz_history SET user_title = ?1 WHERE url = ?2"),
getter_AddRefs(dbModStatement));
} else {
title = aTitle;
rv = mDBConn->CreateStatement(
NS_LITERAL_CSTRING("UPDATE moz_history SET title = ?1 WHERE url = ?2"),
getter_AddRefs(dbModStatement));
}
NS_ENSURE_SUCCESS(rv, rv);
// title
if (aTitle.IsVoid())
dbModStatement->BindNullParameter(0);
else
dbModStatement->BindStringParameter(0, aTitle);
NS_ENSURE_SUCCESS(rv, rv);
// url
rv = BindStatementURI(dbModStatement, 1, aURI);
NS_ENSURE_SUCCESS(rv, rv);
rv = dbModStatement->Execute();
NS_ENSURE_SUCCESS(rv, rv);
transaction.Commit();
// observers (have to check first if it's bookmarked)
ENUMERATE_WEAKARRAY(mObservers, nsINavHistoryObserver,
OnTitleChanged(aURI, title, userTitle, aIsUserTitle))
return NS_OK;
}
// nsNavHistory::ImportFromMork
//
// FIXME: this is basically a hack, but it works.
@ -3499,6 +3593,34 @@ nsNavHistoryQueryOptions::SetForceOriginalTitle(PRBool aForce)
return NS_OK;
}
// includeHidden
NS_IMETHODIMP
nsNavHistoryQueryOptions::GetIncludeHidden(PRBool* aIncludeHidden)
{
*aIncludeHidden = mIncludeHidden;
return NS_OK;
}
NS_IMETHODIMP
nsNavHistoryQueryOptions::SetIncludeHidden(PRBool aIncludeHidden)
{
mIncludeHidden = aIncludeHidden;
return NS_OK;
}
// maxResults
NS_IMETHODIMP
nsNavHistoryQueryOptions::GetMaxResults(PRUint32* aMaxResults)
{
*aMaxResults = mMaxResults;
return NS_OK;
}
NS_IMETHODIMP
nsNavHistoryQueryOptions::SetMaxResults(PRUint32 aMaxResults)
{
mMaxResults = aMaxResults;
return NS_OK;
}
NS_IMETHODIMP
nsNavHistoryQueryOptions::Clone(nsINavHistoryQueryOptions** aResult)
{