1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/layout/style/nsROCSSPrimitiveValue.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,720 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +/* DOM object representing values in DOM computed style */ 1.10 + 1.11 +#include "nsROCSSPrimitiveValue.h" 1.12 + 1.13 +#include "mozilla/dom/CSSPrimitiveValueBinding.h" 1.14 +#include "nsPresContext.h" 1.15 +#include "nsStyleUtil.h" 1.16 +#include "nsDOMCSSRGBColor.h" 1.17 +#include "nsDOMCSSRect.h" 1.18 +#include "nsIURI.h" 1.19 +#include "nsError.h" 1.20 + 1.21 +using namespace mozilla; 1.22 + 1.23 +nsROCSSPrimitiveValue::nsROCSSPrimitiveValue() 1.24 + : CSSValue(), mType(CSS_PX) 1.25 +{ 1.26 + mValue.mAppUnits = 0; 1.27 + SetIsDOMBinding(); 1.28 +} 1.29 + 1.30 + 1.31 +nsROCSSPrimitiveValue::~nsROCSSPrimitiveValue() 1.32 +{ 1.33 + Reset(); 1.34 +} 1.35 + 1.36 +NS_IMPL_CYCLE_COLLECTING_ADDREF(nsROCSSPrimitiveValue) 1.37 +NS_IMPL_CYCLE_COLLECTING_RELEASE(nsROCSSPrimitiveValue) 1.38 + 1.39 + 1.40 +// QueryInterface implementation for nsROCSSPrimitiveValue 1.41 +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsROCSSPrimitiveValue) 1.42 + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY 1.43 + NS_INTERFACE_MAP_ENTRY(nsIDOMCSSPrimitiveValue) 1.44 + NS_INTERFACE_MAP_ENTRY(nsIDOMCSSValue) 1.45 + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, CSSValue) 1.46 +NS_INTERFACE_MAP_END 1.47 + 1.48 +NS_IMPL_CYCLE_COLLECTION_CLASS(nsROCSSPrimitiveValue) 1.49 + 1.50 +NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsROCSSPrimitiveValue) 1.51 + 1.52 +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsROCSSPrimitiveValue) 1.53 + if (tmp->mType == CSS_URI) { 1.54 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mValue.mURI) 1.55 + } else if (tmp->mType == CSS_RGBCOLOR) { 1.56 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mValue.mColor) 1.57 + } else if (tmp->mType == CSS_RECT) { 1.58 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mValue.mRect) 1.59 + } 1.60 + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS 1.61 +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END 1.62 + 1.63 +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsROCSSPrimitiveValue) 1.64 + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER 1.65 + tmp->Reset(); 1.66 +NS_IMPL_CYCLE_COLLECTION_UNLINK_END 1.67 + 1.68 +JSObject* 1.69 +nsROCSSPrimitiveValue::WrapObject(JSContext *cx) 1.70 +{ 1.71 + return dom::CSSPrimitiveValueBinding::Wrap(cx, this); 1.72 +} 1.73 + 1.74 +// nsIDOMCSSValue 1.75 + 1.76 + 1.77 +NS_IMETHODIMP 1.78 +nsROCSSPrimitiveValue::GetCssText(nsAString& aCssText) 1.79 +{ 1.80 + nsAutoString tmpStr; 1.81 + aCssText.Truncate(); 1.82 + nsresult result = NS_OK; 1.83 + 1.84 + switch (mType) { 1.85 + case CSS_PX : 1.86 + { 1.87 + float val = nsPresContext::AppUnitsToFloatCSSPixels(mValue.mAppUnits); 1.88 + nsStyleUtil::AppendCSSNumber(val, tmpStr); 1.89 + tmpStr.AppendLiteral("px"); 1.90 + break; 1.91 + } 1.92 + case CSS_IDENT : 1.93 + { 1.94 + AppendUTF8toUTF16(nsCSSKeywords::GetStringValue(mValue.mKeyword), 1.95 + tmpStr); 1.96 + break; 1.97 + } 1.98 + case CSS_STRING : 1.99 + case CSS_COUNTER : /* FIXME: COUNTER should use an object */ 1.100 + { 1.101 + tmpStr.Append(mValue.mString); 1.102 + break; 1.103 + } 1.104 + case CSS_URI : 1.105 + { 1.106 + if (mValue.mURI) { 1.107 + nsAutoCString specUTF8; 1.108 + mValue.mURI->GetSpec(specUTF8); 1.109 + 1.110 + tmpStr.AssignLiteral("url("); 1.111 + nsStyleUtil::AppendEscapedCSSString(NS_ConvertUTF8toUTF16(specUTF8), 1.112 + tmpStr); 1.113 + tmpStr.AppendLiteral(")"); 1.114 + } else { 1.115 + // http://dev.w3.org/csswg/css3-values/#attr defines 1.116 + // 'about:invalid' as the default value for url attributes, 1.117 + // so let's also use it here as the default computed value 1.118 + // for invalid URLs. 1.119 + tmpStr.Assign(NS_LITERAL_STRING("url(about:invalid)")); 1.120 + } 1.121 + break; 1.122 + } 1.123 + case CSS_ATTR : 1.124 + { 1.125 + tmpStr.AppendLiteral("attr("); 1.126 + tmpStr.Append(mValue.mString); 1.127 + tmpStr.Append(char16_t(')')); 1.128 + break; 1.129 + } 1.130 + case CSS_PERCENTAGE : 1.131 + { 1.132 + nsStyleUtil::AppendCSSNumber(mValue.mFloat * 100, tmpStr); 1.133 + tmpStr.Append(char16_t('%')); 1.134 + break; 1.135 + } 1.136 + case CSS_NUMBER : 1.137 + { 1.138 + nsStyleUtil::AppendCSSNumber(mValue.mFloat, tmpStr); 1.139 + break; 1.140 + } 1.141 + case CSS_NUMBER_INT32 : 1.142 + { 1.143 + tmpStr.AppendInt(mValue.mInt32); 1.144 + break; 1.145 + } 1.146 + case CSS_NUMBER_UINT32 : 1.147 + { 1.148 + tmpStr.AppendInt(mValue.mUint32); 1.149 + break; 1.150 + } 1.151 + case CSS_DEG : 1.152 + { 1.153 + nsStyleUtil::AppendCSSNumber(mValue.mFloat, tmpStr); 1.154 + tmpStr.AppendLiteral("deg"); 1.155 + break; 1.156 + } 1.157 + case CSS_GRAD : 1.158 + { 1.159 + nsStyleUtil::AppendCSSNumber(mValue.mFloat, tmpStr); 1.160 + tmpStr.AppendLiteral("grad"); 1.161 + break; 1.162 + } 1.163 + case CSS_RAD : 1.164 + { 1.165 + nsStyleUtil::AppendCSSNumber(mValue.mFloat, tmpStr); 1.166 + tmpStr.AppendLiteral("rad"); 1.167 + break; 1.168 + } 1.169 + case CSS_TURN : 1.170 + { 1.171 + nsStyleUtil::AppendCSSNumber(mValue.mFloat, tmpStr); 1.172 + tmpStr.AppendLiteral("turn"); 1.173 + break; 1.174 + } 1.175 + case CSS_RECT : 1.176 + { 1.177 + NS_ASSERTION(mValue.mRect, "mValue.mRect should never be null"); 1.178 + NS_NAMED_LITERAL_STRING(comma, ", "); 1.179 + nsCOMPtr<nsIDOMCSSPrimitiveValue> sideCSSValue; 1.180 + nsAutoString sideValue; 1.181 + tmpStr.AssignLiteral("rect("); 1.182 + // get the top 1.183 + result = mValue.mRect->GetTop(getter_AddRefs(sideCSSValue)); 1.184 + if (NS_FAILED(result)) 1.185 + break; 1.186 + result = sideCSSValue->GetCssText(sideValue); 1.187 + if (NS_FAILED(result)) 1.188 + break; 1.189 + tmpStr.Append(sideValue + comma); 1.190 + // get the right 1.191 + result = mValue.mRect->GetRight(getter_AddRefs(sideCSSValue)); 1.192 + if (NS_FAILED(result)) 1.193 + break; 1.194 + result = sideCSSValue->GetCssText(sideValue); 1.195 + if (NS_FAILED(result)) 1.196 + break; 1.197 + tmpStr.Append(sideValue + comma); 1.198 + // get the bottom 1.199 + result = mValue.mRect->GetBottom(getter_AddRefs(sideCSSValue)); 1.200 + if (NS_FAILED(result)) 1.201 + break; 1.202 + result = sideCSSValue->GetCssText(sideValue); 1.203 + if (NS_FAILED(result)) 1.204 + break; 1.205 + tmpStr.Append(sideValue + comma); 1.206 + // get the left 1.207 + result = mValue.mRect->GetLeft(getter_AddRefs(sideCSSValue)); 1.208 + if (NS_FAILED(result)) 1.209 + break; 1.210 + result = sideCSSValue->GetCssText(sideValue); 1.211 + if (NS_FAILED(result)) 1.212 + break; 1.213 + tmpStr.Append(sideValue + NS_LITERAL_STRING(")")); 1.214 + break; 1.215 + } 1.216 + case CSS_RGBCOLOR : 1.217 + { 1.218 + NS_ASSERTION(mValue.mColor, "mValue.mColor should never be null"); 1.219 + ErrorResult error; 1.220 + NS_NAMED_LITERAL_STRING(comma, ", "); 1.221 + nsAutoString colorValue; 1.222 + if (mValue.mColor->HasAlpha()) 1.223 + tmpStr.AssignLiteral("rgba("); 1.224 + else 1.225 + tmpStr.AssignLiteral("rgb("); 1.226 + 1.227 + // get the red component 1.228 + mValue.mColor->Red()->GetCssText(colorValue, error); 1.229 + if (error.Failed()) 1.230 + break; 1.231 + tmpStr.Append(colorValue + comma); 1.232 + 1.233 + // get the green component 1.234 + mValue.mColor->Green()->GetCssText(colorValue, error); 1.235 + if (error.Failed()) 1.236 + break; 1.237 + tmpStr.Append(colorValue + comma); 1.238 + 1.239 + // get the blue component 1.240 + mValue.mColor->Blue()->GetCssText(colorValue, error); 1.241 + if (error.Failed()) 1.242 + break; 1.243 + tmpStr.Append(colorValue); 1.244 + 1.245 + if (mValue.mColor->HasAlpha()) { 1.246 + // get the alpha component 1.247 + mValue.mColor->Alpha()->GetCssText(colorValue, error); 1.248 + if (error.Failed()) 1.249 + break; 1.250 + tmpStr.Append(comma + colorValue); 1.251 + } 1.252 + 1.253 + tmpStr.Append(NS_LITERAL_STRING(")")); 1.254 + 1.255 + break; 1.256 + } 1.257 + case CSS_S : 1.258 + { 1.259 + nsStyleUtil::AppendCSSNumber(mValue.mFloat, tmpStr); 1.260 + tmpStr.AppendLiteral("s"); 1.261 + break; 1.262 + } 1.263 + case CSS_CM : 1.264 + case CSS_MM : 1.265 + case CSS_IN : 1.266 + case CSS_PT : 1.267 + case CSS_PC : 1.268 + case CSS_UNKNOWN : 1.269 + case CSS_EMS : 1.270 + case CSS_EXS : 1.271 + case CSS_MS : 1.272 + case CSS_HZ : 1.273 + case CSS_KHZ : 1.274 + case CSS_DIMENSION : 1.275 + NS_ERROR("We have a bogus value set. This should not happen"); 1.276 + return NS_ERROR_DOM_INVALID_ACCESS_ERR; 1.277 + } 1.278 + 1.279 + if (NS_SUCCEEDED(result)) { 1.280 + aCssText.Assign(tmpStr); 1.281 + } 1.282 + 1.283 + return NS_OK; 1.284 +} 1.285 + 1.286 +void 1.287 +nsROCSSPrimitiveValue::GetCssText(nsString& aText, ErrorResult& aRv) 1.288 +{ 1.289 + aRv = GetCssText(aText); 1.290 +} 1.291 + 1.292 +NS_IMETHODIMP 1.293 +nsROCSSPrimitiveValue::SetCssText(const nsAString& aCssText) 1.294 +{ 1.295 + return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; 1.296 +} 1.297 + 1.298 +void 1.299 +nsROCSSPrimitiveValue::SetCssText(const nsAString& aText, ErrorResult& aRv) 1.300 +{ 1.301 + aRv = SetCssText(aText); 1.302 +} 1.303 + 1.304 + 1.305 +NS_IMETHODIMP 1.306 +nsROCSSPrimitiveValue::GetCssValueType(uint16_t* aValueType) 1.307 +{ 1.308 + NS_ENSURE_ARG_POINTER(aValueType); 1.309 + *aValueType = nsIDOMCSSValue::CSS_PRIMITIVE_VALUE; 1.310 + return NS_OK; 1.311 +} 1.312 + 1.313 +uint16_t 1.314 +nsROCSSPrimitiveValue::CssValueType() const 1.315 +{ 1.316 + return nsIDOMCSSValue::CSS_PRIMITIVE_VALUE; 1.317 +} 1.318 + 1.319 + 1.320 +// nsIDOMCSSPrimitiveValue 1.321 + 1.322 +NS_IMETHODIMP 1.323 +nsROCSSPrimitiveValue::GetPrimitiveType(uint16_t* aPrimitiveType) 1.324 +{ 1.325 + NS_ENSURE_ARG_POINTER(aPrimitiveType); 1.326 + *aPrimitiveType = PrimitiveType(); 1.327 + 1.328 + return NS_OK; 1.329 +} 1.330 + 1.331 + 1.332 +NS_IMETHODIMP 1.333 +nsROCSSPrimitiveValue::SetFloatValue(uint16_t aUnitType, float aFloatValue) 1.334 +{ 1.335 + return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; 1.336 +} 1.337 + 1.338 +void 1.339 +nsROCSSPrimitiveValue::SetFloatValue(uint16_t aType, float aVal, 1.340 + ErrorResult& aRv) 1.341 +{ 1.342 + aRv = SetFloatValue(aType, aVal); 1.343 +} 1.344 + 1.345 +float 1.346 +nsROCSSPrimitiveValue::GetFloatValue(uint16_t aUnitType, ErrorResult& aRv) 1.347 +{ 1.348 + switch(aUnitType) { 1.349 + case CSS_PX : 1.350 + if (mType == CSS_PX) { 1.351 + return nsPresContext::AppUnitsToFloatCSSPixels(mValue.mAppUnits); 1.352 + } 1.353 + 1.354 + break; 1.355 + case CSS_CM : 1.356 + if (mType == CSS_PX) { 1.357 + return mValue.mAppUnits * CM_PER_INCH_FLOAT / 1.358 + nsPresContext::AppUnitsPerCSSInch(); 1.359 + } 1.360 + 1.361 + break; 1.362 + case CSS_MM : 1.363 + if (mType == CSS_PX) { 1.364 + return mValue.mAppUnits * MM_PER_INCH_FLOAT / 1.365 + nsPresContext::AppUnitsPerCSSInch(); 1.366 + } 1.367 + 1.368 + break; 1.369 + case CSS_IN : 1.370 + if (mType == CSS_PX) { 1.371 + return mValue.mAppUnits / nsPresContext::AppUnitsPerCSSInch(); 1.372 + } 1.373 + 1.374 + break; 1.375 + case CSS_PT : 1.376 + if (mType == CSS_PX) { 1.377 + return mValue.mAppUnits * POINTS_PER_INCH_FLOAT / 1.378 + nsPresContext::AppUnitsPerCSSInch(); 1.379 + } 1.380 + 1.381 + break; 1.382 + case CSS_PC : 1.383 + if (mType == CSS_PX) { 1.384 + return mValue.mAppUnits * 6.0f / 1.385 + nsPresContext::AppUnitsPerCSSInch(); 1.386 + } 1.387 + 1.388 + break; 1.389 + case CSS_PERCENTAGE : 1.390 + if (mType == CSS_PERCENTAGE) { 1.391 + return mValue.mFloat * 100; 1.392 + } 1.393 + 1.394 + break; 1.395 + case CSS_NUMBER : 1.396 + if (mType == CSS_NUMBER) { 1.397 + return mValue.mFloat; 1.398 + } 1.399 + if (mType == CSS_NUMBER_INT32) { 1.400 + return mValue.mInt32; 1.401 + } 1.402 + if (mType == CSS_NUMBER_UINT32) { 1.403 + return mValue.mUint32; 1.404 + } 1.405 + 1.406 + break; 1.407 + case CSS_UNKNOWN : 1.408 + case CSS_EMS : 1.409 + case CSS_EXS : 1.410 + case CSS_DEG : 1.411 + case CSS_RAD : 1.412 + case CSS_GRAD : 1.413 + case CSS_MS : 1.414 + case CSS_S : 1.415 + case CSS_HZ : 1.416 + case CSS_KHZ : 1.417 + case CSS_DIMENSION : 1.418 + case CSS_STRING : 1.419 + case CSS_URI : 1.420 + case CSS_IDENT : 1.421 + case CSS_ATTR : 1.422 + case CSS_COUNTER : 1.423 + case CSS_RECT : 1.424 + case CSS_RGBCOLOR : 1.425 + break; 1.426 + } 1.427 + 1.428 + aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); 1.429 + return 0; 1.430 +} 1.431 + 1.432 +NS_IMETHODIMP 1.433 +nsROCSSPrimitiveValue::GetFloatValue(uint16_t aType, float *aVal) 1.434 +{ 1.435 + ErrorResult rv; 1.436 + *aVal = GetFloatValue(aType, rv); 1.437 + return rv.ErrorCode(); 1.438 +} 1.439 + 1.440 + 1.441 +NS_IMETHODIMP 1.442 +nsROCSSPrimitiveValue::SetStringValue(uint16_t aStringType, 1.443 + const nsAString& aStringValue) 1.444 +{ 1.445 + return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; 1.446 +} 1.447 + 1.448 +void 1.449 +nsROCSSPrimitiveValue::SetStringValue(uint16_t aType, const nsAString& aString, 1.450 + mozilla::ErrorResult& aRv) 1.451 +{ 1.452 + aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); 1.453 +} 1.454 + 1.455 + 1.456 +NS_IMETHODIMP 1.457 +nsROCSSPrimitiveValue::GetStringValue(nsAString& aReturn) 1.458 +{ 1.459 + switch (mType) { 1.460 + case CSS_IDENT: 1.461 + CopyUTF8toUTF16(nsCSSKeywords::GetStringValue(mValue.mKeyword), aReturn); 1.462 + break; 1.463 + case CSS_STRING: 1.464 + case CSS_ATTR: 1.465 + aReturn.Assign(mValue.mString); 1.466 + break; 1.467 + case CSS_URI: { 1.468 + nsAutoCString spec; 1.469 + if (mValue.mURI) 1.470 + mValue.mURI->GetSpec(spec); 1.471 + CopyUTF8toUTF16(spec, aReturn); 1.472 + } break; 1.473 + default: 1.474 + aReturn.Truncate(); 1.475 + return NS_ERROR_DOM_INVALID_ACCESS_ERR; 1.476 + } 1.477 + return NS_OK; 1.478 +} 1.479 + 1.480 +void 1.481 +nsROCSSPrimitiveValue::GetStringValue(nsString& aString, ErrorResult& aRv) 1.482 +{ 1.483 + aRv = GetStringValue(aString); 1.484 +} 1.485 + 1.486 + 1.487 +NS_IMETHODIMP 1.488 +nsROCSSPrimitiveValue::GetCounterValue(nsIDOMCounter** aReturn) 1.489 +{ 1.490 + return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; 1.491 +} 1.492 + 1.493 +already_AddRefed<nsIDOMCounter> 1.494 +nsROCSSPrimitiveValue::GetCounterValue(ErrorResult& aRv) 1.495 +{ 1.496 + aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); 1.497 + return nullptr; 1.498 +} 1.499 + 1.500 +nsDOMCSSRect* 1.501 +nsROCSSPrimitiveValue::GetRectValue(ErrorResult& aRv) 1.502 +{ 1.503 + if (mType != CSS_RECT) { 1.504 + aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); 1.505 + return nullptr; 1.506 + } 1.507 + 1.508 + NS_ASSERTION(mValue.mRect, "mValue.mRect should never be null"); 1.509 + return mValue.mRect; 1.510 +} 1.511 + 1.512 +NS_IMETHODIMP 1.513 +nsROCSSPrimitiveValue::GetRectValue(nsIDOMRect** aRect) 1.514 +{ 1.515 + ErrorResult error; 1.516 + NS_IF_ADDREF(*aRect = GetRectValue(error)); 1.517 + return error.ErrorCode(); 1.518 +} 1.519 + 1.520 +nsDOMCSSRGBColor* 1.521 +nsROCSSPrimitiveValue::GetRGBColorValue(ErrorResult& aRv) 1.522 +{ 1.523 + if (mType != CSS_RGBCOLOR) { 1.524 + aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); 1.525 + return nullptr; 1.526 + } 1.527 + 1.528 + NS_ASSERTION(mValue.mColor, "mValue.mColor should never be null"); 1.529 + return mValue.mColor; 1.530 +} 1.531 + 1.532 +void 1.533 +nsROCSSPrimitiveValue::SetNumber(float aValue) 1.534 +{ 1.535 + Reset(); 1.536 + mValue.mFloat = aValue; 1.537 + mType = CSS_NUMBER; 1.538 +} 1.539 + 1.540 +void 1.541 +nsROCSSPrimitiveValue::SetNumber(int32_t aValue) 1.542 +{ 1.543 + Reset(); 1.544 + mValue.mInt32 = aValue; 1.545 + mType = CSS_NUMBER_INT32; 1.546 +} 1.547 + 1.548 +void 1.549 +nsROCSSPrimitiveValue::SetNumber(uint32_t aValue) 1.550 +{ 1.551 + Reset(); 1.552 + mValue.mUint32 = aValue; 1.553 + mType = CSS_NUMBER_UINT32; 1.554 +} 1.555 + 1.556 +void 1.557 +nsROCSSPrimitiveValue::SetPercent(float aValue) 1.558 +{ 1.559 + Reset(); 1.560 + mValue.mFloat = aValue; 1.561 + mType = CSS_PERCENTAGE; 1.562 +} 1.563 + 1.564 +void 1.565 +nsROCSSPrimitiveValue::SetDegree(float aValue) 1.566 +{ 1.567 + Reset(); 1.568 + mValue.mFloat = aValue; 1.569 + mType = CSS_DEG; 1.570 +} 1.571 + 1.572 +void 1.573 +nsROCSSPrimitiveValue::SetGrad(float aValue) 1.574 +{ 1.575 + Reset(); 1.576 + mValue.mFloat = aValue; 1.577 + mType = CSS_GRAD; 1.578 +} 1.579 + 1.580 +void 1.581 +nsROCSSPrimitiveValue::SetRadian(float aValue) 1.582 +{ 1.583 + Reset(); 1.584 + mValue.mFloat = aValue; 1.585 + mType = CSS_RAD; 1.586 +} 1.587 + 1.588 +void 1.589 +nsROCSSPrimitiveValue::SetTurn(float aValue) 1.590 +{ 1.591 + Reset(); 1.592 + mValue.mFloat = aValue; 1.593 + mType = CSS_TURN; 1.594 +} 1.595 + 1.596 +void 1.597 +nsROCSSPrimitiveValue::SetAppUnits(nscoord aValue) 1.598 +{ 1.599 + Reset(); 1.600 + mValue.mAppUnits = aValue; 1.601 + mType = CSS_PX; 1.602 +} 1.603 + 1.604 +void 1.605 +nsROCSSPrimitiveValue::SetAppUnits(float aValue) 1.606 +{ 1.607 + SetAppUnits(NSToCoordRound(aValue)); 1.608 +} 1.609 + 1.610 +void 1.611 +nsROCSSPrimitiveValue::SetIdent(nsCSSKeyword aKeyword) 1.612 +{ 1.613 + NS_PRECONDITION(aKeyword != eCSSKeyword_UNKNOWN && 1.614 + 0 <= aKeyword && aKeyword < eCSSKeyword_COUNT, 1.615 + "bad keyword"); 1.616 + Reset(); 1.617 + mValue.mKeyword = aKeyword; 1.618 + mType = CSS_IDENT; 1.619 +} 1.620 + 1.621 +// FIXME: CSS_STRING should imply a string with "" and a need for escaping. 1.622 +void 1.623 +nsROCSSPrimitiveValue::SetString(const nsACString& aString, uint16_t aType) 1.624 +{ 1.625 + Reset(); 1.626 + mValue.mString = ToNewUnicode(aString); 1.627 + if (mValue.mString) { 1.628 + mType = aType; 1.629 + } else { 1.630 + // XXXcaa We should probably let the caller know we are out of memory 1.631 + mType = CSS_UNKNOWN; 1.632 + } 1.633 +} 1.634 + 1.635 +// FIXME: CSS_STRING should imply a string with "" and a need for escaping. 1.636 +void 1.637 +nsROCSSPrimitiveValue::SetString(const nsAString& aString, uint16_t aType) 1.638 +{ 1.639 + Reset(); 1.640 + mValue.mString = ToNewUnicode(aString); 1.641 + if (mValue.mString) { 1.642 + mType = aType; 1.643 + } else { 1.644 + // XXXcaa We should probably let the caller know we are out of memory 1.645 + mType = CSS_UNKNOWN; 1.646 + } 1.647 +} 1.648 + 1.649 +void 1.650 +nsROCSSPrimitiveValue::SetURI(nsIURI *aURI) 1.651 +{ 1.652 + Reset(); 1.653 + mValue.mURI = aURI; 1.654 + NS_IF_ADDREF(mValue.mURI); 1.655 + mType = CSS_URI; 1.656 +} 1.657 + 1.658 +void 1.659 +nsROCSSPrimitiveValue::SetColor(nsDOMCSSRGBColor* aColor) 1.660 +{ 1.661 + NS_PRECONDITION(aColor, "Null RGBColor being set!"); 1.662 + Reset(); 1.663 + mValue.mColor = aColor; 1.664 + if (mValue.mColor) { 1.665 + NS_ADDREF(mValue.mColor); 1.666 + mType = CSS_RGBCOLOR; 1.667 + } 1.668 + else { 1.669 + mType = CSS_UNKNOWN; 1.670 + } 1.671 +} 1.672 + 1.673 +void 1.674 +nsROCSSPrimitiveValue::SetRect(nsDOMCSSRect* aRect) 1.675 +{ 1.676 + NS_PRECONDITION(aRect, "Null rect being set!"); 1.677 + Reset(); 1.678 + mValue.mRect = aRect; 1.679 + if (mValue.mRect) { 1.680 + NS_ADDREF(mValue.mRect); 1.681 + mType = CSS_RECT; 1.682 + } 1.683 + else { 1.684 + mType = CSS_UNKNOWN; 1.685 + } 1.686 +} 1.687 + 1.688 +void 1.689 +nsROCSSPrimitiveValue::SetTime(float aValue) 1.690 +{ 1.691 + Reset(); 1.692 + mValue.mFloat = aValue; 1.693 + mType = CSS_S; 1.694 +} 1.695 + 1.696 +void 1.697 +nsROCSSPrimitiveValue::Reset() 1.698 +{ 1.699 + switch (mType) { 1.700 + case CSS_IDENT: 1.701 + break; 1.702 + case CSS_STRING: 1.703 + case CSS_ATTR: 1.704 + case CSS_COUNTER: // FIXME: Counter should use an object 1.705 + NS_ASSERTION(mValue.mString, "Null string should never happen"); 1.706 + nsMemory::Free(mValue.mString); 1.707 + mValue.mString = nullptr; 1.708 + break; 1.709 + case CSS_URI: 1.710 + NS_IF_RELEASE(mValue.mURI); 1.711 + break; 1.712 + case CSS_RECT: 1.713 + NS_ASSERTION(mValue.mRect, "Null Rect should never happen"); 1.714 + NS_RELEASE(mValue.mRect); 1.715 + break; 1.716 + case CSS_RGBCOLOR: 1.717 + NS_ASSERTION(mValue.mColor, "Null RGBColor should never happen"); 1.718 + NS_RELEASE(mValue.mColor); 1.719 + break; 1.720 + } 1.721 + 1.722 + mType = CSS_UNKNOWN; 1.723 +}