Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1861)

Side by Side Diff: Source/core/css/CSSPrimitiveValue.cpp

Issue 476693002: Remove unused CSSPrimitiveValue::CSS_PARSER_{OPERATOR,INTEGER,IDENTIFIER} (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@pp6
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/css/CSSPrimitiveValue.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2012 Apple Inc. All rights reserv ed. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2012 Apple Inc. All rights reserv ed.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 case CSSPrimitiveValue::CSS_FR: 88 case CSSPrimitiveValue::CSS_FR:
89 return true; 89 return true;
90 case CSSPrimitiveValue::CSS_ATTR: 90 case CSSPrimitiveValue::CSS_ATTR:
91 case CSSPrimitiveValue::CSS_COUNTER: 91 case CSSPrimitiveValue::CSS_COUNTER:
92 case CSSPrimitiveValue::CSS_COUNTER_NAME: 92 case CSSPrimitiveValue::CSS_COUNTER_NAME:
93 case CSSPrimitiveValue::CSS_IDENT: 93 case CSSPrimitiveValue::CSS_IDENT:
94 case CSSPrimitiveValue::CSS_PROPERTY_ID: 94 case CSSPrimitiveValue::CSS_PROPERTY_ID:
95 case CSSPrimitiveValue::CSS_VALUE_ID: 95 case CSSPrimitiveValue::CSS_VALUE_ID:
96 case CSSPrimitiveValue::CSS_PAIR: 96 case CSSPrimitiveValue::CSS_PAIR:
97 case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR: 97 case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR:
98 case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER:
99 case CSSPrimitiveValue::CSS_PARSER_INTEGER:
100 case CSSPrimitiveValue::CSS_PARSER_OPERATOR:
101 case CSSPrimitiveValue::CSS_RECT: 98 case CSSPrimitiveValue::CSS_RECT:
102 case CSSPrimitiveValue::CSS_QUAD: 99 case CSSPrimitiveValue::CSS_QUAD:
103 case CSSPrimitiveValue::CSS_RGBCOLOR: 100 case CSSPrimitiveValue::CSS_RGBCOLOR:
104 case CSSPrimitiveValue::CSS_SHAPE: 101 case CSSPrimitiveValue::CSS_SHAPE:
105 case CSSPrimitiveValue::CSS_STRING: 102 case CSSPrimitiveValue::CSS_STRING:
106 case CSSPrimitiveValue::CSS_UNICODE_RANGE: 103 case CSSPrimitiveValue::CSS_UNICODE_RANGE:
107 case CSSPrimitiveValue::CSS_UNKNOWN: 104 case CSSPrimitiveValue::CSS_UNKNOWN:
108 case CSSPrimitiveValue::CSS_URI: 105 case CSSPrimitiveValue::CSS_URI:
109 return false; 106 return false;
110 } 107 }
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 m_value.valueID = valueID; 271 m_value.valueID = valueID;
275 } 272 }
276 273
277 CSSPrimitiveValue::CSSPrimitiveValue(CSSPropertyID propertyID) 274 CSSPrimitiveValue::CSSPrimitiveValue(CSSPropertyID propertyID)
278 : CSSValue(PrimitiveClass) 275 : CSSValue(PrimitiveClass)
279 { 276 {
280 m_primitiveUnitType = CSS_PROPERTY_ID; 277 m_primitiveUnitType = CSS_PROPERTY_ID;
281 m_value.propertyID = propertyID; 278 m_value.propertyID = propertyID;
282 } 279 }
283 280
284 CSSPrimitiveValue::CSSPrimitiveValue(int parserOperator, UnitType type)
285 : CSSValue(PrimitiveClass)
286 {
287 ASSERT(type == CSS_PARSER_OPERATOR);
288 m_primitiveUnitType = CSS_PARSER_OPERATOR;
289 m_value.parserOperator = parserOperator;
290 }
291
292 CSSPrimitiveValue::CSSPrimitiveValue(double num, UnitType type) 281 CSSPrimitiveValue::CSSPrimitiveValue(double num, UnitType type)
293 : CSSValue(PrimitiveClass) 282 : CSSValue(PrimitiveClass)
294 { 283 {
295 m_primitiveUnitType = type; 284 m_primitiveUnitType = type;
296 ASSERT(std::isfinite(num)); 285 ASSERT(std::isfinite(num));
297 m_value.num = num; 286 m_value.num = num;
298 } 287 }
299 288
300 CSSPrimitiveValue::CSSPrimitiveValue(const String& str, UnitType type) 289 CSSPrimitiveValue::CSSPrimitiveValue(const String& str, UnitType type)
301 : CSSValue(PrimitiveClass) 290 : CSSValue(PrimitiveClass)
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 case CSS_CALC_PERCENTAGE_WITH_LENGTH: 480 case CSS_CALC_PERCENTAGE_WITH_LENGTH:
492 ASSERT_NOT_REACHED(); 481 ASSERT_NOT_REACHED();
493 break; 482 break;
494 case CSS_SHAPE: 483 case CSS_SHAPE:
495 // We must not call deref() when oilpan is enabled because m_value.shape is traced. 484 // We must not call deref() when oilpan is enabled because m_value.shape is traced.
496 #if !ENABLE(OILPAN) 485 #if !ENABLE(OILPAN)
497 m_value.shape->deref(); 486 m_value.shape->deref();
498 #endif 487 #endif
499 break; 488 break;
500 case CSS_NUMBER: 489 case CSS_NUMBER:
501 case CSS_PARSER_INTEGER:
502 case CSS_PERCENTAGE: 490 case CSS_PERCENTAGE:
503 case CSS_EMS: 491 case CSS_EMS:
504 case CSS_EXS: 492 case CSS_EXS:
505 case CSS_REMS: 493 case CSS_REMS:
506 case CSS_CHS: 494 case CSS_CHS:
507 case CSS_PX: 495 case CSS_PX:
508 case CSS_CM: 496 case CSS_CM:
509 case CSS_MM: 497 case CSS_MM:
510 case CSS_IN: 498 case CSS_IN:
511 case CSS_PT: 499 case CSS_PT:
(...skipping 12 matching lines...) Expand all
524 case CSS_VMAX: 512 case CSS_VMAX:
525 case CSS_DPPX: 513 case CSS_DPPX:
526 case CSS_DPI: 514 case CSS_DPI:
527 case CSS_DPCM: 515 case CSS_DPCM:
528 case CSS_FR: 516 case CSS_FR:
529 case CSS_IDENT: 517 case CSS_IDENT:
530 case CSS_RGBCOLOR: 518 case CSS_RGBCOLOR:
531 case CSS_DIMENSION: 519 case CSS_DIMENSION:
532 case CSS_UNKNOWN: 520 case CSS_UNKNOWN:
533 case CSS_UNICODE_RANGE: 521 case CSS_UNICODE_RANGE:
534 case CSS_PARSER_OPERATOR:
535 case CSS_PARSER_IDENTIFIER:
536 case CSS_PROPERTY_ID: 522 case CSS_PROPERTY_ID:
537 case CSS_VALUE_ID: 523 case CSS_VALUE_ID:
538 break; 524 break;
539 } 525 }
540 m_primitiveUnitType = 0; 526 m_primitiveUnitType = 0;
541 if (m_hasCachedCSSText) { 527 if (m_hasCachedCSSText) {
542 cssTextCache().remove(this); 528 cssTextCache().remove(this);
543 m_hasCachedCSSText = false; 529 m_hasCachedCSSText = false;
544 } 530 }
545 } 531 }
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 1038
1053 static String formatNumber(double number, const char* characters) 1039 static String formatNumber(double number, const char* characters)
1054 { 1040 {
1055 return formatNumber(number, characters, strlen(characters)); 1041 return formatNumber(number, characters, strlen(characters));
1056 } 1042 }
1057 1043
1058 const char* CSSPrimitiveValue::unitTypeToString(UnitType type) 1044 const char* CSSPrimitiveValue::unitTypeToString(UnitType type)
1059 { 1045 {
1060 switch (type) { 1046 switch (type) {
1061 case CSS_NUMBER: 1047 case CSS_NUMBER:
1062 case CSS_PARSER_INTEGER:
1063 return ""; 1048 return "";
1064 case CSS_PERCENTAGE: 1049 case CSS_PERCENTAGE:
1065 return "%"; 1050 return "%";
1066 case CSS_EMS: 1051 case CSS_EMS:
1067 return "em"; 1052 return "em";
1068 case CSS_EXS: 1053 case CSS_EXS:
1069 return "ex"; 1054 return "ex";
1070 case CSS_REMS: 1055 case CSS_REMS:
1071 return "rem"; 1056 return "rem";
1072 case CSS_CHS: 1057 case CSS_CHS:
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 case CSS_VALUE_ID: 1107 case CSS_VALUE_ID:
1123 case CSS_PROPERTY_ID: 1108 case CSS_PROPERTY_ID:
1124 case CSS_ATTR: 1109 case CSS_ATTR:
1125 case CSS_COUNTER_NAME: 1110 case CSS_COUNTER_NAME:
1126 case CSS_COUNTER: 1111 case CSS_COUNTER:
1127 case CSS_RECT: 1112 case CSS_RECT:
1128 case CSS_QUAD: 1113 case CSS_QUAD:
1129 case CSS_RGBCOLOR: 1114 case CSS_RGBCOLOR:
1130 case CSS_PARSER_HEXCOLOR: 1115 case CSS_PARSER_HEXCOLOR:
1131 case CSS_PAIR: 1116 case CSS_PAIR:
1132 case CSS_PARSER_OPERATOR:
1133 case CSS_PARSER_IDENTIFIER:
1134 case CSS_CALC: 1117 case CSS_CALC:
1135 case CSS_SHAPE: 1118 case CSS_SHAPE:
1136 case CSS_IDENT: 1119 case CSS_IDENT:
1137 case CSS_UNICODE_RANGE: 1120 case CSS_UNICODE_RANGE:
1138 case CSS_CALC_PERCENTAGE_WITH_NUMBER: 1121 case CSS_CALC_PERCENTAGE_WITH_NUMBER:
1139 case CSS_CALC_PERCENTAGE_WITH_LENGTH: 1122 case CSS_CALC_PERCENTAGE_WITH_LENGTH:
1140 break; 1123 break;
1141 }; 1124 };
1142 ASSERT_NOT_REACHED(); 1125 ASSERT_NOT_REACHED();
1143 return ""; 1126 return "";
1144 } 1127 }
1145 1128
1146 String CSSPrimitiveValue::customCSSText(CSSTextFormattingFlags formattingFlag) c onst 1129 String CSSPrimitiveValue::customCSSText(CSSTextFormattingFlags formattingFlag) c onst
1147 { 1130 {
1148 // FIXME: return the original value instead of a generated one (e.g. color 1131 // FIXME: return the original value instead of a generated one (e.g. color
1149 // name if it was specified) - check what spec says about this 1132 // name if it was specified) - check what spec says about this
1150 1133
1151 if (m_hasCachedCSSText) { 1134 if (m_hasCachedCSSText) {
1152 ASSERT(cssTextCache().contains(this)); 1135 ASSERT(cssTextCache().contains(this));
1153 return cssTextCache().get(this); 1136 return cssTextCache().get(this);
1154 } 1137 }
1155 1138
1156 String text; 1139 String text;
1157 switch (m_primitiveUnitType) { 1140 switch (m_primitiveUnitType) {
1158 case CSS_UNKNOWN: 1141 case CSS_UNKNOWN:
1159 // FIXME 1142 // FIXME
1160 break; 1143 break;
1161 case CSS_NUMBER: 1144 case CSS_NUMBER:
1162 case CSS_PARSER_INTEGER:
1163 case CSS_PERCENTAGE: 1145 case CSS_PERCENTAGE:
1164 case CSS_EMS: 1146 case CSS_EMS:
1165 case CSS_EXS: 1147 case CSS_EXS:
1166 case CSS_REMS: 1148 case CSS_REMS:
1167 case CSS_CHS: 1149 case CSS_CHS:
1168 case CSS_PX: 1150 case CSS_PX:
1169 case CSS_CM: 1151 case CSS_CM:
1170 case CSS_DPPX: 1152 case CSS_DPPX:
1171 case CSS_DPI: 1153 case CSS_DPI:
1172 case CSS_DPCM: 1154 case CSS_DPCM:
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 RGBA32 rgbColor = m_value.rgbcolor; 1233 RGBA32 rgbColor = m_value.rgbcolor;
1252 if (m_primitiveUnitType == CSS_PARSER_HEXCOLOR) 1234 if (m_primitiveUnitType == CSS_PARSER_HEXCOLOR)
1253 Color::parseHexColor(m_value.string, rgbColor); 1235 Color::parseHexColor(m_value.string, rgbColor);
1254 Color color(rgbColor); 1236 Color color(rgbColor);
1255 text = color.serializedAsCSSComponentValue(); 1237 text = color.serializedAsCSSComponentValue();
1256 break; 1238 break;
1257 } 1239 }
1258 case CSS_PAIR: 1240 case CSS_PAIR:
1259 text = getPairValue()->cssText(); 1241 text = getPairValue()->cssText();
1260 break; 1242 break;
1261 case CSS_PARSER_OPERATOR: {
1262 char c = static_cast<char>(m_value.parserOperator);
1263 text = String(&c, 1U);
1264 break;
1265 }
1266 case CSS_PARSER_IDENTIFIER:
1267 text = quoteCSSStringIfNeeded(m_value.string);
1268 break;
1269 case CSS_CALC: 1243 case CSS_CALC:
1270 text = m_value.calc->cssText(); 1244 text = m_value.calc->cssText();
1271 break; 1245 break;
1272 case CSS_SHAPE: 1246 case CSS_SHAPE:
1273 text = m_value.shape->cssText(); 1247 text = m_value.shape->cssText();
1274 break; 1248 break;
1275 } 1249 }
1276 1250
1277 ASSERT(!cssTextCache().contains(this)); 1251 ASSERT(!cssTextCache().contains(this));
1278 cssTextCache().set(this, text); 1252 cssTextCache().set(this, text);
(...skipping 27 matching lines...) Expand all
1306 break; 1280 break;
1307 case CSS_CALC: 1281 case CSS_CALC:
1308 // CSSCalcValue is not exposed to the CSSOM, no need for a deep clone. 1282 // CSSCalcValue is not exposed to the CSSOM, no need for a deep clone.
1309 result = CSSPrimitiveValue::create(m_value.calc); 1283 result = CSSPrimitiveValue::create(m_value.calc);
1310 break; 1284 break;
1311 case CSS_SHAPE: 1285 case CSS_SHAPE:
1312 // CSSShapeValue is not exposed to the CSSOM, no need for a deep clone. 1286 // CSSShapeValue is not exposed to the CSSOM, no need for a deep clone.
1313 result = CSSPrimitiveValue::create(m_value.shape); 1287 result = CSSPrimitiveValue::create(m_value.shape);
1314 break; 1288 break;
1315 case CSS_NUMBER: 1289 case CSS_NUMBER:
1316 case CSS_PARSER_INTEGER:
1317 case CSS_PERCENTAGE: 1290 case CSS_PERCENTAGE:
1318 case CSS_EMS: 1291 case CSS_EMS:
1319 case CSS_EXS: 1292 case CSS_EXS:
1320 case CSS_REMS: 1293 case CSS_REMS:
1321 case CSS_CHS: 1294 case CSS_CHS:
1322 case CSS_PX: 1295 case CSS_PX:
1323 case CSS_CM: 1296 case CSS_CM:
1324 case CSS_MM: 1297 case CSS_MM:
1325 case CSS_IN: 1298 case CSS_IN:
1326 case CSS_PT: 1299 case CSS_PT:
(...skipping 20 matching lines...) Expand all
1347 result = CSSPrimitiveValue::createIdentifier(m_value.propertyID); 1320 result = CSSPrimitiveValue::createIdentifier(m_value.propertyID);
1348 break; 1321 break;
1349 case CSS_VALUE_ID: 1322 case CSS_VALUE_ID:
1350 result = CSSPrimitiveValue::createIdentifier(m_value.valueID); 1323 result = CSSPrimitiveValue::createIdentifier(m_value.valueID);
1351 break; 1324 break;
1352 case CSS_RGBCOLOR: 1325 case CSS_RGBCOLOR:
1353 result = CSSPrimitiveValue::createColor(m_value.rgbcolor); 1326 result = CSSPrimitiveValue::createColor(m_value.rgbcolor);
1354 break; 1327 break;
1355 case CSS_DIMENSION: 1328 case CSS_DIMENSION:
1356 case CSS_UNKNOWN: 1329 case CSS_UNKNOWN:
1357 case CSS_PARSER_OPERATOR:
1358 case CSS_PARSER_IDENTIFIER:
1359 case CSS_PARSER_HEXCOLOR: 1330 case CSS_PARSER_HEXCOLOR:
1360 ASSERT_NOT_REACHED(); 1331 ASSERT_NOT_REACHED();
1361 break; 1332 break;
1362 } 1333 }
1363 if (result) 1334 if (result)
1364 result->setCSSOMSafe(); 1335 result->setCSSOMSafe();
1365 1336
1366 return result; 1337 return result;
1367 } 1338 }
1368 1339
1369 bool CSSPrimitiveValue::equals(const CSSPrimitiveValue& other) const 1340 bool CSSPrimitiveValue::equals(const CSSPrimitiveValue& other) const
1370 { 1341 {
1371 if (m_primitiveUnitType != other.m_primitiveUnitType) 1342 if (m_primitiveUnitType != other.m_primitiveUnitType)
1372 return false; 1343 return false;
1373 1344
1374 switch (m_primitiveUnitType) { 1345 switch (m_primitiveUnitType) {
1375 case CSS_UNKNOWN: 1346 case CSS_UNKNOWN:
1376 return false; 1347 return false;
1377 case CSS_NUMBER: 1348 case CSS_NUMBER:
1378 case CSS_PARSER_INTEGER:
1379 case CSS_PERCENTAGE: 1349 case CSS_PERCENTAGE:
1380 case CSS_EMS: 1350 case CSS_EMS:
1381 case CSS_EXS: 1351 case CSS_EXS:
1382 case CSS_REMS: 1352 case CSS_REMS:
1383 case CSS_PX: 1353 case CSS_PX:
1384 case CSS_CM: 1354 case CSS_CM:
1385 case CSS_DPPX: 1355 case CSS_DPPX:
1386 case CSS_DPI: 1356 case CSS_DPI:
1387 case CSS_DPCM: 1357 case CSS_DPCM:
1388 case CSS_MM: 1358 case CSS_MM:
(...skipping 16 matching lines...) Expand all
1405 case CSS_FR: 1375 case CSS_FR:
1406 return m_value.num == other.m_value.num; 1376 return m_value.num == other.m_value.num;
1407 case CSS_PROPERTY_ID: 1377 case CSS_PROPERTY_ID:
1408 return propertyName(m_value.propertyID) == propertyName(other.m_value.pr opertyID); 1378 return propertyName(m_value.propertyID) == propertyName(other.m_value.pr opertyID);
1409 case CSS_VALUE_ID: 1379 case CSS_VALUE_ID:
1410 return valueName(m_value.valueID) == valueName(other.m_value.valueID); 1380 return valueName(m_value.valueID) == valueName(other.m_value.valueID);
1411 case CSS_STRING: 1381 case CSS_STRING:
1412 case CSS_URI: 1382 case CSS_URI:
1413 case CSS_ATTR: 1383 case CSS_ATTR:
1414 case CSS_COUNTER_NAME: 1384 case CSS_COUNTER_NAME:
1415 case CSS_PARSER_IDENTIFIER:
1416 case CSS_PARSER_HEXCOLOR: 1385 case CSS_PARSER_HEXCOLOR:
1417 return equal(m_value.string, other.m_value.string); 1386 return equal(m_value.string, other.m_value.string);
1418 case CSS_COUNTER: 1387 case CSS_COUNTER:
1419 return m_value.counter && other.m_value.counter && m_value.counter->equa ls(*other.m_value.counter); 1388 return m_value.counter && other.m_value.counter && m_value.counter->equa ls(*other.m_value.counter);
1420 case CSS_RECT: 1389 case CSS_RECT:
1421 return m_value.rect && other.m_value.rect && m_value.rect->equals(*other .m_value.rect); 1390 return m_value.rect && other.m_value.rect && m_value.rect->equals(*other .m_value.rect);
1422 case CSS_QUAD: 1391 case CSS_QUAD:
1423 return m_value.quad && other.m_value.quad && m_value.quad->equals(*other .m_value.quad); 1392 return m_value.quad && other.m_value.quad && m_value.quad->equals(*other .m_value.quad);
1424 case CSS_RGBCOLOR: 1393 case CSS_RGBCOLOR:
1425 return m_value.rgbcolor == other.m_value.rgbcolor; 1394 return m_value.rgbcolor == other.m_value.rgbcolor;
1426 case CSS_PAIR: 1395 case CSS_PAIR:
1427 return m_value.pair && other.m_value.pair && m_value.pair->equals(*other .m_value.pair); 1396 return m_value.pair && other.m_value.pair && m_value.pair->equals(*other .m_value.pair);
1428 case CSS_PARSER_OPERATOR:
1429 return m_value.parserOperator == other.m_value.parserOperator;
1430 case CSS_CALC: 1397 case CSS_CALC:
1431 return m_value.calc && other.m_value.calc && m_value.calc->equals(*other .m_value.calc); 1398 return m_value.calc && other.m_value.calc && m_value.calc->equals(*other .m_value.calc);
1432 case CSS_SHAPE: 1399 case CSS_SHAPE:
1433 return m_value.shape && other.m_value.shape && m_value.shape->equals(*ot her.m_value.shape); 1400 return m_value.shape && other.m_value.shape && m_value.shape->equals(*ot her.m_value.shape);
1434 } 1401 }
1435 return false; 1402 return false;
1436 } 1403 }
1437 1404
1438 void CSSPrimitiveValue::traceAfterDispatch(Visitor* visitor) 1405 void CSSPrimitiveValue::traceAfterDispatch(Visitor* visitor)
1439 { 1406 {
(...skipping 18 matching lines...) Expand all
1458 visitor->trace(m_value.shape); 1425 visitor->trace(m_value.shape);
1459 break; 1426 break;
1460 default: 1427 default:
1461 break; 1428 break;
1462 } 1429 }
1463 #endif 1430 #endif
1464 CSSValue::traceAfterDispatch(visitor); 1431 CSSValue::traceAfterDispatch(visitor);
1465 } 1432 }
1466 1433
1467 } // namespace blink 1434 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/CSSPrimitiveValue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698