summaryrefslogtreecommitdiffstats
path: root/dom/base/Link.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/base/Link.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/dom/base/Link.h b/dom/base/Link.h
new file mode 100644
index 0000000000..3c7b23bced
--- /dev/null
+++ b/dom/base/Link.h
@@ -0,0 +1,190 @@
+/* -*- 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"
+
+class nsIURI;
+
+namespace mozilla {
+
+class EventStates;
+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)
+
+ /**
+ * 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 NS_EVENT_STATE_VISITED if this link is visited,
+ * NS_EVENT_STATE_UNVISTED if this link is not visited, or 0 if this
+ * link is not actually a link.
+ */
+ EventStates 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; }
+
+ /**
+ * DNS prefetch has been deferred until later, e.g. page load complete.
+ */
+ virtual void OnDNSPrefetchDeferred() { /*do nothing*/
+ }
+
+ /**
+ * DNS prefetch has been submitted to Host Resolver.
+ */
+ virtual void OnDNSPrefetchRequested() { /*do nothing*/
+ }
+
+ /**
+ * Checks if DNS Prefetching is ok
+ *
+ * @returns boolean
+ * Defaults to true; should be overridden for specialised cases
+ */
+ virtual bool HasDeferredDNSPrefetchRequest() { return true; }
+
+ virtual size_t SizeOfExcludingThis(mozilla::SizeOfState& aState) const;
+
+ virtual bool ElementHasHref() const;
+
+ // This is called by HTMLAnchorElement and HTMLLinkElement.
+ void TryDNSPrefetch();
+ void CancelDNSPrefetch(nsWrapperCache::FlagsType aDeferredFlag,
+ nsWrapperCache::FlagsType aRequestedFlag);
+
+ 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;
+
+ bool IsInDNSPrefetch() { return mInDNSPrefetch; }
+ void SetIsInDNSPrefetch() { mInDNSPrefetch = true; }
+ void ClearIsInDNSPrefetch() { mInDNSPrefetch = false; }
+
+ protected:
+ virtual ~Link();
+
+ /**
+ * Return true if the link has associated URI.
+ */
+ bool HasURI() const {
+ if (HasCachedURI()) {
+ return true;
+ }
+
+ return !!GetURI();
+ }
+
+ 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;
+
+ uint16_t mLinkState;
+
+ bool mNeedsRegistration : 1;
+
+ bool mRegistered : 1;
+
+ bool mHasPendingLinkUpdate : 1;
+
+ bool mInDNSPrefetch : 1;
+
+ bool mHistory : 1;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(Link, MOZILLA_DOM_LINK_IMPLEMENTATION_IID)
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_Link_h__