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: */
|
2012-05-21 15:12:37 +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/. */
|
2010-07-17 01:42:12 +04:00
|
|
|
|
|
|
|
#include "SVGAnimatedLengthList.h"
|
2015-05-29 23:10:41 +03:00
|
|
|
|
2020-01-20 19:18:20 +03:00
|
|
|
#include <utility>
|
Bug 1609996 - Reorder some includes affected by the previous patches. r=froydnj
This was done by:
This was done by applying:
```
diff --git a/python/mozbuild/mozbuild/code-analysis/mach_commands.py b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
index 789affde7bbf..fe33c4c7d4d1 100644
--- a/python/mozbuild/mozbuild/code-analysis/mach_commands.py
+++ b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
@@ -2007,7 +2007,7 @@ class StaticAnalysis(MachCommandBase):
from subprocess import Popen, PIPE, check_output, CalledProcessError
diff_process = Popen(self._get_clang_format_diff_command(commit), stdout=PIPE)
- args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format]
+ args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format, '-sort-includes']
if not output_file:
args.append("-i")
```
Then running `./mach clang-format -c <commit-hash>`
Then undoing that patch.
Then running check_spidermonkey_style.py --fixup
Then running `./mach clang-format`
I had to fix four things:
* I needed to move <utility> back down in GuardObjects.h because I was hitting
obscure problems with our system include wrappers like this:
0:03.94 /usr/include/stdlib.h:550:14: error: exception specification in declaration does not match previous declaration
0:03.94 extern void *realloc (void *__ptr, size_t __size)
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/malloc_decls.h:53:1: note: previous declaration is here
0:03.94 MALLOC_DECL(realloc, void*, void*, size_t)
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozilla/mozalloc.h:22:32: note: expanded from macro 'MALLOC_DECL'
0:03.94 MOZ_MEMORY_API return_type name##_impl(__VA_ARGS__);
0:03.94 ^
0:03.94 <scratch space>:178:1: note: expanded from here
0:03.94 realloc_impl
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozmemory_wrap.h:142:41: note: expanded from macro 'realloc_impl'
0:03.94 #define realloc_impl mozmem_malloc_impl(realloc)
Which I really didn't feel like digging into.
* I had to restore the order of TrustOverrideUtils.h and related files in nss
because the .inc files depend on TrustOverrideUtils.h being included earlier.
* I had to add a missing include to RollingNumber.h
* Also had to partially restore include order in JsepSessionImpl.cpp to avoid
some -WError issues due to some static inline functions being defined in a
header but not used in the rest of the compilation unit.
Differential Revision: https://phabricator.services.mozilla.com/D60327
--HG--
extra : moz-landing-system : lando
2020-01-20 19:19:48 +03:00
|
|
|
|
|
|
|
#include "DOMSVGAnimatedLengthList.h"
|
|
|
|
#include "SVGLengthListSMILType.h"
|
2019-01-23 16:48:08 +03:00
|
|
|
#include "mozilla/SMILValue.h"
|
|
|
|
#include "mozilla/dom/SVGElement.h"
|
|
|
|
#include "mozilla/dom/SVGLengthBinding.h"
|
2010-07-17 01:42:12 +04:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
2018-02-02 16:21:33 +03:00
|
|
|
using namespace dom;
|
|
|
|
|
2010-07-17 01:42:12 +04:00
|
|
|
nsresult SVGAnimatedLengthList::SetBaseValueString(const nsAString& aValue) {
|
|
|
|
SVGLengthList newBaseValue;
|
|
|
|
nsresult rv = newBaseValue.SetValueFromString(aValue);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
DOMSVGAnimatedLengthList* domWrapper =
|
|
|
|
DOMSVGAnimatedLengthList::GetDOMWrapperIfExists(this);
|
|
|
|
if (domWrapper) {
|
|
|
|
// We must send this notification *before* changing mBaseVal! If the length
|
|
|
|
// of our baseVal is being reduced, our baseVal's DOM wrapper list may have
|
|
|
|
// to remove DOM items from itself, and any removed DOM items need to copy
|
|
|
|
// their internal counterpart values *before* we change them.
|
|
|
|
//
|
|
|
|
domWrapper->InternalBaseValListWillChangeTo(newBaseValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
// We don't need to call DidChange* here - we're only called by
|
2018-12-21 11:58:14 +03:00
|
|
|
// SVGElement::ParseAttribute under Element::SetAttr,
|
2010-07-17 01:42:12 +04:00
|
|
|
// which takes care of notifying.
|
|
|
|
|
|
|
|
rv = mBaseVal.CopyFrom(newBaseValue);
|
2010-12-20 14:13:17 +03:00
|
|
|
if (NS_FAILED(rv) && domWrapper) {
|
2010-07-17 01:42:12 +04:00
|
|
|
// Attempting to increase mBaseVal's length failed - reduce domWrapper
|
|
|
|
// back to the same length:
|
|
|
|
domWrapper->InternalBaseValListWillChangeTo(mBaseVal);
|
|
|
|
}
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
void SVGAnimatedLengthList::ClearBaseValue(uint32_t aAttrEnum) {
|
2010-07-17 01:42:12 +04:00
|
|
|
DOMSVGAnimatedLengthList* domWrapper =
|
|
|
|
DOMSVGAnimatedLengthList::GetDOMWrapperIfExists(this);
|
|
|
|
if (domWrapper) {
|
|
|
|
// We must send this notification *before* changing mBaseVal! (See above.)
|
2011-01-03 12:26:28 +03:00
|
|
|
domWrapper->InternalBaseValListWillChangeTo(SVGLengthList());
|
2010-07-17 01:42:12 +04:00
|
|
|
}
|
|
|
|
mBaseVal.Clear();
|
|
|
|
// Caller notifies
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult SVGAnimatedLengthList::SetAnimValue(const SVGLengthList& aNewAnimValue,
|
2018-12-21 11:58:14 +03:00
|
|
|
SVGElement* aElement,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aAttrEnum) {
|
2010-07-17 01:42:12 +04:00
|
|
|
DOMSVGAnimatedLengthList* domWrapper =
|
|
|
|
DOMSVGAnimatedLengthList::GetDOMWrapperIfExists(this);
|
|
|
|
if (domWrapper) {
|
|
|
|
// A new animation may totally change the number of items in the animVal
|
|
|
|
// list, replacing what was essentially a mirror of the baseVal list, or
|
|
|
|
// else replacing and overriding an existing animation. When this happens
|
|
|
|
// we must try and keep our animVal's DOM wrapper in sync (see the comment
|
|
|
|
// in DOMSVGAnimatedLengthList::InternalBaseValListWillChangeTo).
|
|
|
|
//
|
|
|
|
// It's not possible for us to reliably distinguish between calls to this
|
|
|
|
// method that are setting a new sample for an existing animation, and
|
|
|
|
// calls that are setting the first sample of an animation that will
|
|
|
|
// override an existing animation. Happily it's cheap to just blindly
|
|
|
|
// notify our animVal's DOM wrapper of its internal counterpart's new value
|
|
|
|
// each time this method is called, so that's what we do.
|
|
|
|
//
|
|
|
|
// Note that we must send this notification *before* setting or changing
|
|
|
|
// mAnimVal! (See the comment in SetBaseValueString above.)
|
|
|
|
//
|
|
|
|
domWrapper->InternalAnimValListWillChangeTo(aNewAnimValue);
|
|
|
|
}
|
|
|
|
if (!mAnimVal) {
|
2020-02-25 23:03:26 +03:00
|
|
|
mAnimVal = MakeUnique<SVGLengthList>();
|
2010-07-17 01:42:12 +04:00
|
|
|
}
|
|
|
|
nsresult rv = mAnimVal->CopyFrom(aNewAnimValue);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
// OOM. We clear the animation, and, importantly, ClearAnimValue() ensures
|
|
|
|
// that mAnimVal and its DOM wrapper (if any) will have the same length!
|
|
|
|
ClearAnimValue(aElement, aAttrEnum);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
aElement->DidAnimateLengthList(aAttrEnum);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2018-12-21 11:58:14 +03:00
|
|
|
void SVGAnimatedLengthList::ClearAnimValue(SVGElement* aElement,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aAttrEnum) {
|
2010-07-17 01:42:12 +04:00
|
|
|
DOMSVGAnimatedLengthList* domWrapper =
|
|
|
|
DOMSVGAnimatedLengthList::GetDOMWrapperIfExists(this);
|
|
|
|
if (domWrapper) {
|
|
|
|
// When all animation ends, animVal simply mirrors baseVal, which may have
|
|
|
|
// a different number of items to the last active animated value. We must
|
|
|
|
// keep the length of our animVal's DOM wrapper list in sync, and again we
|
|
|
|
// must do that before touching mAnimVal. See comments above.
|
|
|
|
//
|
|
|
|
domWrapper->InternalAnimValListWillChangeTo(mBaseVal);
|
|
|
|
}
|
2012-07-30 18:20:58 +04:00
|
|
|
mAnimVal = nullptr;
|
2010-07-17 01:42:12 +04:00
|
|
|
aElement->DidAnimateLengthList(aAttrEnum);
|
|
|
|
}
|
|
|
|
|
2019-01-25 06:24:01 +03:00
|
|
|
UniquePtr<SMILAttr> SVGAnimatedLengthList::ToSMILAttr(SVGElement* aSVGElement,
|
|
|
|
uint8_t aAttrEnum,
|
|
|
|
uint8_t aAxis,
|
|
|
|
bool aCanZeroPadList) {
|
2017-03-30 07:10:07 +03:00
|
|
|
return MakeUnique<SMILAnimatedLengthList>(this, aSVGElement, aAttrEnum, aAxis,
|
|
|
|
aCanZeroPadList);
|
2010-07-17 01:42:12 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult SVGAnimatedLengthList::SMILAnimatedLengthList::ValueFromString(
|
2013-03-19 07:18:45 +04:00
|
|
|
const nsAString& aStr, const dom::SVGAnimationElement* /*aSrcElement*/,
|
2019-01-23 16:48:08 +03:00
|
|
|
SMILValue& aValue, bool& aPreventCachingOfSandwich) const {
|
|
|
|
SMILValue val(&SVGLengthListSMILType::sSingleton);
|
2010-07-17 01:42:12 +04:00
|
|
|
SVGLengthListAndInfo* llai = static_cast<SVGLengthListAndInfo*>(val.mU.mPtr);
|
|
|
|
nsresult rv = llai->SetValueFromString(aStr);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
llai->SetInfo(mElement, mAxis, mCanZeroPadList);
|
2018-05-30 22:15:35 +03:00
|
|
|
aValue = std::move(val);
|
2010-07-17 01:42:12 +04:00
|
|
|
|
|
|
|
// If any of the lengths in the list depend on their context, then we must
|
|
|
|
// prevent caching of the entire animation sandwich. This is because the
|
|
|
|
// units of a length at a given index can change from sandwich layer to
|
|
|
|
// layer, and indeed even be different within a single sandwich layer. If
|
|
|
|
// any length in the result of an animation sandwich is the result of the
|
|
|
|
// addition of lengths where one or more of those lengths is context
|
|
|
|
// dependent, then naturally the resultant length is also context
|
|
|
|
// dependent, regardless of whether its actual unit is context dependent or
|
|
|
|
// not. Unfortunately normal invalidation mechanisms won't cause us to
|
|
|
|
// recalculate the result of the sandwich if the context changes, so we
|
|
|
|
// take the (substantial) performance hit of preventing caching of the
|
|
|
|
// sandwich layer, causing the animation sandwich to be recalculated every
|
|
|
|
// single sample.
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
aPreventCachingOfSandwich = false;
|
2012-08-22 19:56:38 +04:00
|
|
|
for (uint32_t i = 0; i < llai->Length(); ++i) {
|
|
|
|
uint8_t unit = (*llai)[i].GetUnit();
|
2018-06-26 00:20:54 +03:00
|
|
|
if (unit == SVGLength_Binding::SVG_LENGTHTYPE_PERCENTAGE ||
|
|
|
|
unit == SVGLength_Binding::SVG_LENGTHTYPE_EMS ||
|
|
|
|
unit == SVGLength_Binding::SVG_LENGTHTYPE_EXS) {
|
2011-10-17 18:59:28 +04:00
|
|
|
aPreventCachingOfSandwich = true;
|
2010-07-17 01:42:12 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2019-01-23 16:48:08 +03:00
|
|
|
SMILValue SVGAnimatedLengthList::SMILAnimatedLengthList::GetBaseValue() const {
|
2010-07-17 01:42:12 +04:00
|
|
|
// To benefit from Return Value Optimization and avoid copy constructor calls
|
|
|
|
// due to our use of return-by-value, we must return the exact same object
|
|
|
|
// from ALL return points. This function must only return THIS variable:
|
2019-01-23 16:48:08 +03:00
|
|
|
SMILValue val;
|
2010-07-17 01:42:12 +04:00
|
|
|
|
2019-01-23 16:48:08 +03:00
|
|
|
SMILValue tmp(&SVGLengthListSMILType::sSingleton);
|
2010-07-17 01:42:12 +04:00
|
|
|
SVGLengthListAndInfo* llai = static_cast<SVGLengthListAndInfo*>(tmp.mU.mPtr);
|
|
|
|
nsresult rv = llai->CopyFrom(mVal->mBaseVal);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
llai->SetInfo(mElement, mAxis, mCanZeroPadList);
|
2018-05-30 22:15:35 +03:00
|
|
|
val = std::move(tmp);
|
2010-07-17 01:42:12 +04:00
|
|
|
}
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult SVGAnimatedLengthList::SMILAnimatedLengthList::SetAnimValue(
|
2019-01-23 16:48:08 +03:00
|
|
|
const SMILValue& aValue) {
|
2010-07-17 01:42:12 +04:00
|
|
|
NS_ASSERTION(aValue.mType == &SVGLengthListSMILType::sSingleton,
|
|
|
|
"Unexpected type to assign animated value");
|
|
|
|
if (aValue.mType == &SVGLengthListSMILType::sSingleton) {
|
|
|
|
mVal->SetAnimValue(*static_cast<SVGLengthListAndInfo*>(aValue.mU.mPtr),
|
|
|
|
mElement, mAttrEnum);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SVGAnimatedLengthList::SMILAnimatedLengthList::ClearAnimValue() {
|
|
|
|
if (mVal->mAnimVal) {
|
|
|
|
mVal->ClearAnimValue(mElement, mAttrEnum);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace mozilla
|