summaryrefslogtreecommitdiffstats
path: root/dom/html/HTMLSharedObjectElement.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html/HTMLSharedObjectElement.h')
-rw-r--r--dom/html/HTMLSharedObjectElement.h243
1 files changed, 243 insertions, 0 deletions
diff --git a/dom/html/HTMLSharedObjectElement.h b/dom/html/HTMLSharedObjectElement.h
new file mode 100644
index 000000000..c70ba8ebd
--- /dev/null
+++ b/dom/html/HTMLSharedObjectElement.h
@@ -0,0 +1,243 @@
+/* -*- 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 mozilla_dom_HTMLSharedObjectElement_h
+#define mozilla_dom_HTMLSharedObjectElement_h
+
+#include "mozilla/Attributes.h"
+#include "nsGenericHTMLElement.h"
+#include "nsObjectLoadingContent.h"
+#include "nsGkAtoms.h"
+#include "nsError.h"
+#include "nsIDOMHTMLAppletElement.h"
+#include "nsIDOMHTMLEmbedElement.h"
+
+namespace mozilla {
+namespace dom {
+
+class HTMLSharedObjectElement final : public nsGenericHTMLElement
+ , public nsObjectLoadingContent
+ , public nsIDOMHTMLAppletElement
+ , public nsIDOMHTMLEmbedElement
+{
+public:
+ explicit HTMLSharedObjectElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo,
+ mozilla::dom::FromParser aFromParser = mozilla::dom::NOT_FROM_PARSER);
+
+ // nsISupports
+ NS_DECL_ISUPPORTS_INHERITED
+
+ virtual int32_t TabIndexDefault() override;
+
+#ifdef XP_MACOSX
+ // nsIDOMEventTarget
+ NS_IMETHOD PostHandleEvent(EventChainPostVisitor& aVisitor) override;
+#endif
+
+ // nsIDOMHTMLAppletElement
+ NS_DECL_NSIDOMHTMLAPPLETELEMENT
+
+ // Can't use macro for nsIDOMHTMLEmbedElement because it has conflicts with
+ // NS_DECL_NSIDOMHTMLAPPLETELEMENT.
+
+ // EventTarget
+ virtual void AsyncEventRunning(AsyncEventDispatcher* aEvent) override;
+
+ // nsIDOMHTMLEmbedElement
+ NS_IMETHOD GetSrc(nsAString &aSrc) override;
+ NS_IMETHOD SetSrc(const nsAString &aSrc) override;
+ NS_IMETHOD GetType(nsAString &aType) override;
+ NS_IMETHOD SetType(const nsAString &aType) override;
+
+ virtual nsresult BindToTree(nsIDocument *aDocument, nsIContent *aParent,
+ nsIContent *aBindingParent,
+ bool aCompileEventHandlers) override;
+ virtual void UnbindFromTree(bool aDeep = true,
+ bool aNullParent = true) override;
+ virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom *aName,
+ nsIAtom *aPrefix, const nsAString &aValue,
+ bool aNotify) override;
+
+ virtual bool IsHTMLFocusable(bool aWithMouse, bool *aIsFocusable, int32_t *aTabIndex) override;
+ virtual IMEState GetDesiredIMEState() override;
+
+ virtual void DoneAddingChildren(bool aHaveNotified) override;
+ virtual bool IsDoneAddingChildren() override;
+
+ virtual bool ParseAttribute(int32_t aNamespaceID,
+ nsIAtom *aAttribute,
+ const nsAString &aValue,
+ nsAttrValue &aResult) override;
+ virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction() const override;
+ NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom *aAttribute) const override;
+ virtual EventStates IntrinsicState() const override;
+ virtual void DestroyContent() override;
+
+ // nsObjectLoadingContent
+ virtual uint32_t GetCapabilities() const override;
+
+ virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override;
+
+ nsresult CopyInnerTo(Element* aDest);
+
+ void StartObjectLoad() { StartObjectLoad(true, false); }
+
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_NO_UNLINK(HTMLSharedObjectElement,
+ nsGenericHTMLElement)
+
+ // WebIDL API for <applet>
+ void GetAlign(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::align, aValue);
+ }
+ void SetAlign(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::align, aValue, aRv);
+ }
+ void GetAlt(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::alt, aValue);
+ }
+ void SetAlt(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::alt, aValue, aRv);
+ }
+ void GetArchive(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::archive, aValue);
+ }
+ void SetArchive(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::archive, aValue, aRv);
+ }
+ void GetCode(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::code, aValue);
+ }
+ void SetCode(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::code, aValue, aRv);
+ }
+ // XPCOM GetCodebase is ok; note that it's a URI attribute
+ void SetCodeBase(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::codebase, aValue, aRv);
+ }
+ void GetHeight(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::height, aValue);
+ }
+ void SetHeight(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::height, aValue, aRv);
+ }
+ uint32_t Hspace()
+ {
+ return GetUnsignedIntAttr(nsGkAtoms::hspace, 0);
+ }
+ void SetHspace(uint32_t aValue, ErrorResult& aRv)
+ {
+ SetUnsignedIntAttr(nsGkAtoms::hspace, aValue, 0, aRv);
+ }
+ void GetName(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::name, aValue);
+ }
+ void SetName(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::name, aValue, aRv);
+ }
+ // XPCOM GetObject is ok; note that it's a URI attribute with a weird base URI
+ void SetObject(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::object, aValue, aRv);
+ }
+ uint32_t Vspace()
+ {
+ return GetUnsignedIntAttr(nsGkAtoms::vspace, 0);
+ }
+ void SetVspace(uint32_t aValue, ErrorResult& aRv)
+ {
+ SetUnsignedIntAttr(nsGkAtoms::vspace, aValue, 0, aRv);
+ }
+ void GetWidth(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::width, aValue);
+ }
+ void SetWidth(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::width, aValue, aRv);
+ }
+
+ // WebIDL <embed> api
+ // XPCOM GetSrc is ok; note that it's a URI attribute
+ void SetSrc(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::src, aValue, aRv);
+ }
+ void GetType(DOMString& aValue)
+ {
+ GetHTMLAttr(nsGkAtoms::type, aValue);
+ }
+ void SetType(const nsAString& aValue, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::type, aValue, aRv);
+ }
+ // width covered by <applet>
+ // height covered by <applet>
+ // align covered by <applet>
+ // name covered by <applet>
+ nsIDocument*
+ GetSVGDocument(nsIPrincipal& aSubjectPrincipal)
+ {
+ return GetContentDocument(aSubjectPrincipal);
+ }
+
+ /**
+ * Calls LoadObject with the correct arguments to start the plugin load.
+ */
+ void StartObjectLoad(bool aNotify, bool aForceLoad);
+private:
+ virtual ~HTMLSharedObjectElement();
+
+ nsIAtom *URIAttrName() const
+ {
+ return mNodeInfo->Equals(nsGkAtoms::applet) ?
+ nsGkAtoms::code :
+ nsGkAtoms::src;
+ }
+
+ nsContentPolicyType GetContentPolicyType() const override;
+
+ // mIsDoneAddingChildren is only really used for <applet>. This boolean is
+ // always true for <embed>, per the documentation in nsIContent.h.
+ bool mIsDoneAddingChildren;
+
+ virtual JSObject* WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
+ nsRuleData* aData);
+
+ /**
+ * Decides whether we should load embed node content.
+ *
+ * If this is an embed node there are cases in which we should not try to load
+ * the content:
+ *
+ * - If the embed node is the child of a media element
+ * - If the embed node is the child of an object node that already has
+ * content being loaded.
+ *
+ * In these cases, this function will return false, which will cause
+ * us to skip calling LoadObject.
+ */
+ bool BlockEmbedContentLoading();
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_HTMLSharedObjectElement_h