summaryrefslogtreecommitdiff
path: root/dom/base/Link.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/Link.h')
-rw-r--r--dom/base/Link.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/dom/base/Link.h b/dom/base/Link.h
new file mode 100644
index 0000000000..42bbfa791d
--- /dev/null
+++ b/dom/base/Link.h
@@ -0,0 +1,171 @@
+/* -*- 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 "mozilla/IHistory.h"
+#include "mozilla/MemoryReporting.h"
+#include "nsIContent.h" // for nsLinkState
+
+namespace mozilla {
+
+class EventStates;
+
+namespace dom {
+
+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);
+ virtual void SetLinkState(nsLinkState aState);
+
+ /**
+ * @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;
+ virtual nsIURI* GetURIExternal() const {
+ return GetURI();
+ }
+
+ /**
+ * 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::MallocSizeOf aMallocSizeOf) const;
+
+ bool ElementHasHref() const;
+
+ // This is called by HTMLAnchorElement.
+ void TryDNSPrefetch();
+ void CancelDNSPrefetch(nsWrapperCache::FlagsType aDeferredFlag,
+ nsWrapperCache::FlagsType aRequestedFlag);
+
+ // This is called by HTMLLinkElement.
+ void TryDNSPrefetchPreconnectOrPrefetch();
+ void CancelPrefetch();
+
+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();
+
+ already_AddRefed<nsIURI> GetURIToMutate();
+ void SetHrefAttribute(nsIURI *aURI);
+
+ mutable nsCOMPtr<nsIURI> mCachedURI;
+
+ Element * const mElement;
+
+ // Strong reference to History. The link has to unregister before History
+ // can disappear.
+ nsCOMPtr<IHistory> mHistory;
+
+ uint16_t mLinkState;
+
+ bool mNeedsRegistration;
+
+ bool mRegistered;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(Link, MOZILLA_DOM_LINK_IMPLEMENTATION_IID)
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_Link_h__