summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/nsNavBookmarks.h
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/places/nsNavBookmarks.h')
-rw-r--r--toolkit/components/places/nsNavBookmarks.h308
1 files changed, 308 insertions, 0 deletions
diff --git a/toolkit/components/places/nsNavBookmarks.h b/toolkit/components/places/nsNavBookmarks.h
new file mode 100644
index 0000000000..ab3fd1b0af
--- /dev/null
+++ b/toolkit/components/places/nsNavBookmarks.h
@@ -0,0 +1,308 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsNavBookmarks_h_
+#define nsNavBookmarks_h_
+
+#include "nsINavBookmarksService.h"
+#include "nsNavHistory.h"
+#include "nsToolkitCompsCID.h"
+#include "nsCategoryCache.h"
+#include "nsTHashtable.h"
+#include "mozilla/Attributes.h"
+#include "prtime.h"
+
+class nsNavBookmarks;
+
+namespace mozilla {
+namespace places {
+
+enum BookmarkStatementId {
+ DB_FIND_REDIRECTED_BOOKMARK = 0,
+ DB_GET_BOOKMARKS_FOR_URI
+};
+
+struct BookmarkData {
+ int64_t id = -1;
+ nsCString url;
+ nsCString title;
+ int32_t position = -1;
+ int64_t placeId = -1;
+ int64_t parentId = -1;
+ int64_t grandParentId = -1;
+ int32_t type = 0;
+ int32_t syncStatus = nsINavBookmarksService::SYNC_STATUS_UNKNOWN;
+ nsCString serviceCID;
+ PRTime dateAdded = 0;
+ PRTime lastModified = 0;
+ nsCString guid;
+ nsCString parentGuid;
+};
+
+struct ItemVisitData {
+ BookmarkData bookmark;
+ int64_t visitId;
+ uint32_t transitionType;
+ PRTime time;
+};
+
+struct TombstoneData {
+ nsCString guid;
+ PRTime dateRemoved;
+};
+
+typedef void (nsNavBookmarks::*ItemVisitMethod)(const ItemVisitData&);
+
+enum BookmarkDate { LAST_MODIFIED };
+
+} // namespace places
+} // namespace mozilla
+
+class nsNavBookmarks final : public nsINavBookmarksService,
+ public nsIObserver,
+ public nsSupportsWeakReference {
+ public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSINAVBOOKMARKSSERVICE
+ NS_DECL_NSIOBSERVER
+
+ nsNavBookmarks();
+
+ /**
+ * Obtains the service's object.
+ */
+ static already_AddRefed<nsNavBookmarks> GetSingleton();
+
+ /**
+ * Initializes the service's object. This should only be called once.
+ */
+ nsresult Init();
+
+ static nsNavBookmarks* GetBookmarksService() {
+ if (!gBookmarksService) {
+ nsCOMPtr<nsINavBookmarksService> serv =
+ do_GetService(NS_NAVBOOKMARKSSERVICE_CONTRACTID);
+ NS_ENSURE_TRUE(serv, nullptr);
+ NS_ASSERTION(gBookmarksService,
+ "Should have static instance pointer now");
+ }
+ return gBookmarksService;
+ }
+
+ typedef mozilla::places::BookmarkData BookmarkData;
+ typedef mozilla::places::ItemVisitData ItemVisitData;
+ typedef mozilla::places::BookmarkStatementId BookmarkStatementId;
+
+ nsresult OnVisit(nsIURI* aURI, int64_t aVisitId, PRTime aTime,
+ int64_t aSessionId, int64_t aReferringId,
+ uint32_t aTransitionType, const nsACString& aGUID,
+ bool aHidden, uint32_t aVisitCount, uint32_t aTyped,
+ const nsAString& aLastKnownTitle);
+
+ // Find all the children of a folder, using the given query and options.
+ // For each child, a ResultNode is created and added to |children|.
+ // The results are ordered by folder position.
+ nsresult QueryFolderChildren(int64_t aFolderId,
+ nsNavHistoryQueryOptions* aOptions,
+ nsCOMArray<nsNavHistoryResultNode>* children);
+
+ /**
+ * Turns aRow into a node and appends it to aChildren if it is appropriate to
+ * do so.
+ *
+ * @param aRow
+ * A Storage statement (in the case of synchronous execution) or row of
+ * a result set (in the case of asynchronous execution).
+ * @param aOptions
+ * The options of the parent folder node. These are the options used
+ * to fill the parent node.
+ * @param aChildren
+ * The children of the parent folder node.
+ * @param aCurrentIndex
+ * The index of aRow within the results. When called on the first row,
+ * this should be set to -1.
+ */
+ nsresult ProcessFolderNodeRow(mozIStorageValueArray* aRow,
+ nsNavHistoryQueryOptions* aOptions,
+ nsCOMArray<nsNavHistoryResultNode>* aChildren,
+ int32_t& aCurrentIndex);
+
+ /**
+ * The async version of QueryFolderChildren.
+ *
+ * @param aNode
+ * The folder node that will receive the children.
+ * @param _pendingStmt
+ * The Storage pending statement that will be used to control async
+ * execution.
+ */
+ nsresult QueryFolderChildrenAsync(nsNavHistoryFolderResultNode* aNode,
+ mozIStoragePendingStatement** _pendingStmt);
+
+ /**
+ * Fetches information about the specified id from the database.
+ *
+ * @param aItemId
+ * Id of the item to fetch information for.
+ * @param aBookmark
+ * BookmarkData to store the information.
+ */
+ nsresult FetchItemInfo(int64_t aItemId, BookmarkData& _bookmark);
+
+ /**
+ * Fetches information about the specified GUID from the database.
+ *
+ * @param aGUID
+ * GUID of the item to fetch information for.
+ * @param aBookmark
+ * BookmarkData to store the information.
+ */
+ nsresult FetchItemInfo(const nsCString& aGUID, BookmarkData& _bookmark);
+
+ /**
+ * Notifies that a bookmark has been visited.
+ *
+ * @param aItemId
+ * The visited item id.
+ * @param aData
+ * Details about the new visit.
+ */
+ void NotifyItemVisited(const ItemVisitData& aData);
+
+ static const int32_t kGetChildrenIndex_Guid;
+ static const int32_t kGetChildrenIndex_Position;
+ static const int32_t kGetChildrenIndex_Type;
+ static const int32_t kGetChildrenIndex_PlaceID;
+ static const int32_t kGetChildrenIndex_SyncStatus;
+
+ static mozilla::Atomic<int64_t> sLastInsertedItemId;
+ static void StoreLastInsertedId(const nsACString& aTable,
+ const int64_t aLastInsertedId);
+
+ static mozilla::Atomic<int64_t> sTotalSyncChanges;
+ static void NoteSyncChange();
+
+ private:
+ static nsNavBookmarks* gBookmarksService;
+
+ ~nsNavBookmarks();
+
+ nsresult AdjustIndices(int64_t aFolder, int32_t aStartIndex,
+ int32_t aEndIndex, int32_t aDelta);
+
+ nsresult AdjustSeparatorsSyncCounter(int64_t aFolderId, int32_t aStartIndex,
+ int64_t aSyncChangeDelta);
+
+ /**
+ * Fetches properties of a folder.
+ *
+ * @param aFolderId
+ * Folder to count children for.
+ * @param _folderCount
+ * Number of children in the folder.
+ * @param _guid
+ * Unique id of the folder.
+ * @param _parentId
+ * Id of the parent of the folder.
+ *
+ * @throws If folder does not exist.
+ */
+ nsresult FetchFolderInfo(int64_t aFolderId, int32_t* _folderCount,
+ nsACString& _guid, int64_t* _parentId);
+
+ nsresult AddSyncChangesForBookmarksWithURL(const nsACString& aURL,
+ int64_t aSyncChangeDelta);
+
+ // Bumps the change counter for all bookmarks with |aURI|. This is used to
+ // update tagged bookmarks when adding or changing a tag entry.
+ nsresult AddSyncChangesForBookmarksWithURI(nsIURI* aURI,
+ int64_t aSyncChangeDelta);
+
+ // Bumps the change counter for all bookmarked URLs within |aFolderId|. This
+ // is used to update tagged bookmarks when changing or removing a tag folder.
+ nsresult AddSyncChangesForBookmarksInFolder(int64_t aFolderId,
+ int64_t aSyncChangeDelta);
+
+ // Inserts a tombstone for a removed synced item.
+ nsresult InsertTombstone(const BookmarkData& aBookmark);
+
+ // Inserts tombstones for removed synced items.
+ nsresult InsertTombstones(
+ const nsTArray<mozilla::places::TombstoneData>& aTombstones);
+
+ // Removes a stale synced bookmark tombstone.
+ nsresult RemoveTombstone(const nsACString& aGUID);
+
+ nsresult SetItemTitleInternal(BookmarkData& aBookmark,
+ const nsACString& aTitle,
+ int64_t aSyncChangeDelta);
+
+ /**
+ * This is an handle to the Places database.
+ */
+ RefPtr<mozilla::places::Database> mDB;
+
+ nsresult SetItemDateInternal(enum mozilla::places::BookmarkDate aDateType,
+ int64_t aSyncChangeDelta, int64_t aItemId,
+ PRTime aValue);
+
+ MOZ_CAN_RUN_SCRIPT
+ nsresult RemoveFolderChildren(int64_t aFolderId, uint16_t aSource);
+
+ // Recursive method to build an array of folder's children
+ nsresult GetDescendantChildren(int64_t aFolderId,
+ const nsACString& aFolderGuid,
+ int64_t aGrandParentId,
+ nsTArray<BookmarkData>& aFolderChildrenArray);
+
+ enum ItemType {
+ BOOKMARK = TYPE_BOOKMARK,
+ FOLDER = TYPE_FOLDER,
+ SEPARATOR = TYPE_SEPARATOR,
+ };
+
+ /**
+ * Helper to insert a bookmark in the database.
+ *
+ * @param aItemId
+ * The itemId to insert, pass -1 to generate a new one.
+ * @param aPlaceId
+ * The placeId to which this bookmark refers to, pass nullptr for
+ * items that don't refer to an URI (eg. folders, separators, ...).
+ * @param aItemType
+ * The type of the new bookmark, see TYPE_* constants.
+ * @param aParentId
+ * The itemId of the parent folder.
+ * @param aIndex
+ * The position inside the parent folder.
+ * @param aTitle
+ * The title for the new bookmark.
+ * Pass a void string to set a NULL title.
+ * @param aDateAdded
+ * The date for the insertion.
+ * @param [optional] aLastModified
+ * The last modified date for the insertion.
+ * It defaults to aDateAdded.
+ *
+ * @return The new item id that has been inserted.
+ *
+ * @note This will also update last modified date of the parent folder.
+ */
+ nsresult InsertBookmarkInDB(int64_t aPlaceId, enum ItemType aItemType,
+ int64_t aParentId, int32_t aIndex,
+ const nsACString& aTitle, PRTime aDateAdded,
+ PRTime aLastModified,
+ const nsACString& aParentGuid,
+ int64_t aGrandParentId, nsIURI* aURI,
+ uint16_t aSource, int64_t* _itemId,
+ nsACString& _guid);
+
+ nsresult GetBookmarksForURI(nsIURI* aURI, nsTArray<BookmarkData>& _bookmarks);
+
+ // Used to enable and disable the observer notifications.
+ bool mCanNotify;
+};
+
+#endif // nsNavBookmarks_h_