Bug 1383307: Honor the relevant link visited pref.
MozReview-Commit-ID: D5NiEJUpONQ
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -21,16 +21,17 @@
#include "nsCSSRuleProcessor.h"
#include "nsCSSRules.h"
#include "nsContentUtils.h"
#include "nsDOMTokenList.h"
#include "nsDeviceContext.h"
#include "nsIContentInlines.h"
#include "nsIDOMNode.h"
#include "nsIDocumentInlines.h"
+#include "nsILoadContext.h"
#include "nsIFrame.h"
#include "nsINode.h"
#include "nsIPresShell.h"
#include "nsIPresShellInlines.h"
#include "nsIPrincipal.h"
#include "nsIURI.h"
#include "nsFontMetrics.h"
#include "nsHTMLStyleSheet.h"
@@ -277,16 +278,32 @@ Gecko_ElementBindingAnonymousContent(Raw
RawGeckoNodeBorrowed
Gecko_GetNextStyleChild(RawGeckoStyleChildrenIteratorBorrowedMut aIterator)
{
MOZ_ASSERT(aIterator);
return aIterator->GetNextChild();
}
+bool
+Gecko_IsPrivateBrowsingEnabled(const nsIDocument* aDoc)
+{
+ MOZ_ASSERT(aDoc);
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsILoadContext* loadContext = aDoc->GetLoadContext();
+ return loadContext && loadContext->UsePrivateBrowsing();
+}
+
+bool
+Gecko_AreVisitedLinksEnabled()
+{
+ return nsCSSRuleProcessor::VisitedLinksEnabled();
+}
+
EventStates::ServoType
Gecko_ElementState(RawGeckoElementBorrowed aElement)
{
return aElement->StyleState().ServoValue();
}
EventStates::ServoType
Gecko_DocumentState(const nsIDocument* aDocument)
--- a/layout/style/ServoBindings.h
+++ b/layout/style/ServoBindings.h
@@ -224,16 +224,23 @@ RawServoDeclarationBlockStrongBorrowedOr
Gecko_GetExtraContentStyleDeclarations(RawGeckoElementBorrowed element);
RawServoDeclarationBlockStrongBorrowedOrNull
Gecko_GetUnvisitedLinkAttrDeclarationBlock(RawGeckoElementBorrowed element);
RawServoDeclarationBlockStrongBorrowedOrNull
Gecko_GetVisitedLinkAttrDeclarationBlock(RawGeckoElementBorrowed element);
RawServoDeclarationBlockStrongBorrowedOrNull
Gecko_GetActiveLinkAttrDeclarationBlock(RawGeckoElementBorrowed element);
+// Visited handling.
+
+// Returns whether private browsing is enabled for a given element.
+bool Gecko_IsPrivateBrowsingEnabled(const nsIDocument* aDoc);
+// Returns whether visited links are enabled.
+bool Gecko_AreVisitedLinksEnabled();
+
// Animations
bool
Gecko_GetAnimationRule(RawGeckoElementBorrowed aElementOrPseudo,
mozilla::EffectCompositor::CascadeLevel aCascadeLevel,
RawServoAnimationValueMapBorrowedMut aAnimationValues);
RawServoDeclarationBlockStrongBorrowedOrNull
Gecko_GetSMILOverrideDeclarationBlock(RawGeckoElementBorrowed element);
bool Gecko_StyleAnimationsEquals(RawGeckoStyleAnimationListBorrowed,
--- a/layout/style/nsCSSRuleProcessor.cpp
+++ b/layout/style/nsCSSRuleProcessor.cpp
@@ -1063,16 +1063,22 @@ nsCSSRuleProcessor::ClearSheets()
/* static */ void
nsCSSRuleProcessor::Startup()
{
Preferences::AddBoolVarCache(&gSupportVisitedPseudo, VISITED_PSEUDO_PREF,
true);
}
+/* static */ bool
+nsCSSRuleProcessor::VisitedLinksEnabled()
+{
+ return gSupportVisitedPseudo;
+}
+
/* static */ void
nsCSSRuleProcessor::InitSystemMetrics()
{
if (sSystemMetrics)
return;
MOZ_ASSERT(NS_IsMainThread());
@@ -1235,17 +1241,18 @@ nsCSSRuleProcessor::GetWindowsThemeIdent
{
nsCSSRuleProcessor::InitSystemMetrics();
return sWinThemeId;
}
#endif
/* static */
EventStates
-nsCSSRuleProcessor::GetContentState(Element* aElement, bool aUsingPrivateBrowsing)
+nsCSSRuleProcessor::GetContentState(const Element* aElement,
+ bool aUsingPrivateBrowsing)
{
EventStates state = aElement->StyleState();
// If we are not supposed to mark visited links as such, be sure to
// flip the bits appropriately. We want to do this here, rather
// than in GetContentStateForVisitedHandling, so that we don't
// expose that :visited support is disabled to the Web page.
if (state.HasState(NS_EVENT_STATE_VISITED) &&
@@ -1255,27 +1262,28 @@ nsCSSRuleProcessor::GetContentState(Elem
state &= ~NS_EVENT_STATE_VISITED;
state |= NS_EVENT_STATE_UNVISITED;
}
return state;
}
/* static */
EventStates
-nsCSSRuleProcessor::GetContentState(Element* aElement, const TreeMatchContext& aTreeMatchContext)
+nsCSSRuleProcessor::GetContentState(const Element* aElement,
+ const TreeMatchContext& aTreeMatchContext)
{
return nsCSSRuleProcessor::GetContentState(
aElement,
aTreeMatchContext.mUsingPrivateBrowsing
);
}
/* static */
EventStates
-nsCSSRuleProcessor::GetContentState(Element* aElement)
+nsCSSRuleProcessor::GetContentState(const Element* aElement)
{
nsILoadContext* loadContext = aElement->OwnerDoc()->GetLoadContext();
bool usingPrivateBrowsing = loadContext && loadContext->UsePrivateBrowsing();
return nsCSSRuleProcessor::GetContentState(aElement, usingPrivateBrowsing);
}
/* static */
bool
@@ -1283,17 +1291,17 @@ nsCSSRuleProcessor::IsLink(const Element
{
EventStates state = aElement->StyleState();
return state.HasAtLeastOneOfStates(NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED);
}
/* static */
EventStates
nsCSSRuleProcessor::GetContentStateForVisitedHandling(
- Element* aElement,
+ const Element* aElement,
nsRuleWalker::VisitedHandlingType aVisitedHandling,
bool aIsRelevantLink)
{
// It's unnecessary to call GetContentState() here (which may flip visited to
// unvisited) since this function will remove both unvisited and visited if
// either is set and produce a new value.
EventStates state = aElement->StyleState();
if (state.HasAtLeastOneOfStates(NS_EVENT_STATE_VISITED | NS_EVENT_STATE_UNVISITED)) {
--- a/layout/style/nsCSSRuleProcessor.h
+++ b/layout/style/nsCSSRuleProcessor.h
@@ -76,16 +76,17 @@ public:
bool aIsShared = false);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS(nsCSSRuleProcessor)
public:
nsresult ClearRuleCascades();
+ static bool VisitedLinksEnabled();
static void Startup();
static void InitSystemMetrics();
static void Shutdown();
static void FreeSystemMetrics();
static bool HasSystemMetric(nsIAtom* aMetric);
/*
* Returns true if the given aElement matches one of the
@@ -98,29 +99,29 @@ public:
TreeMatchContext& aTreeMatchContext,
nsCSSSelectorList* aSelectorList);
/*
* Helper to get the content state for a content node. This may be
* slightly adjusted from IntrinsicState().
*/
static mozilla::EventStates GetContentState(
- mozilla::dom::Element* aElement,
+ const mozilla::dom::Element* aElement,
bool aUsingPrivateBrowsing);
static mozilla::EventStates GetContentState(
- mozilla::dom::Element* aElement,
+ const mozilla::dom::Element* aElement,
const TreeMatchContext& aTreeMatchContext);
static mozilla::EventStates GetContentState(
- mozilla::dom::Element* aElement);
+ const mozilla::dom::Element* aElement);
/*
* Helper to get the content state for :visited handling for an element
*/
static mozilla::EventStates GetContentStateForVisitedHandling(
- mozilla::dom::Element* aElement,
+ const mozilla::dom::Element* aElement,
nsRuleWalker::VisitedHandlingType aVisitedHandling,
bool aIsRelevantLink);
/*
* Helper to test whether a node is a link
*/
static bool IsLink(const mozilla::dom::Element* aElement);