diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/components/downloads/nsDownloadManager.cpp index 0146e56d734e..ac7da5230fdb 100644 --- a/toolkit/components/downloads/nsDownloadManager.cpp +++ b/toolkit/components/downloads/nsDownloadManager.cpp @@ -2327,7 +2327,7 @@ NS_IMETHODIMP nsDownloadManager::OnVisit(nsIURI *aURI, int64_t aVisitID, PRTime aTime, int64_t aSessionID, int64_t aReferringID, uint32_t aTransitionType, const nsACString& aGUID, - uint32_t *aAdded) + bool aHidden) { return NS_OK; } diff --git a/toolkit/components/places/History.cpp b/toolkit/components/places/History.cpp index d8492271ad4f..f2044d9b4b7f 100644 --- a/toolkit/components/places/History.cpp +++ b/toolkit/components/places/History.cpp @@ -458,14 +458,13 @@ public: nsCOMPtr uri; (void)NS_NewURI(getter_AddRefs(uri), mPlace.spec); - // Notify nsNavHistory observers of visit, but only for certain types of - // visits to maintain consistency with nsNavHistory::GetQueryResults. - if (!mPlace.hidden && - mPlace.transitionType != nsINavHistoryService::TRANSITION_EMBED && - mPlace.transitionType != nsINavHistoryService::TRANSITION_FRAMED_LINK) { + // Notify the visit. Note that TRANSITION_EMBED visits are never added + // to the database, thus cannot be queried and we don't notify them. + if (mPlace.transitionType != nsINavHistoryService::TRANSITION_EMBED) { navHistory->NotifyOnVisit(uri, mPlace.visitId, mPlace.visitTime, mPlace.sessionId, mReferrer.visitId, - mPlace.transitionType, mPlace.guid); + mPlace.transitionType, mPlace.guid, + mPlace.hidden); } nsCOMPtr obsService = diff --git a/toolkit/components/places/nsINavHistoryService.idl b/toolkit/components/places/nsINavHistoryService.idl index 20a89f1bdda1..cb1c1060f772 100644 --- a/toolkit/components/places/nsINavHistoryService.idl +++ b/toolkit/components/places/nsINavHistoryService.idl @@ -650,7 +650,7 @@ interface nsINavHistoryResult : nsISupports * DANGER! If you are in the middle of a batch transaction, there may be a * database transaction active. You can still access the DB, but be careful. */ -[scriptable, uuid(c837f6ba-6ad7-4810-a425-8ce29e05d17e)] +[scriptable, uuid(eb264079-8766-4e66-b9bf-2c8b586c74d3)] interface nsINavHistoryObserver : nsISupports { /** @@ -680,10 +680,7 @@ interface nsINavHistoryObserver : nsISupports * @param aReferringID The ID of the visit the user came from. 0 if empty. * @param aTransitionType One of nsINavHistory.TRANSITION_* * @param aGUID The unique ID associated with the page. - * @param aAdded Incremented by query nodes when the visited uri - * belongs to them. If no such query exists, the - * history result creates a new query node dynamically. - * It is used in places views only and can be ignored. + * @param aHidden Whether the visited page is marked as hidden. */ void onVisit(in nsIURI aURI, in long long aVisitID, @@ -692,7 +689,7 @@ interface nsINavHistoryObserver : nsISupports in long long aReferringID, in unsigned long aTransitionType, in ACString aGUID, - out unsigned long aAdded); + in boolean aHidden); /** * Called whenever either the "real" title or the custom title of the page diff --git a/toolkit/components/places/nsNavBookmarks.cpp b/toolkit/components/places/nsNavBookmarks.cpp index 792aa0a6f75a..890110dc1118 100644 --- a/toolkit/components/places/nsNavBookmarks.cpp +++ b/toolkit/components/places/nsNavBookmarks.cpp @@ -50,10 +50,10 @@ using namespace mozilla; // These columns sit to the right of the kGetInfoIndex_* columns. -const int32_t nsNavBookmarks::kGetChildrenIndex_Position = 14; -const int32_t nsNavBookmarks::kGetChildrenIndex_Type = 15; -const int32_t nsNavBookmarks::kGetChildrenIndex_PlaceID = 16; -const int32_t nsNavBookmarks::kGetChildrenIndex_Guid = 17; +const int32_t nsNavBookmarks::kGetChildrenIndex_Position = 15; +const int32_t nsNavBookmarks::kGetChildrenIndex_Type = 16; +const int32_t nsNavBookmarks::kGetChildrenIndex_PlaceID = 17; +const int32_t nsNavBookmarks::kGetChildrenIndex_Guid = 18; using namespace mozilla::places; @@ -1070,7 +1070,8 @@ nsNavBookmarks::GetDescendantChildren(int64_t aFolderId, nsCOMPtr stmt = mDB->GetStatement( "SELECT h.id, h.url, IFNULL(b.title, h.title), h.rev_host, h.visit_count, " "h.last_visit_date, f.url, null, b.id, b.dateAdded, b.lastModified, " - "b.parent, null, h.frecency, b.position, b.type, b.fk, b.guid " + "b.parent, null, h.frecency, h.hidden, b.position, b.type, b.fk, " + "b.guid " "FROM moz_bookmarks b " "LEFT JOIN moz_places h ON b.fk = h.id " "LEFT JOIN moz_favicons f ON h.favicon_id = f.id " @@ -1782,7 +1783,7 @@ nsNavBookmarks::QueryFolderChildren( nsCOMPtr stmt = mDB->GetStatement( "SELECT h.id, h.url, IFNULL(b.title, h.title), h.rev_host, h.visit_count, " "h.last_visit_date, f.url, null, b.id, b.dateAdded, b.lastModified, " - "b.parent, null, h.frecency, b.position, b.type, b.fk, " + "b.parent, null, h.frecency, h.hidden, b.position, b.type, b.fk, " "b.guid " "FROM moz_bookmarks b " "LEFT JOIN moz_places h ON b.fk = h.id " @@ -1916,7 +1917,7 @@ nsNavBookmarks::QueryFolderChildrenAsync( nsCOMPtr stmt = mDB->GetAsyncStatement( "SELECT h.id, h.url, IFNULL(b.title, h.title), h.rev_host, h.visit_count, " "h.last_visit_date, f.url, null, b.id, b.dateAdded, b.lastModified, " - "b.parent, null, h.frecency, b.position, b.type, b.fk, " + "b.parent, null, h.frecency, h.hidden, b.position, b.type, b.fk, " "b.guid " "FROM moz_bookmarks b " "LEFT JOIN moz_places h ON b.fk = h.id " @@ -2775,7 +2776,7 @@ NS_IMETHODIMP nsNavBookmarks::OnVisit(nsIURI* aURI, int64_t aVisitId, PRTime aTime, int64_t aSessionID, int64_t aReferringID, uint32_t aTransitionType, const nsACString& aGUID, - uint32_t* aAdded) + bool aHidden) { // If the page is bookmarked, notify observers for each associated bookmark. ItemVisitData visitData; diff --git a/toolkit/components/places/nsNavHistory.cpp b/toolkit/components/places/nsNavHistory.cpp index 8fc9d6c974f2..c2343491ca8e 100644 --- a/toolkit/components/places/nsNavHistory.cpp +++ b/toolkit/components/places/nsNavHistory.cpp @@ -101,7 +101,7 @@ using namespace mozilla::places; // for repeating stuff. These are milliseconds between "now" cache refreshes. #define RENEW_CACHED_NOW_TIMEOUT ((int32_t)3 * PR_MSEC_PER_SEC) -static const int64_t USECS_PER_DAY = PR_USEC_PER_SEC * 60 * 60 * 24; +static const int64_t USECS_PER_DAY = (int64_t)PR_USEC_PER_SEC * 60 * 60 * 24; // character-set annotation #define CHARSET_ANNO NS_LITERAL_CSTRING("URIProperties/characterSet") @@ -251,6 +251,7 @@ const int32_t nsNavHistory::kGetInfoIndex_ItemLastModified = 10; const int32_t nsNavHistory::kGetInfoIndex_ItemParentId = 11; const int32_t nsNavHistory::kGetInfoIndex_ItemTags = 12; const int32_t nsNavHistory::kGetInfoIndex_Frecency = 13; +const int32_t nsNavHistory::kGetInfoIndex_Hidden = 14; PLACES_FACTORY_SINGLETON_IMPLEMENTATION(nsNavHistory, gHistoryService) @@ -731,15 +732,15 @@ nsNavHistory::NotifyOnVisit(nsIURI* aURI, int64_t aSessionID, int64_t referringVisitID, int32_t aTransitionType, - const nsACString& aGUID) + const nsACString& aGUID, + bool aHidden) { - uint32_t added = 0; MOZ_ASSERT(!aGUID.IsEmpty()); mHasHistoryEntries = 1; NOTIFY_OBSERVERS(mCanNotify, mCacheObservers, mObservers, nsINavHistoryObserver, OnVisit(aURI, aVisitID, aTime, aSessionID, - referringVisitID, aTransitionType, aGUID, &added)); + referringVisitID, aTransitionType, aGUID, aHidden)); } void @@ -962,6 +963,10 @@ nsNavHistory::EvaluateQueryForNode(const nsCOMArray& aQueries // lazily created from the node's string when we need to match URIs nsCOMPtr nodeUri; + // --- hidden --- + if (aNode->mHidden && !aOptions->IncludeHidden()) + return false; + for (int32_t i = 0; i < aQueries.Count(); i ++) { bool hasIt; nsCOMPtr query = aQueries[i]; @@ -1392,11 +1397,7 @@ nsNavHistory::AddVisit(nsIURI* aURI, PRTime aTime, nsIURI* aReferringURI, scoper.Abandon(); // Hide only embedded links and redirects - // See the hidden computation code above for a little more explanation. - hidden = (int32_t)(aTransitionType == TRANSITION_EMBED || - aTransitionType == TRANSITION_FRAMED_LINK || - aIsRedirect); - + hidden = (int32_t)GetHiddenState(aIsRedirect, aTransitionType); typed = (int32_t)(aTransitionType == TRANSITION_TYPED); // set as visited once, no title @@ -1433,13 +1434,10 @@ nsNavHistory::AddVisit(nsIURI* aURI, PRTime aTime, nsIURI* aReferringURI, // important to notify the observers below. (void)UpdateFrecency(pageID); - // Notify observers: The hidden detection code must match that in - // GetQueryResults to maintain consistency. - // FIXME bug 325241: make a way to observe hidden URLs - if (!hidden) { - NotifyOnVisit(aURI, *aVisitID, aTime, aSessionID, referringVisitID, - aTransitionType, guid); - } + // Notify the visit. Note that TRANSITION_EMBED visits are never added + // to the database, thus cannot be queried and we don't notify them. + NotifyOnVisit(aURI, *aVisitID, aTime, aSessionID, referringVisitID, + aTransitionType, guid, hidden); // Normally docshell sends the link visited observer notification for us (this // will tell all the documents to update their visited link coloring). @@ -1804,7 +1802,7 @@ PlacesSQLQueryBuilder::SelectAsURI() mQueryString = NS_LITERAL_CSTRING( "SELECT h.id, h.url, h.title AS page_title, h.rev_host, h.visit_count, " "h.last_visit_date, f.url, null, null, null, null, null, ") + - tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency " + tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_places h " "LEFT JOIN moz_favicons f ON h.favicon_id = f.id " // WHERE 1 is a no-op since additonal conditions will start with AND. @@ -1830,7 +1828,7 @@ PlacesSQLQueryBuilder::SelectAsURI() "SELECT b2.fk, h.url, COALESCE(b2.title, h.title) AS page_title, " "h.rev_host, h.visit_count, h.last_visit_date, f.url, null, b2.id, " "b2.dateAdded, b2.lastModified, b2.parent, ") + - tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency " + tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_bookmarks b2 " "JOIN (SELECT b.fk " "FROM moz_bookmarks b " @@ -1854,7 +1852,7 @@ PlacesSQLQueryBuilder::SelectAsURI() "SELECT b.fk, h.url, COALESCE(b.title, h.title) AS page_title, " "h.rev_host, h.visit_count, h.last_visit_date, f.url, null, b.id, " "b.dateAdded, b.lastModified, b.parent, ") + - tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency " + tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_bookmarks b " "JOIN moz_places h ON b.fk = h.id " "LEFT OUTER JOIN moz_favicons f ON h.favicon_id = f.id " @@ -1886,7 +1884,7 @@ PlacesSQLQueryBuilder::SelectAsVisit() mQueryString = NS_LITERAL_CSTRING( "SELECT h.id, h.url, h.title AS page_title, h.rev_host, h.visit_count, " "v.visit_date, f.url, v.session, null, null, null, null, ") + - tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency " + tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_places h " "JOIN moz_historyvisits v ON h.id = v.place_id " "LEFT JOIN moz_favicons f ON h.favicon_id = f.id " @@ -1921,7 +1919,7 @@ PlacesSQLQueryBuilder::SelectAsDay() mQueryString = nsPrintfCString( "SELECT null, " "'place:type=%ld&sort=%ld&beginTime='||beginTime||'&endTime='||endTime, " - "dayTitle, null, null, beginTime, null, null, null, null, null, null " + "dayTitle, null, null, beginTime, null, null, null, null, null, null, null " "FROM (", // TOUTER BEGIN resultType, sortingMode); @@ -2124,7 +2122,7 @@ PlacesSQLQueryBuilder::SelectAsSite() mQueryString = nsPrintfCString( "SELECT null, 'place:type=%ld&sort=%ld&domain=&domainIsHost=true'%s, " - ":localhost, :localhost, null, null, null, null, null, null, null " + ":localhost, :localhost, null, null, null, null, null, null, null, null " "WHERE EXISTS ( " "SELECT h.id FROM moz_places h " "%s " @@ -2137,7 +2135,7 @@ PlacesSQLQueryBuilder::SelectAsSite() "UNION ALL " "SELECT null, " "'place:type=%ld&sort=%ld&domain='||host||'&domainIsHost=true'%s, " - "host, host, null, null, null, null, null, null, null " + "host, host, null, null, null, null, null, null, null, null " "FROM ( " "SELECT get_unreversed_host(h.rev_host) AS host " "FROM moz_places h " @@ -2177,7 +2175,7 @@ PlacesSQLQueryBuilder::SelectAsTag() mQueryString = nsPrintfCString( "SELECT null, 'place:folder=' || id || '&queryType=%d&type=%ld', " "title, null, null, null, null, null, null, dateAdded, " - "lastModified, null, null " + "lastModified, null, null, null " "FROM moz_bookmarks " "WHERE parent = %lld", nsINavHistoryQueryOptions::QUERY_TYPE_BOOKMARKS, @@ -2411,7 +2409,7 @@ nsNavHistory::ConstructQueryString( queryString = NS_LITERAL_CSTRING( "SELECT h.id, h.url, h.title AS page_title, h.rev_host, h.visit_count, h.last_visit_date, " "f.url, null, null, null, null, null, ") + - tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency " + tagsSqlFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_places h " "LEFT OUTER JOIN moz_favicons f ON h.favicon_id = f.id " "WHERE h.hidden = 0 " @@ -4478,6 +4476,9 @@ nsNavHistory::RowToResult(mozIStorageValueArray* aRow, (*aResult)->mLastModified = aRow->AsInt64(kGetInfoIndex_ItemLastModified); } + (*aResult)->mFrecency = aRow->AsInt32(kGetInfoIndex_Frecency); + (*aResult)->mHidden = !!aRow->AsInt32(kGetInfoIndex_Hidden); + nsAutoString tags; rv = aRow->GetString(kGetInfoIndex_ItemTags, tags); NS_ENSURE_SUCCESS(rv, rv); @@ -4600,7 +4601,7 @@ nsNavHistory::VisitIdToResultNode(int64_t visitId, statement = mDB->GetStatement(NS_LITERAL_CSTRING( "SELECT h.id, h.url, h.title, h.rev_host, h.visit_count, " "v.visit_date, f.url, v.session, null, null, null, null, " - ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency " + ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_places h " "JOIN moz_historyvisits v ON h.id = v.place_id " "LEFT JOIN moz_favicons f ON h.favicon_id = f.id " @@ -4614,7 +4615,7 @@ nsNavHistory::VisitIdToResultNode(int64_t visitId, statement = mDB->GetStatement(NS_LITERAL_CSTRING( "SELECT h.id, h.url, h.title, h.rev_host, h.visit_count, " "h.last_visit_date, f.url, null, null, null, null, null, " - ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency " + ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_places h " "JOIN moz_historyvisits v ON h.id = v.place_id " "LEFT JOIN moz_favicons f ON h.favicon_id = f.id " @@ -4660,7 +4661,7 @@ nsNavHistory::BookmarkIdToResultNode(int64_t aBookmarkId, nsNavHistoryQueryOptio "SELECT b.fk, h.url, COALESCE(b.title, h.title), " "h.rev_host, h.visit_count, h.last_visit_date, f.url, null, b.id, " "b.dateAdded, b.lastModified, b.parent, " - ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency " + ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_bookmarks b " "JOIN moz_places h ON b.fk = h.id " "LEFT JOIN moz_favicons f ON h.favicon_id = f.id " @@ -4699,7 +4700,7 @@ nsNavHistory::URIToResultNode(nsIURI* aURI, nsCOMPtr stmt = mDB->GetStatement(NS_LITERAL_CSTRING( "SELECT h.id, :page_url, h.title, h.rev_host, h.visit_count, " "h.last_visit_date, f.url, null, null, null, null, null, " - ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency " + ) + tagsFragment + NS_LITERAL_CSTRING(", h.frecency, h.hidden " "FROM moz_places h " "LEFT JOIN moz_favicons f ON h.favicon_id = f.id " "WHERE h.url = :page_url ") diff --git a/toolkit/components/places/nsNavHistory.h b/toolkit/components/places/nsNavHistory.h index c47451bc9342..3f2441a33df8 100644 --- a/toolkit/components/places/nsNavHistory.h +++ b/toolkit/components/places/nsNavHistory.h @@ -217,6 +217,7 @@ public: static const int32_t kGetInfoIndex_ItemParentId; static const int32_t kGetInfoIndex_ItemTags; static const int32_t kGetInfoIndex_Frecency; + static const int32_t kGetInfoIndex_Hidden; int64_t GetTagsFolder(); @@ -411,7 +412,8 @@ public: int64_t aSessionID, int64_t referringVisitID, int32_t aTransitionType, - const nsACString& aGUID); + const nsACString& aGUID, + bool aHidden); /** * Fires onTitleChanged event to nsINavHistoryService observers diff --git a/toolkit/components/places/nsNavHistoryResult.cpp b/toolkit/components/places/nsNavHistoryResult.cpp index c85ae763530e..77a2dcc6c2d8 100644 --- a/toolkit/components/places/nsNavHistoryResult.cpp +++ b/toolkit/components/places/nsNavHistoryResult.cpp @@ -105,7 +105,8 @@ nsNavHistoryResultNode::nsNavHistoryResultNode( mDateAdded(0), mLastModified(0), mIndentLevel(-1), - mFrecency(0) + mFrecency(0), + mHidden(false) { mTags.SetIsVoid(true); } @@ -2529,8 +2530,12 @@ nsNavHistoryQueryResultNode::OnVisit(nsIURI* aURI, int64_t aVisitId, int64_t aReferringId, uint32_t aTransitionType, const nsACString& aGUID, + bool aHidden, uint32_t* aAdded) { + if (aHidden && !mOptions->IncludeHidden()) + return NS_OK; + nsNavHistoryResult* result = GetResult(); NS_ENSURE_STATE(result); if (result->mBatchInProgress && @@ -4719,13 +4724,13 @@ NS_IMETHODIMP nsNavHistoryResult::OnVisit(nsIURI* aURI, int64_t aVisitId, PRTime aTime, int64_t aSessionId, int64_t aReferringId, uint32_t aTransitionType, const nsACString& aGUID, - uint32_t* aAdded) + bool aHidden) { uint32_t added = 0; ENUMERATE_HISTORY_OBSERVERS(OnVisit(aURI, aVisitId, aTime, aSessionId, aReferringId, aTransitionType, aGUID, - &added)); + aHidden, &added)); if (!mRootNode->mExpanded) return NS_OK; diff --git a/toolkit/components/places/nsNavHistoryResult.h b/toolkit/components/places/nsNavHistoryResult.h index 7ecc7a2a0345..f337c7a01028 100644 --- a/toolkit/components/places/nsNavHistoryResult.h +++ b/toolkit/components/places/nsNavHistoryResult.h @@ -61,12 +61,8 @@ private: // Declare methods for implementing nsINavBookmarkObserver // and nsINavHistoryObserver (some methods, such as BeginUpdateBatch overlap) -#define NS_DECL_BOOKMARK_HISTORY_OBSERVER \ +#define NS_DECL_BOOKMARK_HISTORY_OBSERVER_BASE \ NS_DECL_NSINAVBOOKMARKOBSERVER \ - NS_IMETHOD OnVisit(nsIURI* aURI, int64_t aVisitId, PRTime aTime, \ - int64_t aSessionId, int64_t aReferringId, \ - uint32_t aTransitionType, const nsACString& aGUID, \ - uint32_t* aAdded); \ NS_IMETHOD OnTitleChanged(nsIURI* aURI, const nsAString& aPageTitle, \ const nsACString& aGUID); \ NS_IMETHOD OnBeforeDeleteURI(nsIURI *aURI, const nsACString& aGUID, \ @@ -80,6 +76,24 @@ private: NS_IMETHOD OnDeleteVisits(nsIURI* aURI, PRTime aVisitTime, \ const nsACString& aGUID, uint16_t aReason); +// The internal version has an output aAdded parameter, it is incremented by +// query nodes when the visited uri belongs to them. If no such query exists, +// the history result creates a new query node dynamically. +#define NS_DECL_BOOKMARK_HISTORY_OBSERVER_INTERNAL \ + NS_DECL_BOOKMARK_HISTORY_OBSERVER_BASE \ + NS_IMETHOD OnVisit(nsIURI* aURI, int64_t aVisitId, PRTime aTime, \ + int64_t aSessionId, int64_t aReferringId, \ + uint32_t aTransitionType, const nsACString& aGUID, \ + bool aHidden, uint32_t* aAdded); + +// The external version is used by results. +#define NS_DECL_BOOKMARK_HISTORY_OBSERVER_EXTERNAL \ + NS_DECL_BOOKMARK_HISTORY_OBSERVER_BASE \ + NS_IMETHOD OnVisit(nsIURI* aURI, int64_t aVisitId, PRTime aTime, \ + int64_t aSessionId, int64_t aReferringId, \ + uint32_t aTransitionType, const nsACString& aGUID, \ + bool aHidden); + // nsNavHistoryResult // // nsNavHistory creates this object and fills in mChildren (by getting @@ -106,7 +120,7 @@ public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_NSINAVHISTORYRESULT - NS_DECL_BOOKMARK_HISTORY_OBSERVER + NS_DECL_BOOKMARK_HISTORY_OBSERVER_EXTERNAL NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsNavHistoryResult, nsINavHistoryResult) void AddHistoryObserver(nsNavHistoryQueryResultNode* aNode); @@ -362,7 +376,11 @@ public: // root's children will have a value of 0, and so on. int32_t mIndentLevel; - int32_t mFrecency; // Containers have 0 frecency. + // Frecency of the page. Valid only for URI nodes. + int32_t mFrecency; + + // Hidden status of the page. Valid only for URI nodes. + bool mHidden; }; NS_DEFINE_STATIC_IID_ACCESSOR(nsNavHistoryResultNode, NS_NAVHISTORYRESULTNODE_IID) @@ -695,7 +713,7 @@ public: virtual nsresult OpenContainer(); - NS_DECL_BOOKMARK_HISTORY_OBSERVER + NS_DECL_BOOKMARK_HISTORY_OBSERVER_INTERNAL virtual void OnRemoving(); public: diff --git a/toolkit/components/places/tests/browser/browser_redirect.js b/toolkit/components/places/tests/browser/browser_redirect.js index 15d47cf6f824..9104f0dce958 100644 --- a/toolkit/components/places/tests/browser/browser_redirect.js +++ b/toolkit/components/places/tests/browser/browser_redirect.js @@ -16,12 +16,20 @@ function test() { // Create and add history observer. let historyObserver = { + _redirectNotified: false, onVisit: function (aURI, aVisitID, aTime, aSessionID, aReferringID, aTransitionType) { info("Received onVisit: " + aURI.spec); + + if (aURI.equals(REDIRECT_URI)) { + this._redirectNotified = true; + // Wait for the target page notification. + return; + } + PlacesUtils.history.removeObserver(historyObserver); - ok(aURI.equals(TARGET_URI), "The redirect source should not be notified"); + ok(this._redirectNotified, "The redirect should have been notified"); fieldForUrl(REDIRECT_URI, "frecency", function (aFrecency) { ok(aFrecency != 0, "Frecency or the redirecting page should not be 0"); diff --git a/toolkit/components/places/tests/queries/test_searchTerms_includeHidden.js b/toolkit/components/places/tests/queries/test_searchTerms_includeHidden.js index 8556ea9e9dd0..fb630d4f0362 100644 --- a/toolkit/components/places/tests/queries/test_searchTerms_includeHidden.js +++ b/toolkit/components/places/tests/queries/test_searchTerms_includeHidden.js @@ -24,6 +24,15 @@ const VISITS = [ } ]; +const HIDDEN_VISITS = [ + { isVisit: true, + transType: TRANSITION_FRAMED_LINK, + uri: "http://hidden.example.com/", + title: "red", + lastVisit: timeInMicroseconds-- + }, +]; + const TEST_DATA = [ { searchTerms: "example", includeHidden: true, @@ -33,7 +42,7 @@ const TEST_DATA = [ includeHidden: false, expectedResults: 1 }, - { searchTerms: "redir", + { searchTerms: "red", includeHidden: true, expectedResults: 1 } @@ -59,8 +68,17 @@ add_task(function test_searchTerms_includeHidden() let root = PlacesUtils.history.executeQuery(query, options).root; root.containerOpen = true; + let cc = root.childCount; + // Live update with hidden visits. + yield task_populateDB(HIDDEN_VISITS); + let cc_update = root.childCount; + root.containerOpen = false; + do_check_eq(cc, data.expectedResults); + do_check_eq(cc_update, data.expectedResults + (data.includeHidden ? 1 : 0)); + + PlacesUtils.bhistory.removePage(uri("http://hidden.example.com/")); } }); diff --git a/toolkit/components/places/tests/queries/test_sorting.js b/toolkit/components/places/tests/queries/test_sorting.js index 8d9f752256e4..a9061f7593c7 100644 --- a/toolkit/components/places/tests/queries/test_sorting.js +++ b/toolkit/components/places/tests/queries/test_sorting.js @@ -1228,9 +1228,9 @@ tests.push({ ]; this._sortedData = [ - this._unsortedData[2], this._unsortedData[3], this._unsortedData[5], + this._unsortedData[2], ]; // This function in head_queries.js creates our database with the above data diff --git a/toolkit/components/places/tests/unit/test_history_observer.js b/toolkit/components/places/tests/unit/test_history_observer.js index 9eea362171b7..5d7380e7553e 100644 --- a/toolkit/components/places/tests/unit/test_history_observer.js +++ b/toolkit/components/places/tests/unit/test_history_observer.js @@ -38,14 +38,14 @@ function onNotify(callback) { } /** - * Asynchronous task that adds a TRANSITION_TYPED visit to the history database. + * Asynchronous task that adds a visit to the history database. */ -function task_add_visit(uri, timestamp) { +function task_add_visit(uri, timestamp, transition) { uri = uri || NetUtil.newURI("http://firefox.com/"); timestamp = timestamp || Date.now() * 1000; yield promiseAddVisits({ uri: uri, - transition: TRANSITION_TYPED, + transition: transition || TRANSITION_TYPED, visitDate: timestamp }); throw new Task.Result([uri, timestamp]); @@ -58,14 +58,16 @@ function run_test() { add_task(function test_onVisit() { let promiseNotify = onNotify(function onVisit(aURI, aVisitID, aTime, aSessionID, aReferringID, - aTransitionType, aGUID) { + aTransitionType, aGUID, + aHidden) { do_check_true(aURI.equals(testuri)); do_check_true(aVisitID > 0); do_check_eq(aTime, testtime); do_check_true(aSessionID > 0); do_check_eq(aReferringID, 0); - do_check_eq(aTransitionType, Ci.nsINavHistoryService.TRANSITION_TYPED); + do_check_eq(aTransitionType, TRANSITION_TYPED); do_check_guid_for_uri(aURI, aGUID); + do_check_false(aHidden); }); let testuri = NetUtil.newURI("http://firefox.com/"); let testtime = Date.now() * 1000; @@ -73,6 +75,26 @@ add_task(function test_onVisit() { yield promiseNotify; }); +add_task(function test_onVisit() { + let promiseNotify = onNotify(function onVisit(aURI, aVisitID, aTime, + aSessionID, aReferringID, + aTransitionType, aGUID, + aHidden) { + do_check_true(aURI.equals(testuri)); + do_check_true(aVisitID > 0); + do_check_eq(aTime, testtime); + do_check_true(aSessionID > 0); + do_check_eq(aReferringID, 0); + do_check_eq(aTransitionType, TRANSITION_FRAMED_LINK); + do_check_guid_for_uri(aURI, aGUID); + do_check_true(aHidden); + }); + let testuri = NetUtil.newURI("http://hidden.firefox.com/"); + let testtime = Date.now() * 1000; + yield task_add_visit(testuri, testtime, TRANSITION_FRAMED_LINK); + yield promiseNotify; +}); + add_task(function test_onBeforeDeleteURI() { let promiseNotify = onNotify(function onBeforeDeleteURI(aURI, aGUID, aReason) {