2019-10-25 16:02:08 +03:00
|
|
|
/* 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 mozilla_BaseHistory_h
|
|
|
|
#define mozilla_BaseHistory_h
|
|
|
|
|
|
|
|
#include "IHistory.h"
|
2020-04-16 00:19:41 +03:00
|
|
|
#include "mozilla/dom/ContentParent.h"
|
2021-03-25 11:04:20 +03:00
|
|
|
#include "nsTHashSet.h"
|
2019-10-25 16:02:08 +03:00
|
|
|
|
|
|
|
/* A base class for history implementations that implement link coloring. */
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
class BaseHistory : public IHistory {
|
2019-10-25 16:02:20 +03:00
|
|
|
public:
|
2020-04-16 00:19:41 +03:00
|
|
|
void RegisterVisitedCallback(nsIURI*, dom::Link*) final;
|
2021-07-21 15:23:33 +03:00
|
|
|
void ScheduleVisitedQuery(nsIURI*, dom::ContentParent*) final;
|
2019-10-25 16:02:25 +03:00
|
|
|
void UnregisterVisitedCallback(nsIURI*, dom::Link*) final;
|
2021-07-21 15:23:33 +03:00
|
|
|
void NotifyVisited(nsIURI*, VisitedStatus,
|
|
|
|
const ContentParentSet* = nullptr) final;
|
2019-10-25 16:02:20 +03:00
|
|
|
|
2020-12-14 18:23:10 +03:00
|
|
|
// Some URIs like data-uris are never going to be stored in history, so we can
|
|
|
|
// avoid doing IPC roundtrips for them or what not.
|
|
|
|
static bool CanStore(nsIURI*);
|
|
|
|
|
2019-10-25 16:02:08 +03:00
|
|
|
protected:
|
2020-04-16 00:19:41 +03:00
|
|
|
void NotifyVisitedInThisProcess(nsIURI*, VisitedStatus);
|
2021-07-21 15:23:33 +03:00
|
|
|
void NotifyVisitedFromParent(nsIURI*, VisitedStatus, const ContentParentSet*);
|
2019-10-25 16:02:08 +03:00
|
|
|
static constexpr const size_t kTrackedUrisInitialSize = 64;
|
|
|
|
|
2020-04-16 00:19:41 +03:00
|
|
|
BaseHistory();
|
|
|
|
~BaseHistory();
|
2019-10-25 16:02:18 +03:00
|
|
|
|
2019-10-25 16:02:08 +03:00
|
|
|
using ObserverArray = nsTObserverArray<dom::Link*>;
|
2019-10-25 16:02:23 +03:00
|
|
|
struct ObservingLinks {
|
2019-10-25 16:02:08 +03:00
|
|
|
ObserverArray mLinks;
|
2019-11-04 16:28:58 +03:00
|
|
|
VisitedStatus mStatus = VisitedStatus::Unknown;
|
2019-10-25 16:02:08 +03:00
|
|
|
|
|
|
|
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const {
|
|
|
|
return mLinks.ShallowSizeOfExcludingThis(aMallocSizeOf);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-07-21 15:23:33 +03:00
|
|
|
using PendingVisitedQueries = nsTHashMap<nsURIHashKey, ContentParentSet>;
|
|
|
|
struct PendingVisitedResult {
|
|
|
|
dom::VisitedQueryResult mResult;
|
|
|
|
ContentParentSet mProcessesToNotify;
|
|
|
|
};
|
|
|
|
using PendingVisitedResults = nsTArray<PendingVisitedResult>;
|
2019-11-06 15:10:59 +03:00
|
|
|
|
|
|
|
// Starts all the queries in the pending queries list, potentially at the same
|
|
|
|
// time.
|
2021-07-21 15:23:33 +03:00
|
|
|
virtual void StartPendingVisitedQueries(PendingVisitedQueries&&) = 0;
|
2019-11-06 15:10:59 +03:00
|
|
|
|
2019-10-25 16:02:20 +03:00
|
|
|
private:
|
2019-11-06 15:10:59 +03:00
|
|
|
// Cancels a visited query, if it is at all possible, because we know we won't
|
|
|
|
// use the results anymore.
|
|
|
|
void CancelVisitedQueryIfPossible(nsIURI*);
|
|
|
|
|
2020-04-16 00:19:41 +03:00
|
|
|
void SendPendingVisitedResultsToChildProcesses();
|
2019-10-25 16:02:20 +03:00
|
|
|
|
|
|
|
protected:
|
2019-10-25 16:02:23 +03:00
|
|
|
// A map from URI to links that depend on that URI, and whether that URI is
|
2019-11-04 16:28:58 +03:00
|
|
|
// known-to-be-visited-or-unvisited already.
|
2021-03-10 13:47:47 +03:00
|
|
|
nsTHashMap<nsURIHashKey, ObservingLinks> mTrackedURIs;
|
2019-11-06 15:10:59 +03:00
|
|
|
|
|
|
|
private:
|
|
|
|
// The set of pending URIs that we haven't queried yet but need to.
|
|
|
|
PendingVisitedQueries mPendingQueries;
|
2020-04-16 00:19:41 +03:00
|
|
|
// The set of pending query results that we still haven't dispatched to child
|
|
|
|
// processes.
|
|
|
|
PendingVisitedResults mPendingResults;
|
2019-11-06 15:10:59 +03:00
|
|
|
// Whether we've successfully scheduled a runnable to call
|
|
|
|
// StartPendingVisitedQueries already.
|
|
|
|
bool mStartPendingVisitedQueriesScheduled = false;
|
2020-04-16 00:19:41 +03:00
|
|
|
// Whether we've successfully scheduled a runnable to call
|
|
|
|
// SendPendingVisitedResultsToChildProcesses already.
|
|
|
|
bool mStartPendingResultsScheduled = false;
|
2019-10-25 16:02:08 +03:00
|
|
|
};
|
|
|
|
|
2019-10-25 16:02:20 +03:00
|
|
|
} // namespace mozilla
|
2019-10-25 16:02:08 +03:00
|
|
|
|
|
|
|
#endif
|