summaryrefslogtreecommitdiffstats
path: root/dom/smil/nsSMILSetAnimationFunction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/smil/nsSMILSetAnimationFunction.cpp')
-rw-r--r--dom/smil/nsSMILSetAnimationFunction.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/dom/smil/nsSMILSetAnimationFunction.cpp b/dom/smil/nsSMILSetAnimationFunction.cpp
new file mode 100644
index 000000000..d636f9aff
--- /dev/null
+++ b/dom/smil/nsSMILSetAnimationFunction.cpp
@@ -0,0 +1,101 @@
+/* -*- 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 "nsSMILSetAnimationFunction.h"
+
+inline bool
+nsSMILSetAnimationFunction::IsDisallowedAttribute(
+ const nsIAtom* aAttribute) const
+{
+ //
+ // A <set> element is similar to <animate> but lacks:
+ // AnimationValue.attrib(calcMode, values, keyTimes, keySplines, from, to,
+ // by) -- BUT has 'to'
+ // AnimationAddition.attrib(additive, accumulate)
+ //
+ if (aAttribute == nsGkAtoms::calcMode ||
+ aAttribute == nsGkAtoms::values ||
+ aAttribute == nsGkAtoms::keyTimes ||
+ aAttribute == nsGkAtoms::keySplines ||
+ aAttribute == nsGkAtoms::from ||
+ aAttribute == nsGkAtoms::by ||
+ aAttribute == nsGkAtoms::additive ||
+ aAttribute == nsGkAtoms::accumulate) {
+ return true;
+ }
+
+ return false;
+}
+
+bool
+nsSMILSetAnimationFunction::SetAttr(nsIAtom* aAttribute,
+ const nsAString& aValue,
+ nsAttrValue& aResult,
+ nsresult* aParseResult)
+{
+ if (IsDisallowedAttribute(aAttribute)) {
+ aResult.SetTo(aValue);
+ if (aParseResult) {
+ // SMILANIM 4.2 says:
+ //
+ // The additive and accumulate attributes are not allowed, and will be
+ // ignored if specified.
+ //
+ // So at least for those two attributes we shouldn't report an error even
+ // if they're present. For now we'll also just silently ignore other
+ // attribute types too.
+ *aParseResult = NS_OK;
+ }
+ return true;
+ }
+
+ return nsSMILAnimationFunction::SetAttr(aAttribute, aValue,
+ aResult, aParseResult);
+}
+
+bool
+nsSMILSetAnimationFunction::UnsetAttr(nsIAtom* aAttribute)
+{
+ if (IsDisallowedAttribute(aAttribute)) {
+ return true;
+ }
+
+ return nsSMILAnimationFunction::UnsetAttr(aAttribute);
+}
+
+bool
+nsSMILSetAnimationFunction::HasAttr(nsIAtom* aAttName) const
+{
+ if (IsDisallowedAttribute(aAttName))
+ return false;
+
+ return nsSMILAnimationFunction::HasAttr(aAttName);
+}
+
+const nsAttrValue*
+nsSMILSetAnimationFunction::GetAttr(nsIAtom* aAttName) const
+{
+ if (IsDisallowedAttribute(aAttName))
+ return nullptr;
+
+ return nsSMILAnimationFunction::GetAttr(aAttName);
+}
+
+bool
+nsSMILSetAnimationFunction::GetAttr(nsIAtom* aAttName,
+ nsAString& aResult) const
+{
+ if (IsDisallowedAttribute(aAttName))
+ return false;
+
+ return nsSMILAnimationFunction::GetAttr(aAttName, aResult);
+}
+
+bool
+nsSMILSetAnimationFunction::WillReplace() const
+{
+ return true;
+}