mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-03 04:27:41 +00:00
fix for bug #380735: Persist open state of the "age in days" and "site" containers in the history sidebar
r=dietrich
This commit is contained in:
parent
36d0e4b7e3
commit
de83adb19b
@ -837,8 +837,8 @@ PlacesTreeView.prototype = {
|
||||
|
||||
_getResourceForNode : function PTV_getResourceForNode(aNode)
|
||||
{
|
||||
// XXXndeakin bug 380735, need to support day/host containers as well
|
||||
var uri = aNode.uri;
|
||||
NS_ASSERT(uri, "if there is no uri, we can't persist the open state");
|
||||
return uri ? PlacesUtils.RDF.GetResource(uri) : null;
|
||||
},
|
||||
|
||||
|
@ -69,6 +69,7 @@
|
||||
#include "prsystem.h"
|
||||
#include "prtime.h"
|
||||
#include "prprf.h"
|
||||
#include "nsEscape.h"
|
||||
|
||||
#include "mozIStorageService.h"
|
||||
#include "mozIStorageConnection.h"
|
||||
@ -2035,7 +2036,8 @@ nsNavHistory::ExecuteQueries(nsINavHistoryQuery** aQueries, PRUint32 aQueryCount
|
||||
// it ANDed with the all the rest of the queries.
|
||||
|
||||
nsresult
|
||||
nsNavHistory::GetQueryResults(const nsCOMArray<nsNavHistoryQuery>& aQueries,
|
||||
nsNavHistory::GetQueryResults(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryQuery>& aQueries,
|
||||
nsNavHistoryQueryOptions *aOptions,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aResults)
|
||||
{
|
||||
@ -2254,13 +2256,13 @@ nsNavHistory::GetQueryResults(const nsCOMArray<nsNavHistoryQuery>& aQueries,
|
||||
// keyword searching with grouping: need intermediate filtered results
|
||||
nsCOMArray<nsNavHistoryResultNode> filteredResults;
|
||||
FilterResultSet(toplevel, &filteredResults, aQueries[0]->SearchTerms());
|
||||
rv = RecursiveGroup(filteredResults, groupings, groupCount,
|
||||
rv = RecursiveGroup(aResultNode, filteredResults, groupings, groupCount,
|
||||
aResults);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
} else {
|
||||
// group unfiltered results
|
||||
rv = RecursiveGroup(toplevel, groupings, groupCount, aResults);
|
||||
rv = RecursiveGroup(aResultNode, toplevel, groupings, groupCount, aResults);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
}
|
||||
@ -3571,7 +3573,8 @@ nsNavHistory::ResultsAsList(mozIStorageStatement* statement,
|
||||
// single level of grouping.
|
||||
|
||||
nsresult
|
||||
nsNavHistory::RecursiveGroup(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsNavHistory::RecursiveGroup(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
const PRUint16* aGroupingMode, PRUint32 aGroupCount,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aDest)
|
||||
{
|
||||
@ -3582,13 +3585,13 @@ nsNavHistory::RecursiveGroup(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsresult rv;
|
||||
switch (aGroupingMode[0]) {
|
||||
case nsINavHistoryQueryOptions::GROUP_BY_DAY:
|
||||
rv = GroupByDay(aSource, aDest);
|
||||
rv = GroupByDay(aResultNode, aSource, aDest);
|
||||
break;
|
||||
case nsINavHistoryQueryOptions::GROUP_BY_HOST:
|
||||
rv = GroupByHost(aSource, aDest, PR_FALSE);
|
||||
rv = GroupByHost(aResultNode, aSource, aDest, PR_FALSE);
|
||||
break;
|
||||
case nsINavHistoryQueryOptions::GROUP_BY_DOMAIN:
|
||||
rv = GroupByHost(aSource, aDest, PR_TRUE);
|
||||
rv = GroupByHost(aResultNode, aSource, aDest, PR_TRUE);
|
||||
break;
|
||||
case nsINavHistoryQueryOptions::GROUP_BY_FOLDER:
|
||||
// not yet supported (this code path is not reached for simple bookmark
|
||||
@ -3609,7 +3612,7 @@ nsNavHistory::RecursiveGroup(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsNavHistoryContainerResultNode* container = curNode->GetAsContainer();
|
||||
nsCOMArray<nsNavHistoryResultNode> temp(container->mChildren);
|
||||
container->mChildren.Clear();
|
||||
rv = RecursiveGroup(temp, &aGroupingMode[1], aGroupCount - 1,
|
||||
rv = RecursiveGroup(aResultNode, temp, &aGroupingMode[1], aGroupCount - 1,
|
||||
&container->mChildren);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
@ -3631,13 +3634,45 @@ GetAgeInDays(PRTime aNormalizedNow, PRTime aDate)
|
||||
return ((aNormalizedNow - dateMidnight) / USECS_PER_DAY);
|
||||
}
|
||||
|
||||
const PRInt64 UNDEFINED_AGE_IN_DAYS = -1;
|
||||
|
||||
// Create a urn (like
|
||||
// urn:places-persist:place:group=0&group=1&sort=1&type=1,,%28local%20files%29)
|
||||
// to be used to persist the open state of this container in localstore.rdf
|
||||
nsresult
|
||||
CreatePlacesPersistURN(nsNavHistoryQueryResultNode *aResultNode,
|
||||
PRInt64 aAgeInDays, const nsCString& aTitle, nsCString& aURN)
|
||||
{
|
||||
nsCAutoString uri;
|
||||
nsresult rv = aResultNode->GetUri(uri);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
aURN.Assign(NS_LITERAL_CSTRING("urn:places-persist:"));
|
||||
aURN.Append(uri);
|
||||
|
||||
aURN.Append(NS_LITERAL_CSTRING(","));
|
||||
if (aAgeInDays != UNDEFINED_AGE_IN_DAYS)
|
||||
aURN.AppendInt(aAgeInDays);
|
||||
|
||||
aURN.Append(NS_LITERAL_CSTRING(","));
|
||||
if (!aTitle.IsEmpty()) {
|
||||
nsCAutoString escapedTitle;
|
||||
PRBool success = NS_Escape(aTitle, escapedTitle, url_XAlphas);
|
||||
NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
|
||||
aURN.Append(escapedTitle);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// XXX todo
|
||||
// we should make "group by date" more flexible and extensible, in order
|
||||
// to allow extension developers to write better history sidebars and viewers
|
||||
// see bug #359346
|
||||
// nsNavHistory::GroupByDay
|
||||
nsresult
|
||||
nsNavHistory::GroupByDay(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsNavHistory::GroupByDay(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aDest)
|
||||
{
|
||||
// 8 == today, yesterday, 2 ago, 3 ago, 4 ago, 5 ago, 6 ago, older than 6
|
||||
@ -3681,8 +3716,12 @@ nsNavHistory::GroupByDay(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
curDateName = dateNames[ageInDays];
|
||||
|
||||
if (!dates[ageInDays]) {
|
||||
nsCAutoString urn;
|
||||
nsresult rv = CreatePlacesPersistURN(aResultNode, ageInDays, EmptyCString(), urn);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// need to create an entry for this date
|
||||
dates[ageInDays] = new nsNavHistoryContainerResultNode(EmptyCString(),
|
||||
dates[ageInDays] = new nsNavHistoryContainerResultNode(urn,
|
||||
curDateName,
|
||||
EmptyCString(),
|
||||
nsNavHistoryResultNode::RESULT_TYPE_DAY,
|
||||
@ -3719,7 +3758,8 @@ nsNavHistory::GroupByDay(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
// we would only be charged the overhead of an empty string on each node.
|
||||
|
||||
nsresult
|
||||
nsNavHistory::GroupByHost(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsNavHistory::GroupByHost(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aDest,
|
||||
PRBool aIsDomain)
|
||||
{
|
||||
@ -3758,7 +3798,11 @@ nsNavHistory::GroupByHost(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsCAutoString title;
|
||||
TitleForDomain(curHostName, title);
|
||||
|
||||
curTopGroup = new nsNavHistoryContainerResultNode(EmptyCString(), title,
|
||||
nsCAutoString urn;
|
||||
nsresult rv = CreatePlacesPersistURN(aResultNode, UNDEFINED_AGE_IN_DAYS, title, urn);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
curTopGroup = new nsNavHistoryContainerResultNode(urn, title,
|
||||
EmptyCString(), nsNavHistoryResultNode::RESULT_TYPE_HOST, PR_TRUE,
|
||||
EmptyCString());
|
||||
if (! curTopGroup)
|
||||
@ -3766,7 +3810,8 @@ nsNavHistory::GroupByHost(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
|
||||
if (! hosts.Put(curHostName, curTopGroup))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
nsresult rv = aDest->AppendObject(curTopGroup);
|
||||
|
||||
rv = aDest->AppendObject(curTopGroup);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
if (! curTopGroup->mChildren.AppendObject(aSource[i]))
|
||||
|
@ -247,7 +247,8 @@ public:
|
||||
|
||||
// this actually executes a query and gives you results, it is used by
|
||||
// nsNavHistoryQueryResultNode
|
||||
nsresult GetQueryResults(const nsCOMArray<nsNavHistoryQuery>& aQueries,
|
||||
nsresult GetQueryResults(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryQuery>& aQueries,
|
||||
nsNavHistoryQueryOptions *aOptions,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aResults);
|
||||
|
||||
@ -299,7 +300,8 @@ public:
|
||||
static void DomainNameFromHostName(const nsCString& aHostName,
|
||||
nsACString& aDomainName);
|
||||
static PRTime NormalizeTime(PRUint32 aRelative, PRTime aOffset);
|
||||
nsresult RecursiveGroup(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsresult RecursiveGroup(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
const PRUint16* aGroupingMode, PRUint32 aGroupCount,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aDest);
|
||||
|
||||
@ -499,10 +501,12 @@ protected:
|
||||
nsresult SetPageTitleInternal(nsIURI* aURI, PRBool aIsUserTitle,
|
||||
const nsAString& aTitle);
|
||||
|
||||
nsresult GroupByDay(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aDest);
|
||||
nsresult GroupByDay(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aDest);
|
||||
|
||||
nsresult GroupByHost(const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsresult GroupByHost(nsNavHistoryQueryResultNode *aResultNode,
|
||||
const nsCOMArray<nsNavHistoryResultNode>& aSource,
|
||||
nsCOMArray<nsNavHistoryResultNode>* aDest,
|
||||
PRBool aIsDomain);
|
||||
|
||||
|
@ -2120,7 +2120,7 @@ nsNavHistoryQueryResultNode::FillChildren()
|
||||
// get the results from the history service
|
||||
nsresult rv = VerifyQueriesParsed();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = history->GetQueryResults(mQueries, mOptions, &mChildren);
|
||||
rv = history->GetQueryResults(this, mQueries, mOptions, &mChildren);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// it is important to call FillStats to fill in the parents on all
|
||||
@ -2398,7 +2398,7 @@ nsNavHistoryQueryResultNode::OnVisit(nsIURI* aURI, PRInt64 aVisitId,
|
||||
nsCOMArray<nsNavHistoryResultNode> itemSource;
|
||||
if (! itemSource.AppendObject(addition))
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
history->RecursiveGroup(itemSource, groupings, groupCount, &grouped);
|
||||
history->RecursiveGroup(this, itemSource, groupings, groupCount, &grouped);
|
||||
} else {
|
||||
// no grouping
|
||||
if (! grouped.AppendObject(addition))
|
||||
|
Loading…
x
Reference in New Issue
Block a user