2018-11-14 08:29:11 +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: */
|
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
#include "mozilla/dom/HTMLMarqueeElement.h"
|
|
|
|
#include "nsGenericHTMLElement.h"
|
|
|
|
#include "nsStyleConsts.h"
|
|
|
|
#include "nsMappedAttributes.h"
|
2018-11-18 04:23:52 +03:00
|
|
|
#include "mozilla/AsyncEventDispatcher.h"
|
2018-11-14 08:29:11 +03:00
|
|
|
#include "mozilla/dom/HTMLMarqueeElementBinding.h"
|
|
|
|
#include "mozilla/dom/CustomEvent.h"
|
|
|
|
// This is to pick up the definition of FunctionStringCallback:
|
|
|
|
#include "mozilla/dom/DataTransferItemBinding.h"
|
2018-11-18 04:23:52 +03:00
|
|
|
#include "mozilla/dom/ShadowRoot.h"
|
2018-11-14 08:29:11 +03:00
|
|
|
|
|
|
|
NS_IMPL_NS_NEW_HTML_ELEMENT(Marquee)
|
|
|
|
|
2020-11-04 20:04:01 +03:00
|
|
|
namespace mozilla::dom {
|
2018-11-14 08:29:11 +03:00
|
|
|
|
2020-02-20 19:19:15 +03:00
|
|
|
HTMLMarqueeElement::~HTMLMarqueeElement() = default;
|
2018-11-14 08:29:11 +03:00
|
|
|
|
|
|
|
NS_IMPL_ELEMENT_CLONE(HTMLMarqueeElement)
|
|
|
|
|
|
|
|
static const nsAttrValue::EnumTable kBehaviorTable[] = {
|
|
|
|
{"scroll", 1}, {"slide", 2}, {"alternate", 3}, {nullptr, 0}};
|
|
|
|
|
|
|
|
// Default behavior value is "scroll".
|
|
|
|
static const nsAttrValue::EnumTable* kDefaultBehavior = &kBehaviorTable[0];
|
|
|
|
|
|
|
|
static const nsAttrValue::EnumTable kDirectionTable[] = {
|
|
|
|
{"left", 1}, {"right", 2}, {"up", 3}, {"down", 4}, {nullptr, 0}};
|
|
|
|
|
|
|
|
// Default direction value is "left".
|
|
|
|
static const nsAttrValue::EnumTable* kDefaultDirection = &kDirectionTable[0];
|
|
|
|
|
2018-11-08 17:46:45 +03:00
|
|
|
bool HTMLMarqueeElement::IsEventAttributeNameInternal(nsAtom* aName) {
|
|
|
|
return nsContentUtils::IsEventAttributeName(
|
|
|
|
aName, EventNameType_HTML | EventNameType_HTMLMarqueeOnly);
|
|
|
|
}
|
|
|
|
|
2018-11-14 08:29:11 +03:00
|
|
|
JSObject* HTMLMarqueeElement::WrapNode(JSContext* aCx,
|
|
|
|
JS::Handle<JSObject*> aGivenProto) {
|
|
|
|
return dom::HTMLMarqueeElement_Binding::Wrap(aCx, this, aGivenProto);
|
|
|
|
}
|
|
|
|
|
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
|
|
|
nsresult HTMLMarqueeElement::BindToTree(BindContext& aContext,
|
|
|
|
nsINode& aParent) {
|
|
|
|
nsresult rv = nsGenericHTMLElement::BindToTree(aContext, aParent);
|
2018-11-18 04:23:52 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2019-01-25 17:24:43 +03:00
|
|
|
if (IsInComposedDoc()) {
|
2018-11-18 04:23:52 +03:00
|
|
|
AttachAndSetUAShadowRoot();
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2019-05-29 01:47:08 +03:00
|
|
|
void HTMLMarqueeElement::UnbindFromTree(bool aNullParent) {
|
2019-01-25 17:24:43 +03:00
|
|
|
if (IsInComposedDoc()) {
|
2018-12-15 05:48:46 +03:00
|
|
|
// We don't want to unattach the shadow root because it used to
|
|
|
|
// contain a <slot>.
|
|
|
|
NotifyUAWidgetTeardown(UnattachShadowRoot::No);
|
2018-11-18 04:23:52 +03:00
|
|
|
}
|
|
|
|
|
2019-05-29 01:47:08 +03:00
|
|
|
nsGenericHTMLElement::UnbindFromTree(aNullParent);
|
2018-11-18 04:23:52 +03:00
|
|
|
}
|
|
|
|
|
2018-11-14 08:29:11 +03:00
|
|
|
void HTMLMarqueeElement::GetBehavior(nsAString& aValue) {
|
|
|
|
GetEnumAttr(nsGkAtoms::behavior, kDefaultBehavior->tag, aValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
void HTMLMarqueeElement::GetDirection(nsAString& aValue) {
|
|
|
|
GetEnumAttr(nsGkAtoms::direction, kDefaultDirection->tag, aValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool HTMLMarqueeElement::ParseAttribute(int32_t aNamespaceID,
|
|
|
|
nsAtom* aAttribute,
|
|
|
|
const nsAString& aValue,
|
|
|
|
nsIPrincipal* aMaybeScriptedPrincipal,
|
|
|
|
nsAttrValue& aResult) {
|
|
|
|
if (aNamespaceID == kNameSpaceID_None) {
|
|
|
|
if ((aAttribute == nsGkAtoms::width) || (aAttribute == nsGkAtoms::height)) {
|
2019-06-28 23:56:55 +03:00
|
|
|
return aResult.ParseHTMLDimension(aValue);
|
2018-11-14 08:29:11 +03:00
|
|
|
}
|
|
|
|
if (aAttribute == nsGkAtoms::bgcolor) {
|
|
|
|
return aResult.ParseColor(aValue);
|
|
|
|
}
|
|
|
|
if (aAttribute == nsGkAtoms::behavior) {
|
|
|
|
return aResult.ParseEnumValue(aValue, kBehaviorTable, false,
|
|
|
|
kDefaultBehavior);
|
|
|
|
}
|
|
|
|
if (aAttribute == nsGkAtoms::direction) {
|
|
|
|
return aResult.ParseEnumValue(aValue, kDirectionTable, false,
|
|
|
|
kDefaultDirection);
|
|
|
|
}
|
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
|
|
|
if (aAttribute == nsGkAtoms::hspace || aAttribute == nsGkAtoms::vspace) {
|
|
|
|
return aResult.ParseHTMLDimension(aValue);
|
2018-11-14 08:29:11 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (aAttribute == nsGkAtoms::loop) {
|
|
|
|
return aResult.ParseIntValue(aValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aAttribute == nsGkAtoms::scrollamount ||
|
|
|
|
aAttribute == nsGkAtoms::scrolldelay) {
|
|
|
|
return aResult.ParseNonNegativeIntValue(aValue);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nsGenericHTMLElement::ParseAttribute(aNamespaceID, aAttribute, aValue,
|
|
|
|
aMaybeScriptedPrincipal, aResult);
|
|
|
|
}
|
|
|
|
|
2018-11-18 04:23:52 +03:00
|
|
|
nsresult HTMLMarqueeElement::AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
|
|
|
|
const nsAttrValue* aValue,
|
|
|
|
const nsAttrValue* aOldValue,
|
|
|
|
nsIPrincipal* aMaybeScriptedPrincipal,
|
|
|
|
bool aNotify) {
|
2019-01-28 22:19:14 +03:00
|
|
|
if (IsInComposedDoc() && aNameSpaceID == kNameSpaceID_None &&
|
|
|
|
aName == nsGkAtoms::direction) {
|
2018-12-15 05:48:46 +03:00
|
|
|
NotifyUAWidgetSetupOrChange();
|
2018-11-18 04:23:52 +03:00
|
|
|
}
|
|
|
|
return nsGenericHTMLElement::AfterSetAttr(
|
|
|
|
aNameSpaceID, aName, aValue, aOldValue, aMaybeScriptedPrincipal, aNotify);
|
|
|
|
}
|
|
|
|
|
2018-11-14 08:29:11 +03:00
|
|
|
void HTMLMarqueeElement::MapAttributesIntoRule(
|
|
|
|
const nsMappedAttributes* aAttributes, MappedDeclarations& aDecls) {
|
|
|
|
nsGenericHTMLElement::MapImageMarginAttributeInto(aAttributes, aDecls);
|
|
|
|
nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aDecls);
|
|
|
|
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aDecls);
|
|
|
|
nsGenericHTMLElement::MapBGColorInto(aAttributes, aDecls);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP_(bool)
|
|
|
|
HTMLMarqueeElement::IsAttributeMapped(const nsAtom* aAttribute) const {
|
|
|
|
static const MappedAttributeEntry* const map[] = {
|
|
|
|
sImageMarginSizeAttributeMap, sBackgroundColorAttributeMap,
|
|
|
|
sCommonAttributeMap};
|
|
|
|
return FindAttributeDependence(aAttribute, map);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsMapRuleToAttributesFunc HTMLMarqueeElement::GetAttributeMappingFunction()
|
|
|
|
const {
|
|
|
|
return &MapAttributesIntoRule;
|
|
|
|
}
|
|
|
|
|
2018-11-18 04:23:52 +03:00
|
|
|
void HTMLMarqueeElement::DispatchEventToShadowRoot(
|
|
|
|
const nsAString& aEventTypeArg) {
|
|
|
|
// Dispatch the event to the UA Widget Shadow Root, make it inaccessible to
|
|
|
|
// document.
|
|
|
|
RefPtr<nsINode> shadow = GetShadowRoot();
|
|
|
|
MOZ_ASSERT(shadow);
|
|
|
|
RefPtr<Event> event = new Event(shadow, nullptr, nullptr);
|
|
|
|
event->InitEvent(aEventTypeArg, false, false);
|
|
|
|
event->SetTrusted(true);
|
|
|
|
shadow->DispatchEvent(*event, IgnoreErrors());
|
|
|
|
}
|
|
|
|
|
2018-11-14 08:29:11 +03:00
|
|
|
void HTMLMarqueeElement::Start() {
|
2018-11-18 04:23:52 +03:00
|
|
|
if (GetShadowRoot()) {
|
|
|
|
DispatchEventToShadowRoot(u"marquee-start"_ns);
|
2018-11-14 08:29:11 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void HTMLMarqueeElement::Stop() {
|
2018-11-18 04:23:52 +03:00
|
|
|
if (GetShadowRoot()) {
|
|
|
|
DispatchEventToShadowRoot(u"marquee-stop"_ns);
|
2018-11-14 08:29:11 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-04 20:04:01 +03:00
|
|
|
} // namespace mozilla::dom
|