2015-05-03 22:32:37 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2013-03-04 23:08:23 +04:00
|
|
|
/* 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_HTMLObjectElement_h
|
|
|
|
#define mozilla_dom_HTMLObjectElement_h
|
|
|
|
|
2013-05-30 00:43:41 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2013-03-04 23:08:23 +04:00
|
|
|
#include "nsGenericHTMLElement.h"
|
|
|
|
#include "nsObjectLoadingContent.h"
|
|
|
|
#include "nsIConstraintValidation.h"
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
|
|
|
2016-06-16 10:24:16 +03:00
|
|
|
class HTMLFormSubmission;
|
2019-01-02 16:26:56 +03:00
|
|
|
template <typename T>
|
|
|
|
struct Nullable;
|
|
|
|
class WindowProxyHolder;
|
2016-06-16 10:24:16 +03:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
class HTMLObjectElement final : public nsGenericHTMLFormElement,
|
2015-03-27 21:52:19 +03:00
|
|
|
public nsObjectLoadingContent,
|
|
|
|
public nsIConstraintValidation {
|
2013-03-04 23:08:23 +04:00
|
|
|
public:
|
2018-09-21 23:45:49 +03:00
|
|
|
explicit HTMLObjectElement(
|
|
|
|
already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
|
2014-09-02 04:49:25 +04:00
|
|
|
FromParser aFromParser = NOT_FROM_PARSER);
|
2013-03-04 23:08:23 +04:00
|
|
|
|
|
|
|
// nsISupports
|
|
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
|
|
|
2018-03-22 00:39:04 +03:00
|
|
|
NS_IMPL_FROMNODE_HTML_WITH_TAG(HTMLObjectElement, object)
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual int32_t TabIndexDefault() override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
2015-02-20 19:37:02 +03:00
|
|
|
#ifdef XP_MACOSX
|
2018-04-20 07:49:30 +03:00
|
|
|
// EventTarget
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD PostHandleEvent(EventChainPostVisitor& aVisitor) override;
|
2015-03-25 01:02:52 +03:00
|
|
|
// Helper methods
|
|
|
|
static void OnFocusBlurPlugin(Element* aElement, bool aFocus);
|
2015-02-20 19:37:02 +03:00
|
|
|
static void HandleFocusBlurPlugin(Element* aElement, WidgetEvent* aEvent);
|
2015-03-27 03:38:13 +03:00
|
|
|
static void HandlePluginCrashed(Element* aElement);
|
|
|
|
static void HandlePluginInstantiated(Element* aElement);
|
2015-03-25 01:02:52 +03:00
|
|
|
// Weak pointer. Null if last action was blur.
|
|
|
|
static Element* sLastFocused;
|
2015-02-20 19:37:02 +03:00
|
|
|
#endif
|
|
|
|
|
2015-01-20 23:39:28 +03:00
|
|
|
// Element
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual bool IsInteractiveHTMLContent(bool aIgnoreTabindex) const override;
|
2015-01-20 23:39:28 +03:00
|
|
|
|
2016-10-06 07:30:35 +03:00
|
|
|
// EventTarget
|
|
|
|
virtual void AsyncEventRunning(AsyncEventDispatcher* aEvent) override;
|
|
|
|
|
Bug 1555216 - Change the signature of BindToTree to be (BindContext&, nsINode& aParentNode). r=bzbarsky
BindContext was going to have way more information at first, but then I realized
that most of the things I wanted to know were basically a flag away using the
parent node.
Still I think it's worth it, now experimenting with BindToTree will only mean
adding a field to a struct that's included from a couple cpp files, instead of a
massive pain.
I also think this is clearer, and doing this highlights quite a few
inconsistencies in our code which I've left untouched, but commented with
FIXMEs.
Steps are:
$ for file in $(rg 'nsresult BindToTree\(' | cut -d : -f 1 | sort | uniq); do sed -i 's#nsresult BindToTree(Document\* aDocument, nsIContent\* aParent,#nsresult BindToTree(BindContext\&, nsINode\& aParent)#g' $file; done
$ for file in $(rg 'nsresult BindToTree\(' | cut -d : -f 1 | sort | uniq); do sed -i 's# nsIContent\* aBindingParent) override#override#g' $file; done
$ for file in $(rg '::BindToTree\(' | cut -d : -f 1 | sort | uniq); do sed -i 's#::BindToTree(Document\* aDocument, nsIContent\* aParent,#::BindToTree(BindContext\& aContext, nsINode\& aParent)#g' $file; done
$ for file in $(rg '::BindToTree\(' | cut -d : -f 1 | sort | uniq); do sed -i 's#nsIContent\* aBindingParent)##g' $file; done
$ for file in $(rg '::BindToTree\(' | cut -d : -f 1 | sort | uniq); do sed -i 's#::BindToTree(aDocument, aParent, aBindingParent)#::BindToTree(aContext, aParent)#g' $file; done
$ ./mach clang-format
Then manual fixups.
Depends on D32948
Differential Revision: https://phabricator.services.mozilla.com/D32949
2019-05-29 07:27:04 +03:00
|
|
|
virtual nsresult BindToTree(BindContext&, nsINode& aParent) override;
|
2019-05-29 01:47:08 +03:00
|
|
|
virtual void UnbindFromTree(bool aNullParent = true) override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual bool IsHTMLFocusable(bool aWithMouse, bool* aIsFocusable,
|
|
|
|
int32_t* aTabIndex) override;
|
|
|
|
virtual IMEState GetDesiredIMEState() override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
|
|
|
// Overriden nsIFormControl methods
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD Reset() override;
|
2016-06-16 10:24:16 +03:00
|
|
|
NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual void DoneAddingChildren(bool aHaveNotified) override;
|
|
|
|
virtual bool IsDoneAddingChildren() override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
|
|
|
virtual bool ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute,
|
|
|
|
const nsAString& aValue,
|
2017-11-02 06:35:52 +03:00
|
|
|
nsIPrincipal* aMaybeScriptedPrincipal,
|
2015-03-21 19:28:04 +03:00
|
|
|
nsAttrValue& aResult) override;
|
|
|
|
virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction()
|
|
|
|
const override;
|
2017-10-03 01:05:19 +03:00
|
|
|
NS_IMETHOD_(bool) IsAttributeMapped(const nsAtom* aAttribute) const override;
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual EventStates IntrinsicState() const override;
|
|
|
|
virtual void DestroyContent() override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
|
|
|
// nsObjectLoadingContent
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual uint32_t GetCapabilities() const override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
2018-08-09 02:58:44 +03:00
|
|
|
virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override;
|
2013-03-04 23:08:23 +04:00
|
|
|
|
2018-08-09 02:58:44 +03:00
|
|
|
nsresult CopyInnerTo(Element* aDest);
|
2013-03-04 23:08:23 +04:00
|
|
|
|
2017-02-09 02:19:01 +03:00
|
|
|
void StartObjectLoad() { StartObjectLoad(true, false); }
|
2013-03-04 23:08:23 +04:00
|
|
|
|
|
|
|
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(HTMLObjectElement,
|
|
|
|
nsGenericHTMLFormElement)
|
|
|
|
|
2013-03-04 23:08:24 +04:00
|
|
|
// Web IDL binding methods
|
2017-09-23 03:05:12 +03:00
|
|
|
void GetData(DOMString& aValue) {
|
|
|
|
GetURIAttr(nsGkAtoms::data, nsGkAtoms::codebase, aValue);
|
|
|
|
}
|
2013-03-04 23:08:24 +04:00
|
|
|
void SetData(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::data, aValue, aRv);
|
|
|
|
}
|
|
|
|
void GetType(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::type, aValue); }
|
|
|
|
void SetType(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::type, aValue, aRv);
|
|
|
|
}
|
|
|
|
void GetName(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::name, aValue); }
|
|
|
|
void SetName(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::name, aValue, aRv);
|
|
|
|
}
|
|
|
|
void GetUseMap(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::usemap, aValue); }
|
|
|
|
void SetUseMap(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::usemap, aValue, aRv);
|
|
|
|
}
|
|
|
|
using nsGenericHTMLFormElement::GetForm;
|
|
|
|
void GetWidth(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::width, aValue); }
|
|
|
|
void SetWidth(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::width, aValue, aRv);
|
|
|
|
}
|
|
|
|
void GetHeight(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::height, aValue); }
|
|
|
|
void SetHeight(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::height, aValue, aRv);
|
|
|
|
}
|
|
|
|
using nsObjectLoadingContent::GetContentDocument;
|
2016-10-03 11:34:29 +03:00
|
|
|
|
2019-01-02 16:26:56 +03:00
|
|
|
Nullable<WindowProxyHolder> GetContentWindow(nsIPrincipal& aSubjectPrincipal);
|
2016-10-03 11:34:29 +03:00
|
|
|
|
2013-03-04 23:08:24 +04:00
|
|
|
using nsIConstraintValidation::GetValidationMessage;
|
2017-07-14 06:46:28 +03:00
|
|
|
using nsIConstraintValidation::SetCustomValidity;
|
2013-03-04 23:08:24 +04:00
|
|
|
void GetAlign(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::align, aValue); }
|
|
|
|
void SetAlign(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::align, aValue, aRv);
|
|
|
|
}
|
|
|
|
void GetArchive(DOMString& aValue) {
|
|
|
|
GetHTMLAttr(nsGkAtoms::archive, aValue);
|
|
|
|
}
|
|
|
|
void SetArchive(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::archive, aValue, aRv);
|
|
|
|
}
|
2017-09-23 03:05:12 +03:00
|
|
|
void GetCode(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::code, aValue); }
|
2013-03-04 23:08:24 +04:00
|
|
|
void SetCode(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::code, aValue, aRv);
|
|
|
|
}
|
|
|
|
bool Declare() { return GetBoolAttr(nsGkAtoms::declare); }
|
|
|
|
void SetDeclare(bool aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLBoolAttr(nsGkAtoms::declare, aValue, aRv);
|
|
|
|
}
|
Bug 1562257 part 4. Fix style mapping of hspace and vspace attributes to match the spec. r=mccr8
Per spec, "hspace" and "vspace" are parsed as dimension attributes and are
supported on the following elements: embed, iframe, img, object,
<input type="image">, marquee. Except no one implements this for iframe.
https://github.com/whatwg/html/issues/4742 tracks the spec changing accordingly.
As far as hspace/vpace on <table> go, Safari supports them in both quirks and
standards mode, while Chrome doesn't support them in either mode. The HTML spec
doesn't have them supported at all, and neither does the quirks mode spec, so
I'm removing the quirks-only support we had to align with the specs and Chrome.
Differential Revision: https://phabricator.services.mozilla.com/D36375
--HG--
extra : moz-landing-system : lando
2019-06-29 02:51:43 +03:00
|
|
|
uint32_t Hspace() {
|
|
|
|
return GetDimensionAttrAsUnsignedInt(nsGkAtoms::hspace, 0);
|
|
|
|
}
|
2013-03-04 23:08:24 +04:00
|
|
|
void SetHspace(uint32_t aValue, ErrorResult& aRv) {
|
2016-05-05 21:29:54 +03:00
|
|
|
SetUnsignedIntAttr(nsGkAtoms::hspace, aValue, 0, aRv);
|
2013-03-04 23:08:24 +04:00
|
|
|
}
|
|
|
|
void GetStandby(DOMString& aValue) {
|
|
|
|
GetHTMLAttr(nsGkAtoms::standby, aValue);
|
|
|
|
}
|
|
|
|
void SetStandby(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::standby, aValue, aRv);
|
|
|
|
}
|
Bug 1562257 part 4. Fix style mapping of hspace and vspace attributes to match the spec. r=mccr8
Per spec, "hspace" and "vspace" are parsed as dimension attributes and are
supported on the following elements: embed, iframe, img, object,
<input type="image">, marquee. Except no one implements this for iframe.
https://github.com/whatwg/html/issues/4742 tracks the spec changing accordingly.
As far as hspace/vpace on <table> go, Safari supports them in both quirks and
standards mode, while Chrome doesn't support them in either mode. The HTML spec
doesn't have them supported at all, and neither does the quirks mode spec, so
I'm removing the quirks-only support we had to align with the specs and Chrome.
Differential Revision: https://phabricator.services.mozilla.com/D36375
--HG--
extra : moz-landing-system : lando
2019-06-29 02:51:43 +03:00
|
|
|
uint32_t Vspace() {
|
|
|
|
return GetDimensionAttrAsUnsignedInt(nsGkAtoms::vspace, 0);
|
|
|
|
}
|
2013-03-04 23:08:24 +04:00
|
|
|
void SetVspace(uint32_t aValue, ErrorResult& aRv) {
|
2016-05-05 21:29:54 +03:00
|
|
|
SetUnsignedIntAttr(nsGkAtoms::vspace, aValue, 0, aRv);
|
2013-03-04 23:08:24 +04:00
|
|
|
}
|
2017-09-23 03:05:12 +03:00
|
|
|
void GetCodeBase(DOMString& aValue) {
|
|
|
|
GetURIAttr(nsGkAtoms::codebase, nullptr, aValue);
|
|
|
|
}
|
2013-03-04 23:08:24 +04:00
|
|
|
void SetCodeBase(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::codebase, aValue, aRv);
|
|
|
|
}
|
|
|
|
void GetCodeType(DOMString& aValue) {
|
|
|
|
GetHTMLAttr(nsGkAtoms::codetype, aValue);
|
|
|
|
}
|
|
|
|
void SetCodeType(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::codetype, aValue, aRv);
|
|
|
|
}
|
|
|
|
void GetBorder(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::border, aValue); }
|
|
|
|
void SetBorder(const nsAString& aValue, ErrorResult& aRv) {
|
|
|
|
SetHTMLAttr(nsGkAtoms::border, aValue, aRv);
|
|
|
|
}
|
2016-10-03 11:34:29 +03:00
|
|
|
|
2019-01-02 16:05:23 +03:00
|
|
|
Document* GetSVGDocument(nsIPrincipal& aSubjectPrincipal) {
|
2016-10-03 11:34:29 +03:00
|
|
|
return GetContentDocument(aSubjectPrincipal);
|
2013-03-04 23:08:24 +04:00
|
|
|
}
|
|
|
|
|
2013-03-04 23:08:23 +04:00
|
|
|
/**
|
|
|
|
* Calls LoadObject with the correct arguments to start the plugin load.
|
|
|
|
*/
|
2017-02-09 02:19:01 +03:00
|
|
|
void StartObjectLoad(bool aNotify, bool aForceLoad);
|
2013-03-04 23:08:23 +04:00
|
|
|
|
2017-03-17 00:43:34 +03:00
|
|
|
protected:
|
|
|
|
// Override for nsImageLoadingContent.
|
|
|
|
nsIContent* AsContent() override { return this; }
|
|
|
|
|
2017-10-03 01:05:19 +03:00
|
|
|
virtual nsresult AfterSetAttr(int32_t aNamespaceID, nsAtom* aName,
|
2017-06-07 20:28:20 +03:00
|
|
|
const nsAttrValue* aValue,
|
|
|
|
const nsAttrValue* aOldValue,
|
2017-10-10 00:33:38 +03:00
|
|
|
nsIPrincipal* aSubjectPrincipal,
|
2017-06-07 20:28:20 +03:00
|
|
|
bool aNotify) override;
|
2017-10-03 01:05:19 +03:00
|
|
|
virtual nsresult OnAttrSetButNotChanged(int32_t aNamespaceID, nsAtom* aName,
|
2017-06-07 20:28:20 +03:00
|
|
|
const nsAttrValueOrString& aValue,
|
|
|
|
bool aNotify) override;
|
|
|
|
|
2017-02-09 02:19:01 +03:00
|
|
|
private:
|
2013-03-04 23:08:23 +04:00
|
|
|
/**
|
|
|
|
* Returns if the element is currently focusable regardless of it's tabindex
|
|
|
|
* value. This is used to know the default tabindex value.
|
|
|
|
*/
|
|
|
|
bool IsFocusableForTabIndex();
|
2015-07-18 18:51:00 +03:00
|
|
|
|
|
|
|
nsContentPolicyType GetContentPolicyType() const override {
|
|
|
|
return nsIContentPolicy::TYPE_INTERNAL_OBJECT;
|
|
|
|
}
|
|
|
|
|
2014-07-09 01:23:16 +04:00
|
|
|
virtual ~HTMLObjectElement();
|
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual JSObject* WrapNode(JSContext* aCx,
|
|
|
|
JS::Handle<JSObject*> aGivenProto) override;
|
2013-01-07 03:55:14 +04:00
|
|
|
|
2013-11-19 23:21:29 +04:00
|
|
|
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
|
2018-06-22 19:48:42 +03:00
|
|
|
MappedDeclarations&);
|
2013-11-19 23:21:29 +04:00
|
|
|
|
2017-06-07 20:28:20 +03:00
|
|
|
/**
|
|
|
|
* This function is called by AfterSetAttr and OnAttrSetButNotChanged.
|
|
|
|
* This function will be called by AfterSetAttr whether the attribute is being
|
|
|
|
* set or unset.
|
|
|
|
*
|
|
|
|
* @param aNamespaceID the namespace of the attr being set
|
|
|
|
* @param aName the localname of the attribute being set
|
|
|
|
* @param aNotify Whether we plan to notify document observers.
|
|
|
|
*/
|
2017-10-03 01:05:19 +03:00
|
|
|
nsresult AfterMaybeChangeAttr(int32_t aNamespaceID, nsAtom* aName,
|
2017-06-07 20:28:20 +03:00
|
|
|
bool aNotify);
|
|
|
|
|
2013-03-04 23:08:23 +04:00
|
|
|
bool mIsDoneAddingChildren;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace dom
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif // mozilla_dom_HTMLObjectElement_h
|