summaryrefslogtreecommitdiffstats
path: root/dom/base/Link.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/Link.h')
-rw-r--r--dom/base/Link.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/dom/base/Link.h b/dom/base/Link.h
new file mode 100644
index 0000000000..7d547d75ba
--- /dev/null
+++ b/dom/base/Link.h
@@ -0,0 +1,154 @@
+/* -*- 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
+ * 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/. */
+
+/**
+ * This is the base class for all link classes.
+ */
+
+#ifndef mozilla_dom_Link_h__
+#define mozilla_dom_Link_h__
+
+#include "nsWrapperCache.h" // For nsWrapperCache::FlagsType
+#include "nsCOMPtr.h"
+#include "mozilla/dom/RustTypes.h"
+
+class nsIURI;
+
+namespace mozilla {
+
+class SizeOfState;
+
+namespace dom {
+
+class Document;
+class Element;
+
+#define MOZILLA_DOM_LINK_IMPLEMENTATION_IID \
+ { \
+ 0xb25edee6, 0xdd35, 0x4f8b, { \
+ 0xab, 0x90, 0x66, 0xd0, 0xbd, 0x3c, 0x22, 0xd5 \
+ } \
+ }
+
+class Link : public nsISupports {
+ public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_LINK_IMPLEMENTATION_IID)
+
+ enum class State : uint8_t {
+ Unvisited = 0,
+ Visited,
+ NotLink,
+ };
+
+ /**
+ * aElement is the element pointer corresponding to this link.
+ */
+ explicit Link(Element* aElement);
+
+ /**
+ * This constructor is only used for testing.
+ */
+ explicit Link();
+
+ virtual void VisitedQueryFinished(bool aVisited);
+
+ /**
+ * @return ElementState::VISITED if this link is visited,
+ * ElementState::UNVISTED if this link is not visited, or 0 if this
+ * link is not actually a link.
+ */
+ ElementState LinkState() const;
+
+ /**
+ * @return the URI this link is for, if available.
+ */
+ nsIURI* GetURI() const;
+
+ /**
+ * Helper methods for modifying and obtaining parts of the URI of the Link.
+ */
+ void SetProtocol(const nsAString& aProtocol);
+ void SetUsername(const nsAString& aUsername);
+ void SetPassword(const nsAString& aPassword);
+ void SetHost(const nsAString& aHost);
+ void SetHostname(const nsAString& aHostname);
+ void SetPathname(const nsAString& aPathname);
+ void SetSearch(const nsAString& aSearch);
+ void SetPort(const nsAString& aPort);
+ void SetHash(const nsAString& aHash);
+ void GetOrigin(nsAString& aOrigin);
+ void GetProtocol(nsAString& _protocol);
+ void GetUsername(nsAString& aUsername);
+ void GetPassword(nsAString& aPassword);
+ void GetHost(nsAString& _host);
+ void GetHostname(nsAString& _hostname);
+ void GetPathname(nsAString& _pathname);
+ void GetSearch(nsAString& _search);
+ void GetPort(nsAString& _port);
+ void GetHash(nsAString& _hash);
+
+ /**
+ * Invalidates any link caching, and resets the state to the default.
+ *
+ * @param aNotify
+ * true if ResetLinkState should notify the owning document about style
+ * changes or false if it should not.
+ */
+ void ResetLinkState(bool aNotify, bool aHasHref);
+
+ // This method nevers returns a null element.
+ Element* GetElement() const { return mElement; }
+
+ virtual size_t SizeOfExcludingThis(mozilla::SizeOfState& aState) const;
+
+ virtual bool ElementHasHref() const;
+
+ bool HasPendingLinkUpdate() const { return mHasPendingLinkUpdate; }
+ void SetHasPendingLinkUpdate() { mHasPendingLinkUpdate = true; }
+ void ClearHasPendingLinkUpdate() { mHasPendingLinkUpdate = false; }
+
+ // To ensure correct mHasPendingLinkUpdate handling, we have this method
+ // similar to the one in Element. Overriders must call
+ // ClearHasPendingLinkUpdate().
+ // If you change this, change also the method in nsINode.
+ virtual void NodeInfoChanged(Document* aOldDoc) = 0;
+
+ protected:
+ virtual ~Link();
+
+ nsIURI* GetCachedURI() const { return mCachedURI; }
+ bool HasCachedURI() const { return !!mCachedURI; }
+
+ private:
+ /**
+ * Unregisters from History so this node no longer gets notifications about
+ * changes to visitedness.
+ */
+ void UnregisterFromHistory();
+
+ void SetHrefAttribute(nsIURI* aURI);
+
+ mutable nsCOMPtr<nsIURI> mCachedURI;
+
+ Element* const mElement;
+
+ // TODO(emilio): This ideally could be `State mState : 2`, but the version of
+ // gcc we build on automation with (7 as of this writing) has a useless
+ // warning about all values in the range of the enum not fitting, see
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414.
+ State mState;
+ bool mNeedsRegistration : 1;
+ bool mRegistered : 1;
+ bool mHasPendingLinkUpdate : 1;
+ bool mHistory : 1;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(Link, MOZILLA_DOM_LINK_IMPLEMENTATION_IID)
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_Link_h__