mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 05:11:03 +00:00
bc8ce42355
- Bug 1226200: Don't assume a TCPSocket has only one managee (and rename LoneManagedOrNull) r=jdm (aa2d0fcc14) - Bug 1227300, Part 1 - Add an alert notification component. r=MattN,wchen (37758ce9ff) - Bug 1230700. Make Notification::ShowInternal explicitly suppress the exception from GetPermissionInternal. r=smaug (9e288cf5ae) - Bug 1225336 - Add telemetry about web notification display/messages. r=wchen,kitcambridge p=vladan# Please enter the commit message for your changes. Lines starting (b2e481691a) - Bug 1219030 - Collect notification management telemetry. r=wchen,MattN; p=ally (c0ba425b4e) - Bug 1212611 - Use system notification for website notifications in Android. r=mfinkle (84985bcf01) - Bug 1227300, Part 2 - Implement showAlert. r=MattN,wchen (33eedc7e91) - Bug 1214305 - Part 0: Ensure site security service is initialized before trying to use DataStorage via IPC. (8bd73f43b0) - Bug 1137681 - Make user agent docshell overrides affect network requests. r=jduell (e8dabb8338) - Bug 1233245 - Propagate the interception information in the non-e10s case for all HTTP redirects, not just the internal ones; r=jdm (6922fddcf8) - Bug 1226444 - Use helper function to identify preloads. r=sicking (d110669f73) - Bug 1214305 - Part 1: Refactor the logic for querying whether a connection should go through a secure upgrade into NS_ShouldSecureUpgrade; r=mcmanus (2d04c78290) - Bug 1137681 - Per-tab user agent emulation. r=bz (4ff70db690) - Bug 1227300, Part 3 - Implement showAlert for the OS X alerts backend. r=mstange (5eb05d0728) - Bug 1227300, Part 4 - Implement showAlert for the libnotify alerts backend. r=karlt (0942fa2764) - Bug 1227300, Part 5 - Implement showAlert for the B2G alerts backend. r=mhenretty (e39581aea5) - Bug 1227300, Part 6 - Use showAlert to display web notifications. r=wchen (ab79eaa0c8) - domBug 1227300, Part 7 - Update test interfaces. a=testonly (387cb62772) - Bug 1214305 - Part 3: Add a nsIInterceptedChannel.secureUpgradedChannelURI helper; r=jdm (811d25bd58) - Bug 1214305 - Part 4: Use the secure upgraded channel URI in ServiceWorkerManager::PrepareFetchEvent; r=jdm (0c44bf527c) - Bug 1214305 - Part 5: Use the secure upgraded channel URI in FetchEventRunnable::Init; r=jdm (a30f239261) - Bug 1214305 - Part 6: Use a non-IPC redirect for synthesized upgraded responses to ensure the response URL is correctly propagated; r=mcmanus (8ba8a5728c) - Bug 1214305 - Part 7: Decide in the child process whether an intercepted channel should go through a secure upgrade; r=mcmanus (93e27decae) - Bug 1198397 - Add a test for interception of requests upgraded through the CSP upgrade-insecure-requests directive; r=jdm (21eb14eb34) - Bug 1214305 - Part 8: Enable secure upgrade service worker tests on e10s; r=jdm (c14f5fb504) - Bug 1214305 - Part 10: Clean up global DataStorage references in the child process; r=keeler (ef0b52d049) - Bug 1224771 - Close all web notifications when the originating tab is closed. r=wchen (da295b4ba7) - Bug 1214305 - Part 2: Refactor the logic for obtaining the secure upgraded URI into HttpBaseChannel; r=mcmanus (3346078285) - Bug 1237151 (part 1) - Remove ignored qualifiers in dom/media/gmp/. r=cpearce. (18134820a6) - Bug 1237151 (part 2) - Remove ignored qualifiers in WebRTC-relate code. r=jesup. (effe5bd694) - Bug 1118820 part 1 (style system part) - [css-grid] Implement the 'auto-fill' and 'auto-fit' keywords in the repeat() function. r=dholbert (5db1a577db) - Bug 1118820 part 2a - [css-grid] Add a LineNameMap class that lets us lookup line names with a dynamic number of 'repeat(auto-fill/auto-fit)' tracks taken into account. r=dholbert (3ecf4b53f0) - Bug 1118820 part 2b - [css-grid] Move the static functions FindLine/RFindLine/FindNamedLine into the LineNameMap class (idempotent patch). r=dholbert (efb12c594b) - Bug 1118820 part 2c+2d - [css-grid] Modify the LineNameMap::FindLine/RFindLine/FindNamedLine methods to take line names associated with 'repeat(auto-fill/auto-fit)' tracks into account. Instantiate and pass around a LineNameMap object instead of an array of line name arrays. r=dholbert (a3db750297) - Bug 1118820 part 3a - [css-grid] Modify TrackSizingFunctions to take a dynamic number of 'repeat(auto-fill/auto-fit)' tracks taking into account. r=dholbert (9aa6033332) - Bug 1118820 part 3b - [css-grid] Implement the CalculateRepeatFillCount method that calculates the number of 'repeat(auto-fill/auto-fit)' tracks to use for the given sizes. r=dholbert (cf75fab8a8) - Bug 1118820 part 4 - [css-grid] Provide the sizes to use for CalculateRepeatFillCount. r=dholbert (8184c00dba) - Bug 1118820 part 5 - [css-grid] Remove any empty 'repeat(auto-fit)' tracks at the end of its range and adjust affected grid area line numbers accordingly. r=dholbert (c02ba6a6e3) - Bug 1229165 - [css-grid] Reftests for min/max-width/height properties on the grid container. (725097f878) - Bug 1229999 - [css-grid] Reftest. (51b5bc9535) - Bug 1237151 (part 3) - Remove ignored qualifiers in all remaining code. r=froydnj. (69917ebbad) - more bits of Bug 1178892 - Split the profiler into Core & Gecko files (41bb127b9c) - Bug 1199841 - Restructure private browsing to remember status after OnStopRequest r=jdm (16c2c1044d) - Bug 1233845 - Report an interception error and cancel the HTTP channel when encountering a known topcrash situation. r=ehsan (5d08075110) - Bug 664163 - Fix Get(Local|Remote)(Address|Port) in HttpChannelChild. r=jduell (cbf70af4e8) - Bug 1229177 - Show the tracking protection shield for fetch and XHR requests. r=jduell (5833b3e872) - Bug 1220678 Don't crash when DivertToParent() is called on an intercepted channel. r=jdm (5d7ff6ecc8) - Bug 1220681 P1 Make HttpChannelChild::DivertToParent() work with synthetic responses. r=jdm (67715703ef) - Bug 1169819 Add browser chrome test to validate SW force refresh. r=ehsan (c0b6b3e874) - Bug 1220681 P2 Test synthetic responses that trigger downloads. r=ehsan (c701f3ddb1) - Bug 1220681 P3 Delay diversion on parent side until response head has been synthesized. r=jdm (7c697aacee) - Bug 1220681 P4 Automatically suspend the parent channel after synthesizing the response for diverison. r=jdm (27f31bcb35) - Bug 1220681 P5 Don't double suspend parent channel during synthesized divert to parent. r=jdm (62081d4b56) - Bug 1220681 P6 Use clients.claim() in browser_download.js to avoid worker unregister race. r=jdm (c8de291727) - Bug 1240161 - Remove "only-if-cached" from RequestCache; r=bkelly (283486f584) - Bug 1184550 - Add a mochitest for the Request constructor that tests that the body is set to used after being fetched and then fails on the second fetch with the same Request. r=bkelly (db4a967203) - Bug 1205495 - Correctly use the requests's body and redirect mode in reroute.js; r=nsm (a36a96624a) - Bug 1189656 - Fix fetch-request-fallback test paths. r=bkelly (366c884179) - Bug 1219085 - Import the fetch-request-redirect.https.html test from Blink; r=jdm (bf6b484d82) - Bug 1209081 - Part 1: Implement the "navigate" value for RequestMode; r=bkelly (a22f19d94b) - Bug 1209081 - Part 2: Upgrade the saved Requests in the DOM Cache to reflect the "navigate" RequestMode if they represent navigation content policy types; r=bkelly (60d1da23bb) - Bug 1219469 - Part 1: Revert the error reporting added in bug 1233845; r=jdm (dcc022b9d3) - Bug 1219469 - Part 2: Make HttpChannelParentListener be the controller; r=jdm,jduell (9c5f0dfbe0) - Bug 1229369 - Intercept redirected network fetches that have their request mode set to manual; r=jdm (fb21d86ed2)
425 lines
15 KiB
C++
425 lines
15 KiB
C++
/* -*- 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/. */
|
|
|
|
/* representation of a value for a SMIL-animated CSS property */
|
|
|
|
#include "nsSMILCSSValueType.h"
|
|
#include "nsString.h"
|
|
#include "nsSMILParserUtils.h"
|
|
#include "nsSMILValue.h"
|
|
#include "nsCSSValue.h"
|
|
#include "nsColor.h"
|
|
#include "nsPresContext.h"
|
|
#include "mozilla/StyleAnimationValue.h"
|
|
#include "mozilla/dom/Element.h"
|
|
#include "nsDebug.h"
|
|
#include "nsStyleUtil.h"
|
|
#include "nsIDocument.h"
|
|
|
|
using namespace mozilla::dom;
|
|
using mozilla::StyleAnimationValue;
|
|
|
|
/*static*/ nsSMILCSSValueType nsSMILCSSValueType::sSingleton;
|
|
|
|
struct ValueWrapper {
|
|
ValueWrapper(nsCSSProperty aPropID, const StyleAnimationValue& aValue) :
|
|
mPropID(aPropID), mCSSValue(aValue) {}
|
|
|
|
nsCSSProperty mPropID;
|
|
StyleAnimationValue mCSSValue;
|
|
};
|
|
|
|
// Helper Methods
|
|
// --------------
|
|
static const StyleAnimationValue*
|
|
GetZeroValueForUnit(StyleAnimationValue::Unit aUnit)
|
|
{
|
|
static const StyleAnimationValue
|
|
sZeroCoord(0, StyleAnimationValue::CoordConstructor);
|
|
static const StyleAnimationValue
|
|
sZeroPercent(0.0f, StyleAnimationValue::PercentConstructor);
|
|
static const StyleAnimationValue
|
|
sZeroFloat(0.0f, StyleAnimationValue::FloatConstructor);
|
|
static const StyleAnimationValue
|
|
sZeroColor(NS_RGB(0,0,0), StyleAnimationValue::ColorConstructor);
|
|
|
|
MOZ_ASSERT(aUnit != StyleAnimationValue::eUnit_Null,
|
|
"Need non-null unit for a zero value");
|
|
switch (aUnit) {
|
|
case StyleAnimationValue::eUnit_Coord:
|
|
return &sZeroCoord;
|
|
case StyleAnimationValue::eUnit_Percent:
|
|
return &sZeroPercent;
|
|
case StyleAnimationValue::eUnit_Float:
|
|
return &sZeroFloat;
|
|
case StyleAnimationValue::eUnit_Color:
|
|
return &sZeroColor;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
// This method requires at least one of its arguments to be non-null.
|
|
//
|
|
// If one argument is null, this method updates it to point to "zero"
|
|
// for the other argument's Unit (if applicable; otherwise, we return false).
|
|
//
|
|
// If neither argument is null, this method generally does nothing, though it
|
|
// may apply a workaround for the special case where a 0 length-value is mixed
|
|
// with a eUnit_Float value. (See comment below.)
|
|
//
|
|
// Returns true on success, or false.
|
|
static bool
|
|
FinalizeStyleAnimationValues(const StyleAnimationValue*& aValue1,
|
|
const StyleAnimationValue*& aValue2)
|
|
{
|
|
MOZ_ASSERT(aValue1 || aValue2,
|
|
"expecting at least one non-null value");
|
|
|
|
// Are we missing either val? (If so, it's an implied 0 in other val's units)
|
|
if (!aValue1) {
|
|
aValue1 = GetZeroValueForUnit(aValue2->GetUnit());
|
|
return !!aValue1; // Fail if we have no zero value for this unit.
|
|
}
|
|
if (!aValue2) {
|
|
aValue2 = GetZeroValueForUnit(aValue1->GetUnit());
|
|
return !!aValue2; // Fail if we have no zero value for this unit.
|
|
}
|
|
|
|
// Ok, both values were specified.
|
|
// Need to handle a special-case, though: unitless nonzero length (parsed as
|
|
// eUnit_Float) mixed with unitless 0 length (parsed as eUnit_Coord). These
|
|
// won't interoperate in StyleAnimationValue, since their Units don't match.
|
|
// In this case, we replace the eUnit_Coord 0 value with eUnit_Float 0 value.
|
|
const StyleAnimationValue& zeroCoord =
|
|
*GetZeroValueForUnit(StyleAnimationValue::eUnit_Coord);
|
|
if (*aValue1 == zeroCoord &&
|
|
aValue2->GetUnit() == StyleAnimationValue::eUnit_Float) {
|
|
aValue1 = GetZeroValueForUnit(StyleAnimationValue::eUnit_Float);
|
|
} else if (*aValue2 == zeroCoord &&
|
|
aValue1->GetUnit() == StyleAnimationValue::eUnit_Float) {
|
|
aValue2 = GetZeroValueForUnit(StyleAnimationValue::eUnit_Float);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static void
|
|
InvertSign(StyleAnimationValue& aValue)
|
|
{
|
|
switch (aValue.GetUnit()) {
|
|
case StyleAnimationValue::eUnit_Coord:
|
|
aValue.SetCoordValue(-aValue.GetCoordValue());
|
|
break;
|
|
case StyleAnimationValue::eUnit_Percent:
|
|
aValue.SetPercentValue(-aValue.GetPercentValue());
|
|
break;
|
|
case StyleAnimationValue::eUnit_Float:
|
|
aValue.SetFloatValue(-aValue.GetFloatValue());
|
|
break;
|
|
default:
|
|
NS_NOTREACHED("Calling InvertSign with an unsupported unit");
|
|
break;
|
|
}
|
|
}
|
|
|
|
static ValueWrapper*
|
|
ExtractValueWrapper(nsSMILValue& aValue)
|
|
{
|
|
return static_cast<ValueWrapper*>(aValue.mU.mPtr);
|
|
}
|
|
|
|
static const ValueWrapper*
|
|
ExtractValueWrapper(const nsSMILValue& aValue)
|
|
{
|
|
return static_cast<const ValueWrapper*>(aValue.mU.mPtr);
|
|
}
|
|
|
|
// Class methods
|
|
// -------------
|
|
void
|
|
nsSMILCSSValueType::Init(nsSMILValue& aValue) const
|
|
{
|
|
MOZ_ASSERT(aValue.IsNull(), "Unexpected SMIL value type");
|
|
|
|
aValue.mU.mPtr = nullptr;
|
|
aValue.mType = this;
|
|
}
|
|
|
|
void
|
|
nsSMILCSSValueType::Destroy(nsSMILValue& aValue) const
|
|
{
|
|
MOZ_ASSERT(aValue.mType == this, "Unexpected SMIL value type");
|
|
delete static_cast<ValueWrapper*>(aValue.mU.mPtr);
|
|
aValue.mType = nsSMILNullType::Singleton();
|
|
}
|
|
|
|
nsresult
|
|
nsSMILCSSValueType::Assign(nsSMILValue& aDest, const nsSMILValue& aSrc) const
|
|
{
|
|
MOZ_ASSERT(aDest.mType == aSrc.mType, "Incompatible SMIL types");
|
|
MOZ_ASSERT(aDest.mType == this, "Unexpected SMIL value type");
|
|
const ValueWrapper* srcWrapper = ExtractValueWrapper(aSrc);
|
|
ValueWrapper* destWrapper = ExtractValueWrapper(aDest);
|
|
|
|
if (srcWrapper) {
|
|
if (!destWrapper) {
|
|
// barely-initialized dest -- need to alloc & copy
|
|
aDest.mU.mPtr = new ValueWrapper(*srcWrapper);
|
|
} else {
|
|
// both already fully-initialized -- just copy straight across
|
|
*destWrapper = *srcWrapper;
|
|
}
|
|
} else if (destWrapper) {
|
|
// fully-initialized dest, barely-initialized src -- clear dest
|
|
delete destWrapper;
|
|
aDest.mU.mPtr = destWrapper = nullptr;
|
|
} // else, both are barely-initialized -- nothing to do.
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
bool
|
|
nsSMILCSSValueType::IsEqual(const nsSMILValue& aLeft,
|
|
const nsSMILValue& aRight) const
|
|
{
|
|
MOZ_ASSERT(aLeft.mType == aRight.mType, "Incompatible SMIL types");
|
|
MOZ_ASSERT(aLeft.mType == this, "Unexpected SMIL value");
|
|
const ValueWrapper* leftWrapper = ExtractValueWrapper(aLeft);
|
|
const ValueWrapper* rightWrapper = ExtractValueWrapper(aRight);
|
|
|
|
if (leftWrapper) {
|
|
if (rightWrapper) {
|
|
// Both non-null
|
|
NS_WARN_IF_FALSE(leftWrapper != rightWrapper,
|
|
"Two nsSMILValues with matching ValueWrapper ptr");
|
|
return (leftWrapper->mPropID == rightWrapper->mPropID &&
|
|
leftWrapper->mCSSValue == rightWrapper->mCSSValue);
|
|
}
|
|
// Left non-null, right null
|
|
return false;
|
|
}
|
|
if (rightWrapper) {
|
|
// Left null, right non-null
|
|
return false;
|
|
}
|
|
// Both null
|
|
return true;
|
|
}
|
|
|
|
nsresult
|
|
nsSMILCSSValueType::Add(nsSMILValue& aDest, const nsSMILValue& aValueToAdd,
|
|
uint32_t aCount) const
|
|
{
|
|
MOZ_ASSERT(aValueToAdd.mType == aDest.mType,
|
|
"Trying to add invalid types");
|
|
MOZ_ASSERT(aValueToAdd.mType == this, "Unexpected source type");
|
|
|
|
ValueWrapper* destWrapper = ExtractValueWrapper(aDest);
|
|
const ValueWrapper* valueToAddWrapper = ExtractValueWrapper(aValueToAdd);
|
|
MOZ_ASSERT(destWrapper || valueToAddWrapper,
|
|
"need at least one fully-initialized value");
|
|
|
|
nsCSSProperty property = (valueToAddWrapper ? valueToAddWrapper->mPropID :
|
|
destWrapper->mPropID);
|
|
// Special case: font-size-adjust and stroke-dasharray are explicitly
|
|
// non-additive (even though StyleAnimationValue *could* support adding them)
|
|
if (property == eCSSProperty_font_size_adjust ||
|
|
property == eCSSProperty_stroke_dasharray) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
const StyleAnimationValue* valueToAdd = valueToAddWrapper ?
|
|
&valueToAddWrapper->mCSSValue : nullptr;
|
|
const StyleAnimationValue* destValue = destWrapper ?
|
|
&destWrapper->mCSSValue : nullptr;
|
|
if (!FinalizeStyleAnimationValues(valueToAdd, destValue)) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
// Did FinalizeStyleAnimationValues change destValue?
|
|
// If so, update outparam to use the new value.
|
|
if (destWrapper && &destWrapper->mCSSValue != destValue) {
|
|
destWrapper->mCSSValue = *destValue;
|
|
}
|
|
|
|
// Handle barely-initialized "zero" destination.
|
|
if (!destWrapper) {
|
|
aDest.mU.mPtr = destWrapper =
|
|
new ValueWrapper(property, *destValue);
|
|
}
|
|
|
|
return StyleAnimationValue::Add(property,
|
|
destWrapper->mCSSValue, *valueToAdd, aCount) ?
|
|
NS_OK : NS_ERROR_FAILURE;
|
|
}
|
|
|
|
nsresult
|
|
nsSMILCSSValueType::ComputeDistance(const nsSMILValue& aFrom,
|
|
const nsSMILValue& aTo,
|
|
double& aDistance) const
|
|
{
|
|
MOZ_ASSERT(aFrom.mType == aTo.mType,
|
|
"Trying to compare different types");
|
|
MOZ_ASSERT(aFrom.mType == this, "Unexpected source type");
|
|
|
|
const ValueWrapper* fromWrapper = ExtractValueWrapper(aFrom);
|
|
const ValueWrapper* toWrapper = ExtractValueWrapper(aTo);
|
|
MOZ_ASSERT(toWrapper, "expecting non-null endpoint");
|
|
|
|
const StyleAnimationValue* fromCSSValue = fromWrapper ?
|
|
&fromWrapper->mCSSValue : nullptr;
|
|
const StyleAnimationValue* toCSSValue = &toWrapper->mCSSValue;
|
|
if (!FinalizeStyleAnimationValues(fromCSSValue, toCSSValue)) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return StyleAnimationValue::ComputeDistance(toWrapper->mPropID,
|
|
*fromCSSValue, *toCSSValue,
|
|
aDistance) ?
|
|
NS_OK : NS_ERROR_FAILURE;
|
|
}
|
|
|
|
nsresult
|
|
nsSMILCSSValueType::Interpolate(const nsSMILValue& aStartVal,
|
|
const nsSMILValue& aEndVal,
|
|
double aUnitDistance,
|
|
nsSMILValue& aResult) const
|
|
{
|
|
MOZ_ASSERT(aStartVal.mType == aEndVal.mType,
|
|
"Trying to interpolate different types");
|
|
MOZ_ASSERT(aStartVal.mType == this,
|
|
"Unexpected types for interpolation");
|
|
MOZ_ASSERT(aResult.mType == this, "Unexpected result type");
|
|
MOZ_ASSERT(aUnitDistance >= 0.0 && aUnitDistance <= 1.0,
|
|
"unit distance value out of bounds");
|
|
MOZ_ASSERT(!aResult.mU.mPtr, "expecting barely-initialized outparam");
|
|
|
|
const ValueWrapper* startWrapper = ExtractValueWrapper(aStartVal);
|
|
const ValueWrapper* endWrapper = ExtractValueWrapper(aEndVal);
|
|
MOZ_ASSERT(endWrapper, "expecting non-null endpoint");
|
|
|
|
const StyleAnimationValue* startCSSValue = startWrapper ?
|
|
&startWrapper->mCSSValue : nullptr;
|
|
const StyleAnimationValue* endCSSValue = &endWrapper->mCSSValue;
|
|
if (!FinalizeStyleAnimationValues(startCSSValue, endCSSValue)) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
StyleAnimationValue resultValue;
|
|
if (StyleAnimationValue::Interpolate(endWrapper->mPropID,
|
|
*startCSSValue, *endCSSValue,
|
|
aUnitDistance, resultValue)) {
|
|
aResult.mU.mPtr = new ValueWrapper(endWrapper->mPropID, resultValue);
|
|
return NS_OK;
|
|
}
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
// Helper function to extract presContext
|
|
static nsPresContext*
|
|
GetPresContextForElement(Element* aElem)
|
|
{
|
|
nsIDocument* doc = aElem->GetCurrentDoc();
|
|
if (!doc) {
|
|
// This can happen if we process certain types of restyles mid-sample
|
|
// and remove anonymous animated content from the document as a result.
|
|
// See bug 534975.
|
|
return nullptr;
|
|
}
|
|
nsIPresShell* shell = doc->GetShell();
|
|
return shell ? shell->GetPresContext() : nullptr;
|
|
}
|
|
|
|
// Helper function to parse a string into a StyleAnimationValue
|
|
static bool
|
|
ValueFromStringHelper(nsCSSProperty aPropID,
|
|
Element* aTargetElement,
|
|
nsPresContext* aPresContext,
|
|
const nsAString& aString,
|
|
StyleAnimationValue& aStyleAnimValue,
|
|
bool* aIsContextSensitive)
|
|
{
|
|
// If value is negative, we'll strip off the "-" so the CSS parser won't
|
|
// barf, and then manually make the parsed value negative.
|
|
// (This is a partial solution to let us accept some otherwise out-of-bounds
|
|
// CSS values. Bug 501188 will provide a more complete fix.)
|
|
bool isNegative = false;
|
|
uint32_t subStringBegin = 0;
|
|
|
|
// NOTE: We need to opt-out 'stroke-dasharray' from the negative-number
|
|
// check. Its values might look negative (e.g. by starting with "-1"), but
|
|
// they're more complicated than our simple negation logic here can handle.
|
|
if (aPropID != eCSSProperty_stroke_dasharray) {
|
|
int32_t absValuePos = nsSMILParserUtils::CheckForNegativeNumber(aString);
|
|
if (absValuePos > 0) {
|
|
isNegative = true;
|
|
subStringBegin = (uint32_t)absValuePos; // Start parsing after '-' sign
|
|
}
|
|
}
|
|
nsDependentSubstring subString(aString, subStringBegin);
|
|
if (!StyleAnimationValue::ComputeValue(aPropID, aTargetElement, subString,
|
|
true, aStyleAnimValue,
|
|
aIsContextSensitive)) {
|
|
return false;
|
|
}
|
|
if (isNegative) {
|
|
InvertSign(aStyleAnimValue);
|
|
}
|
|
|
|
if (aPropID == eCSSProperty_font_size) {
|
|
// Divide out text-zoom, since SVG is supposed to ignore it
|
|
MOZ_ASSERT(aStyleAnimValue.GetUnit() == StyleAnimationValue::eUnit_Coord,
|
|
"'font-size' value with unexpected style unit");
|
|
aStyleAnimValue.SetCoordValue(aStyleAnimValue.GetCoordValue() /
|
|
aPresContext->TextZoom());
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// static
|
|
void
|
|
nsSMILCSSValueType::ValueFromString(nsCSSProperty aPropID,
|
|
Element* aTargetElement,
|
|
const nsAString& aString,
|
|
nsSMILValue& aValue,
|
|
bool* aIsContextSensitive)
|
|
{
|
|
MOZ_ASSERT(aValue.IsNull(), "Outparam should be null-typed");
|
|
nsPresContext* presContext = GetPresContextForElement(aTargetElement);
|
|
if (!presContext) {
|
|
NS_WARNING("Not parsing animation value; unable to get PresContext");
|
|
return;
|
|
}
|
|
|
|
nsIDocument* doc = aTargetElement->GetCurrentDoc();
|
|
if (doc && !nsStyleUtil::CSPAllowsInlineStyle(nullptr,
|
|
doc->NodePrincipal(),
|
|
doc->GetDocumentURI(),
|
|
0, aString, nullptr)) {
|
|
return;
|
|
}
|
|
|
|
StyleAnimationValue parsedValue;
|
|
if (ValueFromStringHelper(aPropID, aTargetElement, presContext,
|
|
aString, parsedValue, aIsContextSensitive)) {
|
|
sSingleton.Init(aValue);
|
|
aValue.mU.mPtr = new ValueWrapper(aPropID, parsedValue);
|
|
}
|
|
}
|
|
|
|
// static
|
|
bool
|
|
nsSMILCSSValueType::ValueToString(const nsSMILValue& aValue,
|
|
nsAString& aString)
|
|
{
|
|
MOZ_ASSERT(aValue.mType == &nsSMILCSSValueType::sSingleton,
|
|
"Unexpected SMIL value type");
|
|
const ValueWrapper* wrapper = ExtractValueWrapper(aValue);
|
|
return !wrapper ||
|
|
StyleAnimationValue::UncomputeValue(wrapper->mPropID,
|
|
wrapper->mCSSValue, aString);
|
|
}
|