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

Side by Side Diff: Source/core/rendering/style/RenderStyle.h

Issue 153233002: *** DO NOT LAND *** Remove regions support, keeping a bare minimum to support "region-based"... (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 10 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/rendering/shapes/ShapeInfo.cpp ('k') | Source/core/rendering/style/RenderStyle.cpp » ('j') | 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 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * (C) 2000 Antti Koivisto (koivisto@kde.org) 3 * (C) 2000 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved. 5 * Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved.
6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 ColumnFill columnFill() const { return static_cast<ColumnFill>(rareNonInheri tedData->m_multiCol->m_fill); } 839 ColumnFill columnFill() const { return static_cast<ColumnFill>(rareNonInheri tedData->m_multiCol->m_fill); }
840 float columnGap() const { return rareNonInheritedData->m_multiCol->m_gap; } 840 float columnGap() const { return rareNonInheritedData->m_multiCol->m_gap; }
841 bool hasNormalColumnGap() const { return rareNonInheritedData->m_multiCol->m _normalGap; } 841 bool hasNormalColumnGap() const { return rareNonInheritedData->m_multiCol->m _normalGap; }
842 EBorderStyle columnRuleStyle() const { return rareNonInheritedData->m_multiC ol->m_rule.style(); } 842 EBorderStyle columnRuleStyle() const { return rareNonInheritedData->m_multiC ol->m_rule.style(); }
843 unsigned short columnRuleWidth() const { return rareNonInheritedData->m_mult iCol->ruleWidth(); } 843 unsigned short columnRuleWidth() const { return rareNonInheritedData->m_mult iCol->ruleWidth(); }
844 bool columnRuleIsTransparent() const { return rareNonInheritedData->m_multiC ol->m_rule.isTransparent(); } 844 bool columnRuleIsTransparent() const { return rareNonInheritedData->m_multiC ol->m_rule.isTransparent(); }
845 ColumnSpan columnSpan() const { return static_cast<ColumnSpan>(rareNonInheri tedData->m_multiCol->m_columnSpan); } 845 ColumnSpan columnSpan() const { return static_cast<ColumnSpan>(rareNonInheri tedData->m_multiCol->m_columnSpan); }
846 EPageBreak columnBreakBefore() const { return static_cast<EPageBreak>(rareNo nInheritedData->m_multiCol->m_breakBefore); } 846 EPageBreak columnBreakBefore() const { return static_cast<EPageBreak>(rareNo nInheritedData->m_multiCol->m_breakBefore); }
847 EPageBreak columnBreakInside() const { return static_cast<EPageBreak>(rareNo nInheritedData->m_multiCol->m_breakInside); } 847 EPageBreak columnBreakInside() const { return static_cast<EPageBreak>(rareNo nInheritedData->m_multiCol->m_breakInside); }
848 EPageBreak columnBreakAfter() const { return static_cast<EPageBreak>(rareNon InheritedData->m_multiCol->m_breakAfter); } 848 EPageBreak columnBreakAfter() const { return static_cast<EPageBreak>(rareNon InheritedData->m_multiCol->m_breakAfter); }
849 EPageBreak regionBreakBefore() const { return static_cast<EPageBreak>(rareNo nInheritedData->m_regionBreakBefore); }
850 EPageBreak regionBreakInside() const { return static_cast<EPageBreak>(rareNo nInheritedData->m_regionBreakInside); }
851 EPageBreak regionBreakAfter() const { return static_cast<EPageBreak>(rareNon InheritedData->m_regionBreakAfter); }
852 const TransformOperations& transform() const { return rareNonInheritedData-> m_transform->m_operations; } 849 const TransformOperations& transform() const { return rareNonInheritedData-> m_transform->m_operations; }
853 Length transformOriginX() const { return rareNonInheritedData->m_transform-> m_x; } 850 Length transformOriginX() const { return rareNonInheritedData->m_transform-> m_x; }
854 Length transformOriginY() const { return rareNonInheritedData->m_transform-> m_y; } 851 Length transformOriginY() const { return rareNonInheritedData->m_transform-> m_y; }
855 float transformOriginZ() const { return rareNonInheritedData->m_transform->m _z; } 852 float transformOriginZ() const { return rareNonInheritedData->m_transform->m _z; }
856 bool hasTransform() const { return !rareNonInheritedData->m_transform->m_ope rations.operations().isEmpty(); } 853 bool hasTransform() const { return !rareNonInheritedData->m_transform->m_ope rations.operations().isEmpty(); }
857 854
858 TextEmphasisFill textEmphasisFill() const { return static_cast<TextEmphasisF ill>(rareInheritedData->textEmphasisFill); } 855 TextEmphasisFill textEmphasisFill() const { return static_cast<TextEmphasisF ill>(rareInheritedData->textEmphasisFill); }
859 TextEmphasisMark textEmphasisMark() const; 856 TextEmphasisMark textEmphasisMark() const;
860 const AtomicString& textEmphasisCustomMark() const { return rareInheritedDat a->textEmphasisCustomMark; } 857 const AtomicString& textEmphasisCustomMark() const { return rareInheritedDat a->textEmphasisCustomMark; }
861 TextEmphasisPosition textEmphasisPosition() const { return static_cast<TextE mphasisPosition>(rareInheritedData->textEmphasisPosition); } 858 TextEmphasisPosition textEmphasisPosition() const { return static_cast<TextE mphasisPosition>(rareInheritedData->textEmphasisPosition); }
(...skipping 16 matching lines...) Expand all
878 875
879 bool hasMask() const { return rareNonInheritedData->m_mask.hasImage() || rar eNonInheritedData->m_maskBoxImage.hasImage(); } 876 bool hasMask() const { return rareNonInheritedData->m_mask.hasImage() || rar eNonInheritedData->m_maskBoxImage.hasImage(); }
880 877
881 TextCombine textCombine() const { return static_cast<TextCombine>(rareNonInh eritedData->m_textCombine); } 878 TextCombine textCombine() const { return static_cast<TextCombine>(rareNonInh eritedData->m_textCombine); }
882 bool hasTextCombine() const { return textCombine() != TextCombineNone; } 879 bool hasTextCombine() const { return textCombine() != TextCombineNone; }
883 880
884 unsigned tabSize() const { return rareInheritedData->m_tabSize; } 881 unsigned tabSize() const { return rareInheritedData->m_tabSize; }
885 882
886 // End CSS3 Getters 883 // End CSS3 Getters
887 884
888 const AtomicString& flowThread() const { return rareNonInheritedData->m_flow Thread; }
889 bool hasFlowFrom() const { return !rareNonInheritedData->m_regionThread.isNu ll(); }
890 const AtomicString& regionThread() const { return rareNonInheritedData->m_re gionThread; }
891 RegionFragment regionFragment() const { return static_cast<RegionFragment>(r areNonInheritedData->m_regionFragment); }
892
893 const AtomicString& lineGrid() const { return rareInheritedData->m_lineGrid; } 885 const AtomicString& lineGrid() const { return rareInheritedData->m_lineGrid; }
894 LineSnap lineSnap() const { return static_cast<LineSnap>(rareInheritedData-> m_lineSnap); } 886 LineSnap lineSnap() const { return static_cast<LineSnap>(rareInheritedData-> m_lineSnap); }
895 LineAlign lineAlign() const { return static_cast<LineAlign>(rareInheritedDat a->m_lineAlign); } 887 LineAlign lineAlign() const { return static_cast<LineAlign>(rareInheritedDat a->m_lineAlign); }
896 888
897 WrapFlow wrapFlow() const { return static_cast<WrapFlow>(rareNonInheritedDat a->m_wrapFlow); } 889 WrapFlow wrapFlow() const { return static_cast<WrapFlow>(rareNonInheritedDat a->m_wrapFlow); }
898 WrapThrough wrapThrough() const { return static_cast<WrapThrough>(rareNonInh eritedData->m_wrapThrough); } 890 WrapThrough wrapThrough() const { return static_cast<WrapThrough>(rareNonInh eritedData->m_wrapThrough); }
899 891
900 // Apple-specific property getter methods 892 // Apple-specific property getter methods
901 EPointerEvents pointerEvents() const { return static_cast<EPointerEvents>(in herited_flags._pointerEvents); } 893 EPointerEvents pointerEvents() const { return static_cast<EPointerEvents>(in herited_flags._pointerEvents); }
902 const CSSAnimationDataList* animations() const { return rareNonInheritedData ->m_animations.get(); } 894 const CSSAnimationDataList* animations() const { return rareNonInheritedData ->m_animations.get(); }
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 void setHasNormalColumnGap() { SET_VAR(rareNonInheritedData.access()->m_mult iCol, m_normalGap, true); SET_VAR(rareNonInheritedData.access()->m_multiCol, m_g ap, 0); } 1298 void setHasNormalColumnGap() { SET_VAR(rareNonInheritedData.access()->m_mult iCol, m_normalGap, true); SET_VAR(rareNonInheritedData.access()->m_multiCol, m_g ap, 0); }
1307 void setColumnRuleColor(const StyleColor& c) { SET_BORDERVALUE_COLOR(rareNon InheritedData.access()->m_multiCol, m_rule, c); } 1299 void setColumnRuleColor(const StyleColor& c) { SET_BORDERVALUE_COLOR(rareNon InheritedData.access()->m_multiCol, m_rule, c); }
1308 void setColumnRuleStyle(EBorderStyle b) { SET_VAR(rareNonInheritedData.acces s()->m_multiCol, m_rule.m_style, b); } 1300 void setColumnRuleStyle(EBorderStyle b) { SET_VAR(rareNonInheritedData.acces s()->m_multiCol, m_rule.m_style, b); }
1309 void setColumnRuleWidth(unsigned short w) { SET_VAR(rareNonInheritedData.acc ess()->m_multiCol, m_rule.m_width, w); } 1301 void setColumnRuleWidth(unsigned short w) { SET_VAR(rareNonInheritedData.acc ess()->m_multiCol, m_rule.m_width, w); }
1310 void resetColumnRule() { SET_VAR(rareNonInheritedData.access()->m_multiCol, m_rule, BorderValue()); } 1302 void resetColumnRule() { SET_VAR(rareNonInheritedData.access()->m_multiCol, m_rule, BorderValue()); }
1311 void setColumnSpan(ColumnSpan columnSpan) { SET_VAR(rareNonInheritedData.acc ess()->m_multiCol, m_columnSpan, columnSpan); } 1303 void setColumnSpan(ColumnSpan columnSpan) { SET_VAR(rareNonInheritedData.acc ess()->m_multiCol, m_columnSpan, columnSpan); }
1312 void setColumnBreakBefore(EPageBreak p) { SET_VAR(rareNonInheritedData.acces s()->m_multiCol, m_breakBefore, p); } 1304 void setColumnBreakBefore(EPageBreak p) { SET_VAR(rareNonInheritedData.acces s()->m_multiCol, m_breakBefore, p); }
1313 // For valid values of column-break-inside see http://www.w3.org/TR/css3-mul ticol/#break-before-break-after-break-inside 1305 // For valid values of column-break-inside see http://www.w3.org/TR/css3-mul ticol/#break-before-break-after-break-inside
1314 void setColumnBreakInside(EPageBreak p) { ASSERT(p == PBAUTO || p == PBAVOID ); SET_VAR(rareNonInheritedData.access()->m_multiCol, m_breakInside, p); } 1306 void setColumnBreakInside(EPageBreak p) { ASSERT(p == PBAUTO || p == PBAVOID ); SET_VAR(rareNonInheritedData.access()->m_multiCol, m_breakInside, p); }
1315 void setColumnBreakAfter(EPageBreak p) { SET_VAR(rareNonInheritedData.access ()->m_multiCol, m_breakAfter, p); } 1307 void setColumnBreakAfter(EPageBreak p) { SET_VAR(rareNonInheritedData.access ()->m_multiCol, m_breakAfter, p); }
1316 void setRegionBreakBefore(EPageBreak p) { SET_VAR(rareNonInheritedData, m_re gionBreakBefore, p); }
1317 void setRegionBreakInside(EPageBreak p) { ASSERT(p == PBAUTO || p == PBAVOID ); SET_VAR(rareNonInheritedData, m_regionBreakInside, p); }
1318 void setRegionBreakAfter(EPageBreak p) { SET_VAR(rareNonInheritedData, m_reg ionBreakAfter, p); }
1319 void inheritColumnPropertiesFrom(RenderStyle* parent) { rareNonInheritedData .access()->m_multiCol = parent->rareNonInheritedData->m_multiCol; } 1308 void inheritColumnPropertiesFrom(RenderStyle* parent) { rareNonInheritedData .access()->m_multiCol = parent->rareNonInheritedData->m_multiCol; }
1320 void setTransform(const TransformOperations& ops) { SET_VAR(rareNonInherited Data.access()->m_transform, m_operations, ops); } 1309 void setTransform(const TransformOperations& ops) { SET_VAR(rareNonInherited Data.access()->m_transform, m_operations, ops); }
1321 void setTransformOriginX(Length l) { SET_VAR(rareNonInheritedData.access()-> m_transform, m_x, l); } 1310 void setTransformOriginX(Length l) { SET_VAR(rareNonInheritedData.access()-> m_transform, m_x, l); }
1322 void setTransformOriginY(Length l) { SET_VAR(rareNonInheritedData.access()-> m_transform, m_y, l); } 1311 void setTransformOriginY(Length l) { SET_VAR(rareNonInheritedData.access()-> m_transform, m_y, l); }
1323 void setTransformOriginZ(float f) { SET_VAR(rareNonInheritedData.access()->m _transform, m_z, f); } 1312 void setTransformOriginZ(float f) { SET_VAR(rareNonInheritedData.access()->m _transform, m_z, f); }
1324 void setSpeak(ESpeak s) { SET_VAR(rareInheritedData, speak, s); } 1313 void setSpeak(ESpeak s) { SET_VAR(rareInheritedData, speak, s); }
1325 void setTextCombine(TextCombine v) { SET_VAR(rareNonInheritedData, m_textCom bine, v); } 1314 void setTextCombine(TextCombine v) { SET_VAR(rareNonInheritedData, m_textCom bine, v); }
1326 void setTextDecorationColor(const StyleColor& c) { SET_VAR(rareNonInheritedD ata, m_textDecorationColor, c); } 1315 void setTextDecorationColor(const StyleColor& c) { SET_VAR(rareNonInheritedD ata, m_textDecorationColor, c); }
1327 void setTextEmphasisColor(const StyleColor& c) { SET_VAR(rareInheritedData, textEmphasisColor, c); } 1316 void setTextEmphasisColor(const StyleColor& c) { SET_VAR(rareInheritedData, textEmphasisColor, c); }
1328 void setTextEmphasisFill(TextEmphasisFill fill) { SET_VAR(rareInheritedData, textEmphasisFill, fill); } 1317 void setTextEmphasisFill(TextEmphasisFill fill) { SET_VAR(rareInheritedData, textEmphasisFill, fill); }
(...skipping 10 matching lines...) Expand all
1339 void setFilter(const FilterOperations& ops) { SET_VAR(rareNonInheritedData.a ccess()->m_filter, m_operations, ops); } 1328 void setFilter(const FilterOperations& ops) { SET_VAR(rareNonInheritedData.a ccess()->m_filter, m_operations, ops); }
1340 1329
1341 void setTabSize(unsigned size) { SET_VAR(rareInheritedData, m_tabSize, size) ; } 1330 void setTabSize(unsigned size) { SET_VAR(rareInheritedData, m_tabSize, size) ; }
1342 1331
1343 // End CSS3 Setters 1332 // End CSS3 Setters
1344 1333
1345 void setLineGrid(const AtomicString& lineGrid) { SET_VAR(rareInheritedData, m_lineGrid, lineGrid); } 1334 void setLineGrid(const AtomicString& lineGrid) { SET_VAR(rareInheritedData, m_lineGrid, lineGrid); }
1346 void setLineSnap(LineSnap lineSnap) { SET_VAR(rareInheritedData, m_lineSnap, lineSnap); } 1335 void setLineSnap(LineSnap lineSnap) { SET_VAR(rareInheritedData, m_lineSnap, lineSnap); }
1347 void setLineAlign(LineAlign lineAlign) { SET_VAR(rareInheritedData, m_lineAl ign, lineAlign); } 1336 void setLineAlign(LineAlign lineAlign) { SET_VAR(rareInheritedData, m_lineAl ign, lineAlign); }
1348 1337
1349 void setFlowThread(const AtomicString& flowThread) { SET_VAR(rareNonInherite dData, m_flowThread, flowThread); }
1350 void setRegionThread(const AtomicString& regionThread) { SET_VAR(rareNonInhe ritedData, m_regionThread, regionThread); }
1351 void setRegionFragment(RegionFragment regionFragment) { SET_VAR(rareNonInher itedData, m_regionFragment, regionFragment); }
1352
1353 void setWrapFlow(WrapFlow wrapFlow) { SET_VAR(rareNonInheritedData, m_wrapFl ow, wrapFlow); } 1338 void setWrapFlow(WrapFlow wrapFlow) { SET_VAR(rareNonInheritedData, m_wrapFl ow, wrapFlow); }
1354 void setWrapThrough(WrapThrough wrapThrough) { SET_VAR(rareNonInheritedData, m_wrapThrough, wrapThrough); } 1339 void setWrapThrough(WrapThrough wrapThrough) { SET_VAR(rareNonInheritedData, m_wrapThrough, wrapThrough); }
1355 1340
1356 // Apple-specific property setters 1341 // Apple-specific property setters
1357 void setPointerEvents(EPointerEvents p) { inherited_flags._pointerEvents = p ; } 1342 void setPointerEvents(EPointerEvents p) { inherited_flags._pointerEvents = p ; }
1358 1343
1359 void clearAnimations() 1344 void clearAnimations()
1360 { 1345 {
1361 rareNonInheritedData.access()->m_animations.clear(); 1346 rareNonInheritedData.access()->m_animations.clear();
1362 } 1347 }
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1497 const AtomicString& hyphenString() const; 1482 const AtomicString& hyphenString() const;
1498 1483
1499 bool inheritedNotEqual(const RenderStyle*) const; 1484 bool inheritedNotEqual(const RenderStyle*) const;
1500 bool inheritedDataShared(const RenderStyle*) const; 1485 bool inheritedDataShared(const RenderStyle*) const;
1501 1486
1502 StyleDifference diff(const RenderStyle*, unsigned& changedContextSensitivePr operties) const; 1487 StyleDifference diff(const RenderStyle*, unsigned& changedContextSensitivePr operties) const;
1503 1488
1504 bool isDisplayReplacedType() const { return isDisplayReplacedType(display()) ; } 1489 bool isDisplayReplacedType() const { return isDisplayReplacedType(display()) ; }
1505 bool isDisplayInlineType() const { return isDisplayInlineType(display()); } 1490 bool isDisplayInlineType() const { return isDisplayInlineType(display()); }
1506 bool isOriginalDisplayInlineType() const { return isDisplayInlineType(origin alDisplay()); } 1491 bool isOriginalDisplayInlineType() const { return isDisplayInlineType(origin alDisplay()); }
1507 bool isDisplayRegionType() const
1508 {
1509 return display() == BLOCK || display() == INLINE_BLOCK
1510 || display() == TABLE_CELL || display() == TABLE_CAPTION
1511 || display() == LIST_ITEM;
1512 }
1513 1492
1514 bool setWritingMode(WritingMode v) 1493 bool setWritingMode(WritingMode v)
1515 { 1494 {
1516 if (v == writingMode()) 1495 if (v == writingMode())
1517 return false; 1496 return false;
1518 1497
1519 inherited_flags.m_writingMode = v; 1498 inherited_flags.m_writingMode = v;
1520 return true; 1499 return true;
1521 } 1500 }
1522 1501
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1711 static GridPosition initialGridColumnEnd() { return GridPosition(); } 1690 static GridPosition initialGridColumnEnd() { return GridPosition(); }
1712 static GridPosition initialGridRowStart() { return GridPosition(); } 1691 static GridPosition initialGridRowStart() { return GridPosition(); }
1713 static GridPosition initialGridRowEnd() { return GridPosition(); } 1692 static GridPosition initialGridRowEnd() { return GridPosition(); }
1714 1693
1715 static unsigned initialTabSize() { return 8; } 1694 static unsigned initialTabSize() { return 8; }
1716 1695
1717 static const AtomicString& initialLineGrid() { return nullAtom; } 1696 static const AtomicString& initialLineGrid() { return nullAtom; }
1718 static LineSnap initialLineSnap() { return LineSnapNone; } 1697 static LineSnap initialLineSnap() { return LineSnapNone; }
1719 static LineAlign initialLineAlign() { return LineAlignNone; } 1698 static LineAlign initialLineAlign() { return LineAlignNone; }
1720 1699
1721 static const AtomicString& initialFlowThread() { return nullAtom; }
1722 static const AtomicString& initialRegionThread() { return nullAtom; }
1723 static RegionFragment initialRegionFragment() { return AutoRegionFragment; }
1724
1725 static WrapFlow initialWrapFlow() { return WrapFlowAuto; } 1700 static WrapFlow initialWrapFlow() { return WrapFlowAuto; }
1726 static WrapThrough initialWrapThrough() { return WrapThroughWrap; } 1701 static WrapThrough initialWrapThrough() { return WrapThroughWrap; }
1727 1702
1728 static QuotesData* initialQuotes() { return 0; } 1703 static QuotesData* initialQuotes() { return 0; }
1729 1704
1730 // Keep these at the end. 1705 // Keep these at the end.
1731 // FIXME: Why? Seems these should all be one big sorted list. 1706 // FIXME: Why? Seems these should all be one big sorted list.
1732 static LineClampValue initialLineClamp() { return LineClampValue(); } 1707 static LineClampValue initialLineClamp() { return LineClampValue(); }
1733 static ETextSecurity initialTextSecurity() { return TSNONE; } 1708 static ETextSecurity initialTextSecurity() { return TSNONE; }
1734 static Color initialTapHighlightColor(); 1709 static Color initialTapHighlightColor();
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1897 } 1872 }
1898 1873
1899 inline bool RenderStyle::hasPseudoElementStyle() const 1874 inline bool RenderStyle::hasPseudoElementStyle() const
1900 { 1875 {
1901 return noninherited_flags._pseudoBits & PSEUDO_ELEMENT_MASK; 1876 return noninherited_flags._pseudoBits & PSEUDO_ELEMENT_MASK;
1902 } 1877 }
1903 1878
1904 } // namespace WebCore 1879 } // namespace WebCore
1905 1880
1906 #endif // RenderStyle_h 1881 #endif // RenderStyle_h
OLDNEW
« no previous file with comments | « Source/core/rendering/shapes/ShapeInfo.cpp ('k') | Source/core/rendering/style/RenderStyle.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698