2013-01-18 04:45:11 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
2012-05-21 15:12:37 +04:00
|
|
|
* 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/. */
|
2009-08-20 22:56:10 +04:00
|
|
|
|
|
|
|
#ifndef mozilla_places_History_h_
|
|
|
|
#define mozilla_places_History_h_
|
|
|
|
|
2019-10-25 16:02:08 +03:00
|
|
|
#include "mozilla/BaseHistory.h"
|
2013-06-23 16:03:39 +04:00
|
|
|
#include "mozilla/MemoryReporting.h"
|
Bug 1415980 - make hash keys movable and not copyable; r=erahm
Everything that goes in a PLDHashtable (and its derivatives, like
nsTHashtable) needs to inherit from PLDHashEntryHdr. But through a lack
of enforcement, copy constructors for these derived classes didn't
explicitly invoke the copy constructor for PLDHashEntryHdr (and the
compiler didn't invoke the copy constructor for us). Instead,
PLDHashTable explicitly copied around the bits that the copy constructor
would have.
The current setup has two problems:
1) Derived classes should be using move construction, not copy
construction, since anything that's shuffling hash table keys/entries
around will be using move construction.
2) Derived classes should take responsibility for transferring bits of
superclass state around, and not rely on something else to handle that.
The second point is not a huge problem for PLDHashTable (PLDHashTable
only has to copy PLDHashEntryHdr's bits in a single place), but future
hash table implementations that might move entries around more
aggressively would have to insert compensation code all over the
place. Additionally, if moving entries is implemented via memcpy (which
is quite common), PLDHashTable copying around bits *again* is
inefficient.
Let's fix all these problems in one go, by:
1) Explicitly declaring the set of constructors that PLDHashEntryHdr
implements (and does not implement). In particular, the copy
constructor is deleted, so any derived classes that attempt to make
themselves copyable will be detected at compile time: the compiler
will complain that the superclass type is not copyable.
This change on its own will result in many compiler errors, so...
2) Change any derived classes to implement move constructors instead of
copy constructors. Note that some of these move constructors are,
strictly speaking, unnecessary, since the relevant classes are moved
via memcpy in nsTHashtable and its derivatives.
2018-09-20 18:20:36 +03:00
|
|
|
#include "mozilla/Move.h"
|
2012-02-01 14:59:27 +04:00
|
|
|
#include "mozilla/Mutex.h"
|
2011-01-14 00:37:04 +03:00
|
|
|
#include "mozIAsyncHistory.h"
|
2011-10-27 13:11:34 +04:00
|
|
|
#include "Database.h"
|
|
|
|
|
2009-08-20 22:56:10 +04:00
|
|
|
#include "mozilla/dom/Link.h"
|
2019-11-04 16:28:58 +03:00
|
|
|
#include "mozilla/dom/PContentChild.h"
|
2019-10-25 16:02:02 +03:00
|
|
|
#include "nsDataHashtable.h"
|
2009-08-20 22:56:10 +04:00
|
|
|
#include "nsTHashtable.h"
|
|
|
|
#include "nsString.h"
|
|
|
|
#include "nsURIHashKey.h"
|
2011-07-14 01:28:37 +04:00
|
|
|
#include "nsTObserverArray.h"
|
2013-11-07 09:35:30 +04:00
|
|
|
#include "nsIMemoryReporter.h"
|
2010-07-14 05:00:33 +04:00
|
|
|
#include "nsIObserver.h"
|
2010-10-06 19:21:31 +04:00
|
|
|
#include "mozIStorageConnection.h"
|
2009-08-20 22:56:10 +04:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace places {
|
|
|
|
|
2011-01-11 21:48:14 +03:00
|
|
|
struct VisitData;
|
2014-08-12 12:59:11 +04:00
|
|
|
class ConcurrentStatementsHolder;
|
2011-01-11 21:48:14 +03:00
|
|
|
|
2016-05-26 18:49:40 +03:00
|
|
|
// Initial size of mRecentlyVisitedURIs.
|
|
|
|
#define RECENTLY_VISITED_URIS_SIZE 64
|
|
|
|
// Microseconds after which a visit can be expired from mRecentlyVisitedURIs.
|
|
|
|
// When an URI is reloaded we only take into account the first visit to it, and
|
|
|
|
// ignore any subsequent visits, if they happen before this time has elapsed.
|
|
|
|
// A commonly found case is to reload a page every 5 minutes, so we pick a time
|
|
|
|
// larger than that.
|
|
|
|
#define RECENTLY_VISITED_URIS_MAX_AGE 6 * 60 * PR_USEC_PER_SEC
|
2017-12-05 00:46:10 +03:00
|
|
|
// When notifying the main thread after inserting visits, we chunk the visits
|
|
|
|
// into medium-sized groups so that we can amortize the cost of the runnable
|
|
|
|
// without janking the main thread by expecting it to process hundreds at once.
|
|
|
|
#define NOTIFY_VISITS_CHUNK_SIZE 100
|
2012-03-28 23:50:59 +04:00
|
|
|
|
2019-10-25 16:02:08 +03:00
|
|
|
class History final : public BaseHistory,
|
2015-03-27 21:52:19 +03:00
|
|
|
public mozIAsyncHistory,
|
|
|
|
public nsIObserver,
|
|
|
|
public nsIMemoryReporter {
|
2009-08-20 22:56:10 +04:00
|
|
|
public:
|
2013-07-19 06:24:15 +04:00
|
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
2011-01-14 00:37:04 +03:00
|
|
|
NS_DECL_MOZIASYNCHISTORY
|
2010-07-14 05:00:33 +04:00
|
|
|
NS_DECL_NSIOBSERVER
|
2013-12-08 10:09:10 +04:00
|
|
|
NS_DECL_NSIMEMORYREPORTER
|
2009-08-20 22:56:10 +04:00
|
|
|
|
2019-10-25 16:02:18 +03:00
|
|
|
// IHistory
|
|
|
|
NS_IMETHOD VisitURI(nsIWidget*, nsIURI*, nsIURI* aLastVisitedURI,
|
|
|
|
uint32_t aFlags) final;
|
|
|
|
NS_IMETHOD SetURITitle(nsIURI*, const nsAString&) final;
|
|
|
|
|
|
|
|
// BaseHistory
|
|
|
|
Result<Ok, nsresult> StartVisitedQuery(nsIURI*) final;
|
|
|
|
void CancelVisitedQueryIfPossible(nsIURI*) final {
|
|
|
|
// TODO(bug 1591393): This could be worth it? Needs some measurement.
|
|
|
|
}
|
|
|
|
|
2009-08-20 22:56:10 +04:00
|
|
|
History();
|
|
|
|
|
2010-10-06 19:21:31 +04:00
|
|
|
/**
|
|
|
|
* Obtains the statement to use to check if a URI is visited or not.
|
|
|
|
*/
|
2014-08-12 12:59:11 +04:00
|
|
|
nsresult GetIsVisitedStatement(mozIStorageCompletionCallback* aCallback);
|
2010-10-06 19:21:31 +04:00
|
|
|
|
2011-01-11 21:48:14 +03:00
|
|
|
/**
|
|
|
|
* Adds an entry in moz_places with the data in aVisitData.
|
|
|
|
*
|
|
|
|
* @param aVisitData
|
|
|
|
* The visit data to use to populate a new row in moz_places.
|
2017-02-21 23:00:24 +03:00
|
|
|
* @param aShouldNotifyFrecencyChanged
|
|
|
|
* Whether to dispatch OnFrecencyChanged notifications.
|
|
|
|
* Defaults to true. Set to false if you (the caller) are
|
|
|
|
* doing many inserts and will dispatch your own
|
|
|
|
* OnManyFrecenciesChanged notification.
|
2011-01-11 21:48:14 +03:00
|
|
|
*/
|
2017-02-21 23:00:24 +03:00
|
|
|
nsresult InsertPlace(VisitData& aVisitData,
|
|
|
|
bool aShouldNotifyFrecencyChanged = true);
|
2011-01-11 21:48:14 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Updates an entry in moz_places with the data in aVisitData.
|
|
|
|
*
|
|
|
|
* @param aVisitData
|
|
|
|
* The visit data to use to update the existing row in moz_places.
|
|
|
|
*/
|
|
|
|
nsresult UpdatePlace(const VisitData& aVisitData);
|
|
|
|
|
2011-01-11 21:48:53 +03:00
|
|
|
/**
|
|
|
|
* Loads information about the page into _place from moz_places.
|
|
|
|
*
|
|
|
|
* @param _place
|
|
|
|
* The VisitData for the place we need to know information about.
|
2013-06-19 11:18:38 +04:00
|
|
|
* @param [out] _exists
|
|
|
|
* Whether or the page was recorded in moz_places, false otherwise.
|
2011-01-11 21:48:53 +03:00
|
|
|
*/
|
2013-06-19 11:18:38 +04:00
|
|
|
nsresult FetchPageInfo(VisitData& _place, bool* _exists);
|
2011-01-11 21:48:53 +03:00
|
|
|
|
2011-09-15 04:37:45 +04:00
|
|
|
/**
|
2011-11-28 07:03:14 +04:00
|
|
|
* Get the number of bytes of memory this History object is using,
|
|
|
|
* including sizeof(*this))
|
2011-09-15 04:37:45 +04:00
|
|
|
*/
|
2013-06-23 16:03:39 +04:00
|
|
|
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf);
|
2011-09-15 04:37:45 +04:00
|
|
|
|
2009-08-20 22:56:10 +04:00
|
|
|
/**
|
|
|
|
* Obtains a pointer to this service.
|
|
|
|
*/
|
2010-10-06 19:21:31 +04:00
|
|
|
static History* GetService();
|
2009-08-20 22:56:10 +04:00
|
|
|
|
|
|
|
/**
|
2017-10-17 07:08:42 +03:00
|
|
|
* Used by the service manager only.
|
2009-08-20 22:56:10 +04:00
|
|
|
*/
|
2017-10-17 07:08:42 +03:00
|
|
|
static already_AddRefed<History> GetSingleton();
|
2009-08-20 22:56:10 +04:00
|
|
|
|
2011-10-27 13:11:34 +04:00
|
|
|
template <int N>
|
|
|
|
already_AddRefed<mozIStorageStatement> GetStatement(const char (&aQuery)[N]) {
|
2017-06-09 19:51:09 +03:00
|
|
|
// May be invoked on both threads.
|
|
|
|
const mozIStorageConnection* dbConn = GetConstDBConn();
|
2012-07-30 18:20:58 +04:00
|
|
|
NS_ENSURE_TRUE(dbConn, nullptr);
|
2011-10-27 13:11:34 +04:00
|
|
|
return mDB->GetStatement(aQuery);
|
|
|
|
}
|
2010-11-08 22:43:46 +03:00
|
|
|
|
2013-01-05 13:21:04 +04:00
|
|
|
already_AddRefed<mozIStorageStatement> GetStatement(
|
|
|
|
const nsACString& aQuery) {
|
2017-06-09 19:51:09 +03:00
|
|
|
// May be invoked on both threads.
|
|
|
|
const mozIStorageConnection* dbConn = GetConstDBConn();
|
2013-01-05 13:21:04 +04:00
|
|
|
NS_ENSURE_TRUE(dbConn, nullptr);
|
|
|
|
return mDB->GetStatement(aQuery);
|
|
|
|
}
|
|
|
|
|
2012-02-01 14:59:27 +04:00
|
|
|
bool IsShuttingDown() const { return mShuttingDown; }
|
|
|
|
Mutex& GetShutdownMutex() { return mShutdownMutex; }
|
|
|
|
|
2012-03-28 23:50:59 +04:00
|
|
|
/**
|
|
|
|
* Helper function to append a new URI to mRecentlyVisitedURIs. See
|
|
|
|
* mRecentlyVisitedURIs.
|
2019-08-06 22:09:28 +03:00
|
|
|
* @param {nsIURI} aURI The URI to append
|
|
|
|
* @param {bool} aHidden The hidden status of the visit being appended.
|
2012-03-28 23:50:59 +04:00
|
|
|
*/
|
2019-08-06 22:09:28 +03:00
|
|
|
void AppendToRecentlyVisitedURIs(nsIURI* aURI, bool aHidden);
|
2012-03-28 23:50:59 +04:00
|
|
|
|
2019-11-04 16:28:58 +03:00
|
|
|
void NotifyVisitedParent(
|
|
|
|
const nsTArray<mozilla::dom::VisitedQueryResult>& aURIs);
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2009-08-20 22:56:10 +04:00
|
|
|
private:
|
2010-10-06 19:21:31 +04:00
|
|
|
virtual ~History();
|
|
|
|
|
2013-11-07 09:35:30 +04:00
|
|
|
void InitMemoryReporter();
|
|
|
|
|
2010-11-08 22:43:46 +03:00
|
|
|
/**
|
2017-06-09 19:51:09 +03:00
|
|
|
* Obtains a read-write database connection, initializing the connection
|
|
|
|
* if needed. Must be invoked on the main thread.
|
2010-11-08 22:43:46 +03:00
|
|
|
*/
|
|
|
|
mozIStorageConnection* GetDBConn();
|
|
|
|
|
2017-06-09 19:51:09 +03:00
|
|
|
/**
|
|
|
|
* Obtains a read-write database connection, but won't try to initialize it.
|
|
|
|
* May be invoked on both threads, but first one must invoke GetDBConn() on
|
|
|
|
* the main-thread at least once.
|
|
|
|
*/
|
|
|
|
const mozIStorageConnection* GetConstDBConn();
|
|
|
|
|
2010-11-08 22:43:46 +03:00
|
|
|
/**
|
2011-10-27 13:11:34 +04:00
|
|
|
* The database handle. This is initialized lazily by the first call to
|
|
|
|
* GetDBConn(), so never use it directly, or, if you really need, always
|
|
|
|
* invoke GetDBConn() before.
|
2010-11-08 22:43:46 +03:00
|
|
|
*/
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<mozilla::places::Database> mDB;
|
2010-11-08 22:43:46 +03:00
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<ConcurrentStatementsHolder> mConcurrentStatementsHolder;
|
2009-08-20 22:56:10 +04:00
|
|
|
|
2010-07-14 05:00:33 +04:00
|
|
|
/**
|
|
|
|
* Remove any memory references to tasks and do not take on any more.
|
|
|
|
*/
|
|
|
|
void Shutdown();
|
|
|
|
|
2010-10-06 19:21:31 +04:00
|
|
|
static History* gService;
|
2009-08-20 22:56:10 +04:00
|
|
|
|
2010-07-14 05:00:33 +04:00
|
|
|
// Ensures new tasks aren't started on destruction.
|
|
|
|
bool mShuttingDown;
|
2012-02-01 14:59:27 +04:00
|
|
|
// This mutex guards mShuttingDown. Code running in other threads that might
|
|
|
|
// schedule tasks that use the database should grab it and check the value of
|
|
|
|
// mShuttingDown. If we are already shutting down, the code must gracefully
|
|
|
|
// avoid using the db. If we are not, the lock will prevent shutdown from
|
|
|
|
// starting in an unexpected moment.
|
|
|
|
Mutex mShutdownMutex;
|
2010-07-14 05:00:33 +04:00
|
|
|
|
2012-03-28 23:50:59 +04:00
|
|
|
/**
|
2016-05-26 18:49:40 +03:00
|
|
|
* mRecentlyVisitedURIs remembers URIs which have been recently added to
|
|
|
|
* history, to avoid saving these locations repeatedly in a short period.
|
|
|
|
*/
|
2019-10-25 16:02:00 +03:00
|
|
|
struct RecentURIVisit {
|
|
|
|
PRTime mTime;
|
|
|
|
bool mHidden;
|
2016-05-26 18:49:40 +03:00
|
|
|
};
|
2019-10-25 16:02:00 +03:00
|
|
|
|
|
|
|
nsDataHashtable<nsURIHashKey, RecentURIVisit> mRecentlyVisitedURIs;
|
2009-08-20 22:56:10 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace places
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif // mozilla_places_History_h_
|