summaryrefslogtreecommitdiffstats
path: root/dom/html/nsGenericHTMLFrameElement.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html/nsGenericHTMLFrameElement.h')
-rw-r--r--dom/html/nsGenericHTMLFrameElement.h173
1 files changed, 173 insertions, 0 deletions
diff --git a/dom/html/nsGenericHTMLFrameElement.h b/dom/html/nsGenericHTMLFrameElement.h
new file mode 100644
index 0000000000..4ac6401721
--- /dev/null
+++ b/dom/html/nsGenericHTMLFrameElement.h
@@ -0,0 +1,173 @@
+/* -*- 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/. */
+
+#ifndef nsGenericHTMLFrameElement_h
+#define nsGenericHTMLFrameElement_h
+
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/nsBrowserElement.h"
+
+#include "nsFrameLoader.h"
+#include "nsFrameLoaderOwner.h"
+#include "nsGenericHTMLElement.h"
+#include "nsIMozBrowserFrame.h"
+
+namespace mozilla {
+class ErrorResult;
+
+namespace dom {
+class BrowserParent;
+template <typename>
+struct Nullable;
+class WindowProxyHolder;
+class XULFrameElement;
+} // namespace dom
+} // namespace mozilla
+
+#define NS_GENERICHTMLFRAMEELEMENT_IID \
+ { \
+ 0x8190db72, 0xdab0, 0x4d72, { \
+ 0x94, 0x26, 0x87, 0x5f, 0x5a, 0x8a, 0x2a, 0xe5 \
+ } \
+ }
+
+/**
+ * A helper class for frame elements
+ */
+class nsGenericHTMLFrameElement : public nsGenericHTMLElement,
+ public nsFrameLoaderOwner,
+ public mozilla::nsBrowserElement,
+ public nsIMozBrowserFrame {
+ public:
+ nsGenericHTMLFrameElement(
+ already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
+ mozilla::dom::FromParser aFromParser)
+ : nsGenericHTMLElement(std::move(aNodeInfo)),
+ mSrcLoadHappened(false),
+ mNetworkCreated(aFromParser == mozilla::dom::FROM_PARSER_NETWORK),
+ mBrowserFrameListenersRegistered(false),
+ mReallyIsBrowser(false) {}
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ NS_DECL_NSIDOMMOZBROWSERFRAME
+ NS_DECL_NSIMOZBROWSERFRAME
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_GENERICHTMLFRAMEELEMENT_IID)
+
+ // nsIContent
+ virtual bool IsHTMLFocusable(bool aWithMouse, bool* aIsFocusable,
+ int32_t* aTabIndex) override;
+ virtual nsresult BindToTree(BindContext&, nsINode& aParent) override;
+ virtual void UnbindFromTree(bool aNullParent = true) override;
+ virtual void DestroyContent() override;
+
+ nsresult CopyInnerTo(mozilla::dom::Element* aDest);
+
+ virtual int32_t TabIndexDefault() override;
+
+ virtual nsIMozBrowserFrame* GetAsMozBrowserFrame() override { return this; }
+
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsGenericHTMLFrameElement,
+ nsGenericHTMLElement)
+
+ void SwapFrameLoaders(mozilla::dom::HTMLIFrameElement& aOtherLoaderOwner,
+ mozilla::ErrorResult& aError);
+
+ void SwapFrameLoaders(mozilla::dom::XULFrameElement& aOtherLoaderOwner,
+ mozilla::ErrorResult& aError);
+
+ void SwapFrameLoaders(nsFrameLoaderOwner* aOtherLoaderOwner,
+ mozilla::ErrorResult& rv);
+
+ /**
+ * Helper method to map a HTML 'scrolling' attribute value (which can be null)
+ * to a ScrollbarPreference value value. scrolling="no" (and its synonyms)
+ * map to Never, and anything else to Auto.
+ */
+ static mozilla::ScrollbarPreference MapScrollingAttribute(const nsAttrValue*);
+
+ nsIPrincipal* GetSrcTriggeringPrincipal() const {
+ return mSrcTriggeringPrincipal;
+ }
+
+ // Needed for nsBrowserElement
+ already_AddRefed<nsFrameLoader> GetFrameLoader() override {
+ return nsFrameLoaderOwner::GetFrameLoader();
+ }
+
+ protected:
+ virtual ~nsGenericHTMLFrameElement();
+
+ // This doesn't really ensure a frame loader in all cases, only when
+ // it makes sense.
+ void EnsureFrameLoader();
+ void LoadSrc();
+ Document* GetContentDocument(nsIPrincipal& aSubjectPrincipal);
+ mozilla::dom::Nullable<mozilla::dom::WindowProxyHolder> GetContentWindow();
+
+ virtual void AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
+ const nsAttrValue* aValue,
+ const nsAttrValue* aOldValue,
+ nsIPrincipal* aSubjectPrincipal,
+ bool aNotify) override;
+ virtual void OnAttrSetButNotChanged(int32_t aNamespaceID, nsAtom* aName,
+ const nsAttrValueOrString& aValue,
+ bool aNotify) override;
+
+ nsCOMPtr<nsIPrincipal> mSrcTriggeringPrincipal;
+
+ /**
+ * True if we have already loaded the frame's original src
+ */
+ bool mSrcLoadHappened;
+
+ /**
+ * True when the element is created by the parser using the
+ * NS_FROM_PARSER_NETWORK flag.
+ * If the element is modified, it may lose the flag.
+ */
+ bool mNetworkCreated;
+
+ bool mBrowserFrameListenersRegistered;
+ bool mReallyIsBrowser;
+
+ // This flag is only used by <iframe>. See HTMLIFrameElement::
+ // FullscreenFlag() for details. It is placed here so that we
+ // do not bloat any struct.
+ bool mFullscreenFlag = false;
+
+ /**
+ * Represents the iframe is deferred loading until this element gets visible.
+ * We just do not load if set and leave specific elements to set it (see
+ * HTMLIFrameElement).
+ */
+ bool mLazyLoading = false;
+
+ private:
+ void GetManifestURL(nsAString& aOut);
+
+ /**
+ * This function is called by AfterSetAttr and OnAttrSetButNotChanged.
+ * It will be called whether the value is being set or unset.
+ *
+ * @param aNamespaceID the namespace of the attr being set
+ * @param aName the localname of the attribute being set
+ * @param aValue the value being set or null if the value is being unset
+ * @param aNotify Whether we plan to notify document observers.
+ */
+ void AfterMaybeChangeAttr(int32_t aNamespaceID, nsAtom* aName,
+ const nsAttrValueOrString* aValue,
+ nsIPrincipal* aMaybeScriptedPrincipal,
+ bool aNotify);
+
+ mozilla::dom::BrowsingContext* GetContentWindowInternal();
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(nsGenericHTMLFrameElement,
+ NS_GENERICHTMLFRAMEELEMENT_IID)
+
+#endif // nsGenericHTMLFrameElement_h