WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
patch.txt (text/plain), 69.58 KB, created by
Dave Hyatt
on 2011-09-01 13:52:51 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Dave Hyatt
Created:
2011-09-01 13:52:51 PDT
Size:
69.58 KB
patch
obsolete
>Index: Source/WebCore/ChangeLog >=================================================================== >--- Source/WebCore/ChangeLog (revision 94338) >+++ Source/WebCore/ChangeLog (working copy) >@@ -1,3 +1,70 @@ >+2011-09-01 David Hyatt <hyatt@apple.com> >+ >+ https://bugs.webkit.org/show_bug.cgi?id=67431 >+ >+ Implement border-image-repeat. Similar to how border-image-slice was implemented, the parsing of the two >+ repeat values has been moved into separate functions. The value is represented as a Pair (similar to how we >+ handle border radius). >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added fast/borders/border-image-repeat.html. >+ >+ * css/CSSBorderImageValue.cpp: >+ (WebCore::CSSBorderImageValue::CSSBorderImageValue): >+ (WebCore::CSSBorderImageValue::cssText): >+ * css/CSSBorderImageValue.h: >+ (WebCore::CSSBorderImageValue::create): >+ Modified the CSSBorderImageValue (you're living on borrowed time, my friend!) to have a CSSValue that >+ contains a Pair. >+ >+ * css/CSSComputedStyleDeclaration.cpp: >+ (WebCore::valueForRepeatRule): >+ (WebCore::valueForNinePieceImageRepeat): >+ (WebCore::valueForNinePieceImage): >+ (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue): >+ Add support for the new properties. Break out the value retrieval for the image repeat rules into its >+ own function, valueForNinePieceImageRepeat. >+ >+ * css/CSSParser.cpp: >+ (WebCore::CSSParser::parseValue): >+ (WebCore::BorderImageParseContext::BorderImageParseContext): >+ (WebCore::BorderImageParseContext::allowRepeat): >+ (WebCore::BorderImageParseContext::commitSlice): >+ (WebCore::BorderImageParseContext::commitSlash): >+ (WebCore::BorderImageParseContext::commitWidth): >+ (WebCore::BorderImageParseContext::commitRepeat): >+ (WebCore::BorderImageParseContext::commitBorderImage): >+ (WebCore::CSSParser::parseBorderImage): >+ Modified the parsing of border image to call into parseBorderImageRepeat for the repeat values. >+ >+ (WebCore::isBorderImageRepeatKeyword): >+ (WebCore::CSSParser::parseBorderImageRepeat): >+ The new parsing code for border-image-repeat is here. It will build up a CSSValue containing a Pair and >+ return the result. >+ >+ * css/CSSParser.h: >+ * css/CSSPropertyNames.in: >+ Add the new properties. >+ >+ * css/CSSStyleSelector.cpp: >+ (WebCore::CSSStyleSelector::applyProperty): >+ (WebCore::CSSStyleSelector::mapNinePieceImage): >+ (WebCore::CSSStyleSelector::mapNinePieceImageRepeat): >+ * css/CSSStyleSelector.h: >+ The mapping into the front end is done the same way as border-image-slice. Factor out the image repeat rules >+ portion into mapNinePieceImageRepeat. >+ >+ * platform/graphics/Image.cpp: >+ (WebCore::Image::drawTiled): >+ * platform/graphics/Image.h: >+ Add the new 'space' value as a valid image tiling rule. It's not yet supported and, like the 'round' value, >+ is just mapped to 'repeat' for now. >+ >+ * rendering/style/NinePieceImage.h: >+ (WebCore::NinePieceImage::copyRepeatFrom): >+ Helper for copying only the repeat rules from another NinePieceImage. >+ > 2011-09-01 Tim Horton <timothy_horton@apple.com> > > REGRESSION: Rendering artifacts on a rotated, pattern filled SVG shape >Index: Source/WebCore/css/CSSBorderImageValue.cpp >=================================================================== >--- Source/WebCore/css/CSSBorderImageValue.cpp (revision 94299) >+++ Source/WebCore/css/CSSBorderImageValue.cpp (working copy) >@@ -26,11 +26,10 @@ > > namespace WebCore { > >-CSSBorderImageValue::CSSBorderImageValue(PassRefPtr<CSSValue> image, PassRefPtr<CSSBorderImageSliceValue> slice, int horizontalRule, int verticalRule) >+CSSBorderImageValue::CSSBorderImageValue(PassRefPtr<CSSValue> image, PassRefPtr<CSSBorderImageSliceValue> slice, PassRefPtr<CSSValue> repeat) > : m_image(image) > , m_slice(slice) >- , m_horizontalSizeRule(horizontalRule) >- , m_verticalSizeRule(verticalRule) >+ , m_repeat(repeat) > { > } > >@@ -49,9 +48,7 @@ String CSSBorderImageValue::cssText() co > > // Now the keywords. > text += " "; >- text += CSSPrimitiveValue::createIdentifier(m_horizontalSizeRule)->cssText(); >- text += " "; >- text += CSSPrimitiveValue::createIdentifier(m_verticalSizeRule)->cssText(); >+ text += m_repeat->cssText(); > > return text; > } >Index: Source/WebCore/css/CSSBorderImageValue.h >=================================================================== >--- Source/WebCore/css/CSSBorderImageValue.h (revision 94299) >+++ Source/WebCore/css/CSSBorderImageValue.h (working copy) >@@ -31,9 +31,9 @@ class Rect; > > class CSSBorderImageValue : public CSSValue { > public: >- static PassRefPtr<CSSBorderImageValue> create(PassRefPtr<CSSValue> image, PassRefPtr<CSSBorderImageSliceValue> slice, int horizontalRule, int verticalRule) >+ static PassRefPtr<CSSBorderImageValue> create(PassRefPtr<CSSValue> image, PassRefPtr<CSSBorderImageSliceValue> slice, PassRefPtr<CSSValue> repeat) > { >- return adoptRef(new CSSBorderImageValue(image, slice, horizontalRule, verticalRule)); >+ return adoptRef(new CSSBorderImageValue(image, slice, repeat)); > } > virtual ~CSSBorderImageValue(); > >@@ -51,11 +51,10 @@ public: > RefPtr<CSSBorderImageSliceValue> m_slice; > > // Values for how to handle the scaling/stretching/tiling of the image slices. >- int m_horizontalSizeRule; // Rule for how to adjust the widths of the top/middle/bottom >- int m_verticalSizeRule; // Rule for how to adjust the heights of the left/middle/right >+ RefPtr<CSSValue> m_repeat; > > private: >- CSSBorderImageValue(PassRefPtr<CSSValue> image, PassRefPtr<CSSBorderImageSliceValue>, int horizontalRule, int verticalRule); >+ CSSBorderImageValue(PassRefPtr<CSSValue> image, PassRefPtr<CSSBorderImageSliceValue>, PassRefPtr<CSSValue> repeat); > virtual bool isBorderImageValue() const { return true; } > }; > >Index: Source/WebCore/css/CSSComputedStyleDeclaration.cpp >=================================================================== >--- Source/WebCore/css/CSSComputedStyleDeclaration.cpp (revision 94299) >+++ Source/WebCore/css/CSSComputedStyleDeclaration.cpp (working copy) >@@ -44,6 +44,7 @@ > #include "ExceptionCode.h" > #include "FontFeatureSettings.h" > #include "FontFeatureValue.h" >+#include "Pair.h" > #include "Rect.h" > #include "RenderBox.h" > #include "RenderLayer.h" >@@ -73,6 +74,7 @@ static const int computedProperties[] = > CSSPropertyBorderBottomStyle, > CSSPropertyBorderBottomWidth, > CSSPropertyBorderCollapse, >+ CSSPropertyBorderImageRepeat, > CSSPropertyBorderImageSlice, > CSSPropertyBorderImageSource, > CSSPropertyBorderLeftColor, >@@ -225,6 +227,7 @@ static const int computedProperties[] = > CSSPropertyWebkitMarqueeStyle, > CSSPropertyWebkitMaskAttachment, > CSSPropertyWebkitMaskBoxImage, >+ CSSPropertyWebkitMaskBoxImageRepeat, > CSSPropertyWebkitMaskBoxImageSlice, > CSSPropertyWebkitMaskBoxImageSource, > CSSPropertyWebkitMaskClip, >@@ -316,12 +319,13 @@ static int valueForRepeatRule(int rule) > return CSSValueRepeat; > case RoundImageRule: > return CSSValueRound; >+ case SpaceImageRule: >+ return CSSValueSpace; > default: > return CSSValueStretch; > } > } > >- > static PassRefPtr<CSSBorderImageSliceValue> valueForNinePieceImageSlice(const NinePieceImage& image, CSSPrimitiveValueCache* primitiveValueCache) > { > // Create the slices. >@@ -358,6 +362,12 @@ static PassRefPtr<CSSBorderImageSliceVal > return CSSBorderImageSliceValue::create(rect, image.fill()); > } > >+static PassRefPtr<CSSValue> valueForNinePieceImageRepeat(const NinePieceImage& image, CSSPrimitiveValueCache* primitiveValueCache) >+{ >+ return primitiveValueCache->createValue(Pair::create(primitiveValueCache->createIdentifierValue(valueForRepeatRule(image.horizontalRule())), >+ primitiveValueCache->createIdentifierValue(valueForRepeatRule(image.verticalRule())))); >+} >+ > static PassRefPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image, CSSPrimitiveValueCache* primitiveValueCache) > { > if (!image.hasImage()) >@@ -370,7 +380,11 @@ static PassRefPtr<CSSValue> valueForNine > > // Create the slices. > RefPtr<CSSBorderImageSliceValue> slice = valueForNinePieceImageSlice(image, primitiveValueCache); >- return CSSBorderImageValue::create(imageValue, slice, valueForRepeatRule(image.horizontalRule()), valueForRepeatRule(image.verticalRule())); >+ >+ // Create the repeat rules. >+ RefPtr<CSSValue> repeat = valueForNinePieceImageRepeat(image, primitiveValueCache); >+ >+ return CSSBorderImageValue::create(imageValue, slice, repeat); > } > > inline static PassRefPtr<CSSPrimitiveValue> zoomAdjustedPixelValue(int value, const RenderStyle* style, CSSPrimitiveValueCache* primitiveValueCache) >@@ -1595,10 +1609,14 @@ PassRefPtr<CSSValue> CSSComputedStyleDec > return primitiveValueCache->createIdentifierValue((style->backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible); > case CSSPropertyWebkitBorderImage: > return valueForNinePieceImage(style->borderImage(), primitiveValueCache); >+ case CSSPropertyBorderImageRepeat: >+ return valueForNinePieceImageRepeat(style->borderImage(), primitiveValueCache); > case CSSPropertyBorderImageSlice: > return valueForNinePieceImageSlice(style->borderImage(), primitiveValueCache); > case CSSPropertyWebkitMaskBoxImage: > return valueForNinePieceImage(style->maskBoxImage(), primitiveValueCache); >+ case CSSPropertyWebkitMaskBoxImageRepeat: >+ return valueForNinePieceImageRepeat(style->maskBoxImage(), primitiveValueCache); > case CSSPropertyWebkitMaskBoxImageSlice: > return valueForNinePieceImageSlice(style->maskBoxImage(), primitiveValueCache); > case CSSPropertyWebkitMaskBoxImageSource: >Index: Source/WebCore/css/CSSParser.cpp >=================================================================== >--- Source/WebCore/css/CSSParser.cpp (revision 94299) >+++ Source/WebCore/css/CSSParser.cpp (working copy) >@@ -1451,6 +1451,15 @@ bool CSSParser::parseValue(int propId, b > } > break; > } >+ case CSSPropertyBorderImageRepeat: >+ case CSSPropertyWebkitMaskBoxImageRepeat: { >+ RefPtr<CSSValue> result; >+ if (parseBorderImageRepeat(result)) { >+ addProperty(propId, result, important); >+ return true; >+ } >+ break; >+ } > case CSSPropertyBorderImageSlice: > case CSSPropertyWebkitMaskBoxImageSlice: { > RefPtr<CSSBorderImageSliceValue> result; >@@ -5129,27 +5138,25 @@ struct BorderImageParseContext { > , m_allowBreak(false) > , m_allowSlash(false) > , m_allowWidth(false) >- , m_allowRule(false) >+ , m_allowRepeat(false) > , m_borderTop(0) > , m_borderRight(0) > , m_borderBottom(0) > , m_borderLeft(0) >- , m_horizontalRule(0) >- , m_verticalRule(0) > {} > > bool allowBreak() const { return m_allowBreak; } > bool allowSlash() const { return m_allowSlash; } > bool allowWidth() const { return m_allowWidth; } >- bool allowRule() const { return m_allowRule; } >+ bool allowRepeat() const { return m_allowRepeat; } > > void commitImage(PassRefPtr<CSSValue> image) { m_image = image; } > void commitSlice(PassRefPtr<CSSBorderImageSliceValue> slice) > { > m_slice = slice; >- m_allowBreak = m_allowSlash = m_allowRule = true; >+ m_allowBreak = m_allowSlash = m_allowRepeat = true; > } >- void commitSlash() { m_allowBreak = m_allowSlash = false; m_allowWidth = true; } >+ void commitSlash() { m_allowBreak = m_allowSlash = m_allowRepeat = false; m_allowWidth = true; } > void commitWidth(CSSParserValue* val) > { > if (!m_borderTop) >@@ -5163,26 +5170,22 @@ struct BorderImageParseContext { > m_borderLeft = val; > } > >- m_allowBreak = m_allowRule = true; >+ m_allowBreak = m_allowRepeat = true; > m_allowWidth = !m_borderLeft; > } >- void commitRule(int keyword) >+ void commitRepeat(PassRefPtr<CSSValue> repeat) > { >- if (!m_horizontalRule) >- m_horizontalRule = keyword; >- else if (!m_verticalRule) >- m_verticalRule = keyword; >- m_allowRule = !m_verticalRule; >+ m_repeat = repeat; >+ m_allowRepeat = m_allowSlash = m_allowWidth = false; >+ m_allowBreak = true; > } >+ > PassRefPtr<CSSValue> commitBorderImage(CSSParser* p, bool important) > { >- // Fill in STRETCH as the default if it wasn't specified. >- if (!m_horizontalRule) >- m_horizontalRule = CSSValueStretch; >- >- // The vertical rule should match the horizontal rule if unspecified. >- if (!m_verticalRule) >- m_verticalRule = m_horizontalRule; >+ if (!m_repeat) { >+ // Fill in STRETCH as the initial value if no repeat value was specified. >+ m_repeat = m_primitiveValueCache->createValue(Pair::create(m_primitiveValueCache->createIdentifierValue(CSSValueStretch), m_primitiveValueCache->createIdentifierValue(CSSValueStretch))); >+ } > > // Now we have to deal with the border widths. The best way to deal with these is to actually put these values into a value > // list and then make our parsing machinery do the parsing. >@@ -5202,7 +5205,7 @@ struct BorderImageParseContext { > } > > // Make our new border image value now. >- return CSSBorderImageValue::create(m_image, m_slice, m_horizontalRule, m_verticalRule); >+ return CSSBorderImageValue::create(m_image, m_slice, m_repeat); > } > > CSSPrimitiveValueCache* m_primitiveValueCache; >@@ -5210,7 +5213,7 @@ struct BorderImageParseContext { > bool m_allowBreak; > bool m_allowSlash; > bool m_allowWidth; >- bool m_allowRule; >+ bool m_allowRepeat; > > RefPtr<CSSValue> m_image; > RefPtr<CSSBorderImageSliceValue> m_slice; >@@ -5219,9 +5222,8 @@ struct BorderImageParseContext { > CSSParserValue* m_borderRight; > CSSParserValue* m_borderBottom; > CSSParserValue* m_borderLeft; >- >- int m_horizontalRule; >- int m_verticalRule; >+ >+ RefPtr<CSSValue> m_repeat; > }; > > bool CSSParser::parseBorderImage(int propId, bool important, RefPtr<CSSValue>& result) >@@ -5257,9 +5259,10 @@ bool CSSParser::parseBorderImage(int pro > } else if (context.allowWidth() && > (val->id == CSSValueThin || val->id == CSSValueMedium || val->id == CSSValueThick || validUnit(val, FLength, m_strict))) { > context.commitWidth(val); >- } else if (context.allowRule() && >- (val->id == CSSValueStretch || val->id == CSSValueRound || val->id == CSSValueRepeat)) { >- context.commitRule(val->id); >+ } else if (context.allowRepeat()) { >+ RefPtr<CSSValue> repeat; >+ if (parseBorderImageRepeat(repeat)) >+ context.commitRepeat(repeat); > } else { > // Something invalid was encountered. > return false; >@@ -5357,6 +5360,34 @@ private: > bool m_fill; > }; > >+static bool isBorderImageRepeatKeyword(int id) >+{ >+ return id == CSSValueStretch || id == CSSValueRepeat || id == CSSValueSpace || id == CSSValueRound; >+} >+ >+bool CSSParser::parseBorderImageRepeat(RefPtr<CSSValue>& result) >+{ >+ RefPtr<CSSPrimitiveValue> firstValue; >+ RefPtr<CSSPrimitiveValue> secondValue; >+ CSSParserValue* val = m_valueList->current(); >+ if (isBorderImageRepeatKeyword(val->id)) >+ firstValue = primitiveValueCache()->createIdentifierValue(val->id); >+ else >+ return false; >+ >+ val = m_valueList->next(); >+ if (val) { >+ if (isBorderImageRepeatKeyword(val->id)) >+ secondValue = primitiveValueCache()->createIdentifierValue(val->id); >+ else >+ return false; >+ } else >+ secondValue = firstValue; >+ >+ result = primitiveValueCache()->createValue(Pair::create(firstValue, secondValue)); >+ return true; >+} >+ > bool CSSParser::parseBorderImageSlice(int propId, RefPtr<CSSBorderImageSliceValue>& result) > { > BorderImageSliceParseContext context(primitiveValueCache()); >Index: Source/WebCore/css/CSSParser.h >=================================================================== >--- Source/WebCore/css/CSSParser.h (revision 94299) >+++ Source/WebCore/css/CSSParser.h (working copy) >@@ -167,6 +167,7 @@ public: > // CSS3 Parsing Routines (for properties specific to CSS3) > bool parseShadow(int propId, bool important); > bool parseBorderImage(int propId, bool important, RefPtr<CSSValue>&); >+ bool parseBorderImageRepeat(RefPtr<CSSValue>&); > bool parseBorderImageSlice(int propId, RefPtr<CSSBorderImageSliceValue>&); > bool parseBorderRadius(int propId, bool important); > >Index: Source/WebCore/css/CSSPropertyNames.in >=================================================================== >--- Source/WebCore/css/CSSPropertyNames.in (revision 94299) >+++ Source/WebCore/css/CSSPropertyNames.in (working copy) >@@ -58,6 +58,7 @@ border-bottom-style > border-bottom-width > border-collapse > border-color >+border-image-repeat > border-image-slice > border-image-source > border-left >@@ -280,6 +281,7 @@ z-index > -webkit-mask > -webkit-mask-attachment > -webkit-mask-box-image >+-webkit-mask-box-image-repeat > -webkit-mask-box-image-slice > -webkit-mask-box-image-source > -webkit-mask-clip >Index: Source/WebCore/css/CSSStyleSelector.cpp >=================================================================== >--- Source/WebCore/css/CSSStyleSelector.cpp (revision 94299) >+++ Source/WebCore/css/CSSStyleSelector.cpp (working copy) >@@ -4328,6 +4328,24 @@ void CSSStyleSelector::applyProperty(int > m_style->setMaskBoxImage(image); > return; > } >+ case CSSPropertyBorderImageRepeat: >+ case CSSPropertyWebkitMaskBoxImageRepeat: { >+ bool isBorderImage = id == CSSPropertyBorderImageRepeat; >+ NinePieceImage image(isBorderImage ? m_style->borderImage() : m_style->maskBoxImage()); >+ if (isInherit) >+ image.copyRepeatFrom(isBorderImage ? m_parentStyle->borderImage() : m_parentStyle->maskBoxImage()); >+ else if (isInitial) { >+ image.setHorizontalRule(StretchImageRule); >+ image.setVerticalRule(StretchImageRule); >+ } else >+ mapNinePieceImageRepeat(value, image); >+ >+ if (isBorderImage) >+ m_style->setBorderImage(image); >+ else >+ m_style->setMaskBoxImage(image); >+ return; >+ } > case CSSPropertyBorderImageSlice: > case CSSPropertyWebkitMaskBoxImageSlice: { > bool isBorderImage = id == CSSPropertyBorderImageSlice; >@@ -5692,33 +5710,7 @@ void CSSStyleSelector::mapNinePieceImage > mapNinePieceImageSlice(borderImage->m_slice.get(), image); > > // Set the appropriate rules for stretch/round/repeat of the slices >- ENinePieceImageRule horizontalRule; >- switch (borderImage->m_horizontalSizeRule) { >- case CSSValueStretch: >- horizontalRule = StretchImageRule; >- break; >- case CSSValueRound: >- horizontalRule = RoundImageRule; >- break; >- default: // CSSValueRepeat >- horizontalRule = RepeatImageRule; >- break; >- } >- image.setHorizontalRule(horizontalRule); >- >- ENinePieceImageRule verticalRule; >- switch (borderImage->m_verticalSizeRule) { >- case CSSValueStretch: >- verticalRule = StretchImageRule; >- break; >- case CSSValueRound: >- verticalRule = RoundImageRule; >- break; >- default: // CSSValueRepeat >- verticalRule = RepeatImageRule; >- break; >- } >- image.setVerticalRule(verticalRule); >+ mapNinePieceImageRepeat(borderImage->m_repeat.get(), image); > } > > void CSSStyleSelector::mapNinePieceImageSlice(CSSValue* value, NinePieceImage& image) >@@ -5754,6 +5746,54 @@ void CSSStyleSelector::mapNinePieceImage > image.setFill(borderImageSlice->m_fill); > } > >+void CSSStyleSelector::mapNinePieceImageRepeat(CSSValue* value, NinePieceImage& image) >+{ >+ if (!value || !value->isPrimitiveValue()) >+ return; >+ >+ CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value); >+ Pair* pair = primitiveValue->getPairValue(); >+ if (!pair || !pair->first() || !pair->second()) >+ return; >+ >+ int firstIdentifier = pair->first()->getIdent(); >+ int secondIdentifier = pair->second()->getIdent(); >+ >+ ENinePieceImageRule horizontalRule; >+ switch (firstIdentifier) { >+ case CSSValueStretch: >+ horizontalRule = StretchImageRule; >+ break; >+ case CSSValueRound: >+ horizontalRule = RoundImageRule; >+ break; >+ case CSSValueSpace: >+ horizontalRule = SpaceImageRule; >+ break; >+ default: // CSSValueRepeat >+ horizontalRule = RepeatImageRule; >+ break; >+ } >+ image.setHorizontalRule(horizontalRule); >+ >+ ENinePieceImageRule verticalRule; >+ switch (secondIdentifier) { >+ case CSSValueStretch: >+ verticalRule = StretchImageRule; >+ break; >+ case CSSValueRound: >+ verticalRule = RoundImageRule; >+ break; >+ case CSSValueSpace: >+ verticalRule = SpaceImageRule; >+ break; >+ default: // CSSValueRepeat >+ verticalRule = RepeatImageRule; >+ break; >+ } >+ image.setVerticalRule(verticalRule); >+} >+ > void CSSStyleSelector::checkForTextSizeAdjust() > { > if (m_style->textSizeAdjust()) >Index: Source/WebCore/css/CSSStyleSelector.h >=================================================================== >--- Source/WebCore/css/CSSStyleSelector.h (revision 94299) >+++ Source/WebCore/css/CSSStyleSelector.h (working copy) >@@ -331,7 +331,8 @@ public: > > void mapNinePieceImage(CSSPropertyID, CSSValue*, NinePieceImage&); > void mapNinePieceImageSlice(CSSValue*, NinePieceImage&); >- >+ void mapNinePieceImageRepeat(CSSValue*, NinePieceImage&); >+ > bool canShareStyleWithControl(StyledElement*) const; > > void applyProperty(int id, CSSValue*); >Index: Source/WebCore/platform/graphics/Image.cpp >=================================================================== >--- Source/WebCore/platform/graphics/Image.cpp (revision 94266) >+++ Source/WebCore/platform/graphics/Image.cpp (working copy) >@@ -158,10 +158,10 @@ void Image::drawTiled(GraphicsContext* c > return; > } > >- // FIXME: We do not support 'round' yet. For now just map it to 'repeat'. >- if (hRule == RoundTile) >+ // FIXME: We do not support 'round' or 'space' yet. For now just map them to 'repeat'. >+ if (hRule == RoundTile || hRule == SpaceTile) > hRule = RepeatTile; >- if (vRule == RoundTile) >+ if (vRule == RoundTile || vRule == SpaceTile) > vRule = RepeatTile; > > FloatSize scale = calculatePatternScale(dstRect, srcRect, hRule, vRule); >Index: Source/WebCore/platform/graphics/Image.h >=================================================================== >--- Source/WebCore/platform/graphics/Image.h (revision 94266) >+++ Source/WebCore/platform/graphics/Image.h (working copy) >@@ -128,7 +128,7 @@ public: > // Typically the CachedImage that owns us. > ImageObserver* imageObserver() const { return m_imageObserver; } > >- enum TileRule { StretchTile, RoundTile, RepeatTile }; >+ enum TileRule { StretchTile, RoundTile, SpaceTile, RepeatTile }; > > virtual NativeImagePtr nativeImageForCurrentFrame() { return 0; } > >Index: Source/WebCore/rendering/style/NinePieceImage.h >=================================================================== >--- Source/WebCore/rendering/style/NinePieceImage.h (revision 94299) >+++ Source/WebCore/rendering/style/NinePieceImage.h (working copy) >@@ -30,7 +30,7 @@ > namespace WebCore { > > enum ENinePieceImageRule { >- StretchImageRule, RoundImageRule, RepeatImageRule >+ StretchImageRule, RoundImageRule, SpaceImageRule, RepeatImageRule > }; > > class NinePieceImage { >@@ -78,6 +78,12 @@ public: > m_fill = other.m_fill; > } > >+ void copyRepeatFrom(const NinePieceImage& other) >+ { >+ m_horizontalRule = other.m_horizontalRule; >+ m_verticalRule = other.m_verticalRule; >+ } >+ > private: > RefPtr<StyleImage> m_image; > LengthBox m_slices; >Index: LayoutTests/ChangeLog >=================================================================== >--- LayoutTests/ChangeLog (revision 94338) >+++ LayoutTests/ChangeLog (working copy) >@@ -1,3 +1,24 @@ >+2011-09-01 David Hyatt <hyatt@apple.com> >+ >+ https://bugs.webkit.org/show_bug.cgi?id=67431 >+ >+ Implement border-image-repeat. Similar to how border-image-slice was implemented, the parsing of the two >+ repeat values has been moved into separate functions. The value is represented as a Pair (similar to how we >+ handle border radius). >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added fast/borders/border-image-repeat.html. >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * fast/borders/border-image-repeat.html: Added. >+ * fast/css/getComputedStyle/computed-style-expected.txt: >+ * fast/css/getComputedStyle/computed-style-without-renderer-expected.txt: >+ * platform/mac/fast/borders/border-image-repeat-expected.png: Added. >+ * platform/mac/fast/borders/border-image-repeat-expected.txt: Added. >+ * svg/css/getComputedStyle-basic-expected.txt: >+ > 2011-09-01 Tim Horton <timothy_horton@apple.com> > > REGRESSION: Rendering artifacts on a rotated, pattern filled SVG shape >Index: LayoutTests/fast/borders/border-image-repeat.html >=================================================================== >--- LayoutTests/fast/borders/border-image-repeat.html (revision 0) >+++ LayoutTests/fast/borders/border-image-repeat.html (revision 0) >@@ -0,0 +1,40 @@ >+<html> >+<head> >+ <style> >+ div { >+ border-width: 21px 30px 30px 21px; >+ width: 75px; >+ height: 75px; >+ margin: 10px; >+ display: inline-block; >+ } >+ >+ div.rr { >+ -webkit-border-image: url("resources/border-image.png") 21 30 30 21; >+ border-image-repeat: repeat repeat; >+ } >+ >+ div.rs { >+ -webkit-border-image: url("resources/border-image.png") 21 30 30 21; >+ border-image-repeat: repeat stretch; >+ } >+ >+ div.sr { >+ -webkit-border-image: url("resources/border-image.png") 21 30 30 21; >+ border-image-repeat: stretch repeat; >+ } >+ >+ div.ss { >+ -webkit-border-image: url("resources/border-image.png") 21 30 30 21 repeat repeat; >+ border-image-repeat: initial >+ } >+ </style> >+</head> >+<body> >+ <div class="rr"></div> >+ <div class="rs"></div> >+ <br> >+ <div class="sr"></div> >+ <div class="ss"></div> >+</body> >+</html> >Index: LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt >=================================================================== >--- LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt (revision 94299) >+++ LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt (working copy) >@@ -14,6 +14,7 @@ border-bottom-right-radius: 0px; > border-bottom-style: none; > border-bottom-width: 0px; > border-collapse: separate; >+border-image-repeat: stretch stretch; > border-image-slice: 100%; > border-image-source: none; > border-left-color: rgb(0, 0, 0); >@@ -156,6 +157,7 @@ zoom: 1; > -webkit-marquee-style: scroll; > -webkit-mask-attachment: scroll; > -webkit-mask-box-image: none; >+-webkit-mask-box-image-repeat: stretch stretch; > -webkit-mask-box-image-slice: 100%; > -webkit-mask-box-image-source: none; > -webkit-mask-clip: border-box; >Index: LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt >=================================================================== >--- LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt (revision 94299) >+++ LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt (working copy) >@@ -13,6 +13,7 @@ Computed style of an element whose paren > border-bottom-style: none > border-bottom-width: 0px > border-collapse: separate >+ border-image-repeat: stretch stretch > border-image-slice: 100% > border-image-source: none > border-left-color: rgb(0, 0, 0) >@@ -155,6 +156,7 @@ Computed style of an element whose paren > -webkit-marquee-style: scroll > -webkit-mask-attachment: scroll > -webkit-mask-box-image: none >+ -webkit-mask-box-image-repeat: stretch stretch > -webkit-mask-box-image-slice: 100% > -webkit-mask-box-image-source: none > -webkit-mask-clip: border-box >Index: LayoutTests/platform/mac/fast/borders/border-image-repeat-expected.txt >=================================================================== >--- LayoutTests/platform/mac/fast/borders/border-image-repeat-expected.txt (revision 0) >+++ LayoutTests/platform/mac/fast/borders/border-image-repeat-expected.txt (revision 0) >@@ -0,0 +1,17 @@ >+layer at (0,0) size 800x600 >+ RenderView at (0,0) size 800x600 >+layer at (0,0) size 800x600 >+ RenderBlock {HTML} at (0,0) size 800x600 >+ RenderBody {BODY} at (8,8) size 784x584 >+ RenderBlock {DIV} at (10,10) size 126x126 [border: (21px none #000000) (30px none #000000) (21px none #000000)] >+ RenderText {#text} at (146,132) size 4x18 >+ text run at (146,132) width 4: " " >+ RenderBlock {DIV} at (160,10) size 126x126 [border: (21px none #000000) (30px none #000000) (21px none #000000)] >+ RenderText {#text} at (296,132) size 4x18 >+ text run at (296,132) width 4: " " >+ RenderBR {BR} at (0,0) size 0x0 >+ RenderBlock {DIV} at (10,160) size 126x126 [border: (21px none #000000) (30px none #000000) (21px none #000000)] >+ RenderText {#text} at (146,282) size 4x18 >+ text run at (146,282) width 4: " " >+ RenderBlock {DIV} at (160,160) size 126x126 [border: (21px none #000000) (30px none #000000) (21px none #000000)] >+ RenderText {#text} at (0,0) size 0x0 >Index: LayoutTests/svg/css/getComputedStyle-basic-expected.txt >=================================================================== >--- LayoutTests/svg/css/getComputedStyle-basic-expected.txt (revision 94299) >+++ LayoutTests/svg/css/getComputedStyle-basic-expected.txt (working copy) >@@ -26,6 +26,8 @@ rect: style.getPropertyValue(border-bott > rect: style.getPropertyCSSValue(border-bottom-width) : [object CSSPrimitiveValue] > rect: style.getPropertyValue(border-collapse) : separate > rect: style.getPropertyCSSValue(border-collapse) : [object CSSPrimitiveValue] >+rect: style.getPropertyValue(border-image-repeat) : stretch stretch >+rect: style.getPropertyCSSValue(border-image-repeat) : [object CSSPrimitiveValue] > rect: style.getPropertyValue(border-image-slice) : 100% > rect: style.getPropertyCSSValue(border-image-slice) : [object CSSValue] > rect: style.getPropertyValue(border-image-source) : none >@@ -310,6 +312,8 @@ rect: style.getPropertyValue(-webkit-mas > rect: style.getPropertyCSSValue(-webkit-mask-attachment) : [object CSSPrimitiveValue] > rect: style.getPropertyValue(-webkit-mask-box-image) : none > rect: style.getPropertyCSSValue(-webkit-mask-box-image) : [object CSSPrimitiveValue] >+rect: style.getPropertyValue(-webkit-mask-box-image-repeat) : stretch stretch >+rect: style.getPropertyCSSValue(-webkit-mask-box-image-repeat) : [object CSSPrimitiveValue] > rect: style.getPropertyValue(-webkit-mask-box-image-slice) : 100% > rect: style.getPropertyCSSValue(-webkit-mask-box-image-slice) : [object CSSValue] > rect: style.getPropertyValue(-webkit-mask-box-image-source) : none >@@ -492,6 +496,8 @@ g: style.getPropertyValue(border-bottom- > g: style.getPropertyCSSValue(border-bottom-width) : [object CSSPrimitiveValue] > g: style.getPropertyValue(border-collapse) : separate > g: style.getPropertyCSSValue(border-collapse) : [object CSSPrimitiveValue] >+g: style.getPropertyValue(border-image-repeat) : stretch stretch >+g: style.getPropertyCSSValue(border-image-repeat) : [object CSSPrimitiveValue] > g: style.getPropertyValue(border-image-slice) : 100% > g: style.getPropertyCSSValue(border-image-slice) : [object CSSValue] > g: style.getPropertyValue(border-image-source) : none >@@ -776,6 +782,8 @@ g: style.getPropertyValue(-webkit-mask-a > g: style.getPropertyCSSValue(-webkit-mask-attachment) : [object CSSPrimitiveValue] > g: style.getPropertyValue(-webkit-mask-box-image) : none > g: style.getPropertyCSSValue(-webkit-mask-box-image) : [object CSSPrimitiveValue] >+g: style.getPropertyValue(-webkit-mask-box-image-repeat) : stretch stretch >+g: style.getPropertyCSSValue(-webkit-mask-box-image-repeat) : [object CSSPrimitiveValue] > g: style.getPropertyValue(-webkit-mask-box-image-slice) : 100% > g: style.getPropertyCSSValue(-webkit-mask-box-image-slice) : [object CSSValue] > g: style.getPropertyValue(-webkit-mask-box-image-source) : none >Index: LayoutTests/platform/mac/fast/borders/border-image-repeat-expected.png >=================================================================== >Cannot display: file marked as a binary type. >svn:mime-type = application/octet-stream > >Property changes on: LayoutTests/platform/mac/fast/borders/border-image-repeat-expected.png >___________________________________________________________________ >Added: svn:mime-type > + application/octet-stream > > >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 >S9WZRSNlmqTbb5ZCb8Ro1eO8G/aWdbV36+je9+XyriHpaL+83D3P3bXnnOe6V9iSCvvG8hkzk2qc >X+/lM5MVap4Vl8sLLg2+pxf+/ifqzDkYVTMv1Mc+eZWa69LqJ/e8ZMer/azj5ZW5/uNqzh6wAtix >kT5Dv5r+o1FC/Wr6MWkBAggggAAC5ScQ+rn/vh9J6z4/DuQa6dBLUrN9NVKmRWq3AGTWOMWjWZSy >zVq0oZTO/NsR/evfvazDb76r356Snt8nL/db7/xLFqrl0x+Ty1csrNJnr67zcr/biaR8zxE9sm6d >Ws/ZeIu2vfWK7llRZ8fiq3a8zi0hrdGLh36kG5pD7yLntGYyC0b6zNjC9KuxItF/LqF+FT0WNSCA >AAIIIIDAWIHQf7ZPJNNVrNliAcchGw35y0yVdo77rI2MuJQto9n5Hv1I1+/+xiptlKZWStanc/fZ >paWXN+v/eWSttuz4nL7Tep9+8ca9OvTWRv3yn27T//l/V+rr6+frvt9v0sXzE175o8f69M+tR/XU >0+9qh+V77fNJ+6bDXoNeiWn8Y01c5FW/Rs+07Vfbi09YWOFSm/76h7u9d4lkpsSW7Tp0bL9+um2L >LC601KqvPtvmvSuEP9k+Q7+iXxVCf6QNCCCAAAIIIDB1gdADkGxT6ufZaIcNd9z8R8qc0EpzGrLf >Fm5elYyrcU695i1q0rzFc9X8oUVqXrFYH7psvj7xkaRuuly66mIbtbHgpXjSIl38oSW6/Ib1+k9r >062ur04HUNl9qJ93gZrnLtG19/y57k1HKVpUf3aZbNnpzOlX06k/tu7S6Vdj94zPCCCAAAIIIBCd >QGTX15w5Jr33nvR//6f7vd2SndRevyy6HQlry/19gzr1fqeOHTqliqoBvXusU/2WH3j7uF556aCX >H7ZLtt5rT9c4f15SLWvmj1yCtdw+5++Sssnu9SEd3H9AA7/8rh7d7tZp0fp/t3LMyulgo+PAT/RS >5oqsCxfbEFWBJfpVIR2Q0ulXhaRKWxBAAAEEECh1gcgCkNaH7fIfe2XTXpsb4uZ/FHrav+s9/e1/ >+4fzN3PpAukPr7DrtRZoxZKkvry6UastL9zUqrWXLR1p3ta2V3THsrNnmG9/7PO6/ekT2t6avuyq >5YFt+vMbCu+I0a9GDmMBvCmdflUAmDQBAQQQQACBshGILABp+WPpK78vPfMV6Sk7p11uP7D/1EZF >rp1b2LYLl8/Rx25ZKZc3ql9LdMbL39p7Rs/tOCiXa/8R6W93eDvy5gVz9YVVH1aj5R9eVqO7bpnn >5Q52hr0iA/bF2KKvb/sLaedj+uK3W3V/S72O7dirv7g5Z0iq7YT2pceqbMst+vaWewpwJMdaRr+i >X/nq+xRGAAEEEEAAgUITiOz8+KIrpdvusNftNvfDgo9v2p5/4+8sAPkvZxNM+0Tts5ujusYafeiK >JbrkY4u1sDamq+dXePlQZ6ce+tNDcvkrr5/Qf3/8t15+6uBxvfHsT7ytHPn4YjU2rda7Wqx51TG1 >zK7w8jFVTMPHFt3yH+7Q5ffcoY/NvkE3fq1VD3/xOd1/838bacvarU/rB/cldF9sub5tgciqB59V >z+N3jNw6eaTgNL+hX9GvprkLUj0CCCCAAAIIBBSIbBJ6brsWZiY15y7z3tsdqNwoQVEke/6H3MTt >GnsQhcvd5zGpbyCl46eHdPD9QS93nwsjdWggE+klsuBtL+gdd6uubOrrtnfL9NWffj295Nt36qEf >Hsh+W5A5/Wq6D0tp9qvpVqV+BBBAAAEESl0gshGQ7Y9Jf2RXKT3lTXpOM86fM4bTvrvbRkiy6cw+ >6T8/Jd1jd5qarnTIHk64/a92qtZGQqo1YJch9Xn5iVMDemtfh1w+UaqpqtDiprhWLKjSbJsS4j4X >RtqujQY9e992ZaZ42E0B7tLKOruabEwD5177OW1b/0Wts+PwzbUb9Qf2LJCbC+RZIK6p9Cv61Zgu >y0cEEEAAAQQQKDKB8AOQ7Fxsm/fh5n54yR4sseUL0gP3ZD5ny9jH7TkBivv29onP7zMrR5t1nerW >22+8e95KamfXa8FlF8jlS5Y2aPV1i7187swKrWxOyuWFltpGoO0OWA/8ib788L2y+MMehFKTburI >ManTPf/rRf31Uzfak0BadcsX/149T94z/ZdiZdtHvyqorlX0/aqgNGkMAggggAAC5SEQS1kKY1dj >sZjC2VK6NbY5296mMJpWktvYufOANm1qlctdCukw+rJKH/NQus+E9dKvJqSJ5Ity6VeR4LFRBBBA >AAEEEJiUQOH9VD+pZlMIAQQQQAABBBBAAAEEilGAAKQYjxptRgABBBBAAAEEEECgSAUIQIr0wNFs >BBBAAAEEEEAAAQSKUYAApBiPGm1GAAEEEEAAAQQQQKBIBQhAivTA0WwEEEAAAQQQQAABBIpRgACk >GI8abUYAAQQQQAABBBBAoEgFCECK9MDRbAQQQAABBBBAAAEEilGAAKQYjxptRgABBBBAAAEEEECg >SAVCexBhRUXFtDwMr0jdS6LZ7iGBw8PDke4L/SpS3oLceD76VUHuOI1CAAEEEECgTARCC0DKxIvd >RAABBBBAAAEEEEAAgQACXIIVAI9VEUAAAQQQQAABBBBAwJ8AAYg/L0ojgAACCCCAAAIIIIBAAAEC >kAB4rIoAAggggAACCCCAAAL+BAhA/HlRGgEEEEAAAQQQQAABBAIIEIAEwGNVBBBAAAEEEEAAAQQQ >8CdAAOLPi9IIIIAAAggggAACCCAQQIAAJAAeqyKAAAIIIIAAAggggIA/AQIQf16URgABBBBAAAEE >EEAAgQACBCAB8FgVAQQQQAABBBBAAAEE/AkQgPjzojQCCCCAAAIIIIAAAggEECAACYDHqggggAAC >CCCAAAIIIOBPgADEnxelEUAAAQQQQAABBBBAIIAAAUgAPFZFAAEEEEAAAQQQQAABfwIEIP68KI0A >AggggAACCCCAAAIBBAhAAuCxKgIIIIAAAggggAACCPgTIADx50VpBBBAAAEEEEAAAQQQCCBAABIA >j1URQAABBBBAAAEEEEDAnwABiD8vSiOAAAIIIIAAAggggEAAAQKQAHisigACCCCAAAIIIIAAAv4E >CED8eVEaAQQQQAABBBBAAAEEAggQgATAY1UEEEAAAQQQQAABBBDwJ0AA4s+L0ggggAACCCCAAAII >IBBAgAAkAB6rIoAAAggggAACCCCAgD8BAhB/XpRGAAEEEEAAAQQQQACBAAIEIAHwWBUBBBBAAAEE >EEAAAQT8CRCA+POiNAIIIIAAAggggAACCAQQIAAJgMeqCCCAAAIIIIAAAggg4E+AAMSfF6URQAAB >BBBAAAEEEEAggAABSAA8VkUAAQQQQAABBBBAAAF/AgQg/rwojQACCCCAAAIIIIAAAgEECEAC4LEq >AggggAACCCCAAAII+BMgAPHnRWkEEEAAAQQQQAABBBAIIEAAEgCPVRFAAAEEEEAAAQQQQMCfAAGI >Py9KI4AAAggggAACCCCAQAABApAAeKyKAAIIIIAAAggggAAC/gQIQPx5URoBBBBAAAEEEEAAAQQC >CBCABMBjVQQQQAABBBBAAAEEEPAnQADiz4vSCCCAAAIIIIAAAgggEECAACQAHqsigAACCCCAAAII >IICAPwECEH9elEYAAQQQQAABBBBAAIEAAgQgAfBYFQEEEEAAAQQQQAABBPwJEID486I0AggggAAC >CCCAAAIIBBAgAAmAx6oIIIAAAggggAACCCDgT4AAxJ8XpRFAAAEEEEAAAQQQQCCAAAFIADxWRQAB >BBBAAAEEEEAAAX8CBCD+vCiNAAIIIIAAAggggAACAQQIQALgsSoCCCCAAAIIIIAAAgj4EyAA8edF >aQQQQAABBBBAAAEEEAggQAASAI9VEUAAAQQQQAABBBBAwJ8AAYg/L0ojgAACCCCAAAIIIIBAAAEC >kAB4rIoAAggggAACCCCAAAL+BAhA/HlRGgEEEEAAAQQQQAABBAIIEIAEwGNVBBBAAAEEEEAAAQQQ >8CdAAOLPi9IIIIAAAggggAACCCAQQIAAJAAeqyKAAAIIIIAAAggggIA/AQIQf16URgABBBBAAAEE >EEAAgQACBCAB8FgVAQQQQAABBBBAAAEE/AkQgPjzojQCCCCAAAIIIIAAAggEECAACYDHqggggAAC >CCCAAAIIIOBPgADEnxelEUAAAQQQQAABBBBAIIAAAUgAPFZFAAEEEEAAAQQQQAABfwIEIP68KI0A >AggggAACCCCAAAIBBAhAAuCxKgIIIIAAAggggAACCPgTIADx50VpBBBAAAEEEEAAAQQQCCBAABIA >j1URQAABBBBAAAEEEEDAnwABiD8vSiOAAAIIIIAAAggggEAAAQKQAHisigACCCCAAAIIIIAAAv4E >CED8eVEaAQQQQAABBBBAAAEEAggQgATAY1UEEEAAAQQQQAABBBDwJ0AA4s+L0ggggAACCCCAAAII >IBBAgAAkAB6rIoAAAggggAACCCCAgD8BAhB/XpRGAAEEEEAAAQQQQACBAAIEIAHwWBUBBBBAAAEE >EEAAAQT8CRCA+POiNAIIIIAAAggggAACCAQQIAAJgMeqCCCAAAIIIIAAAggg4E+AAMSfF6URQAAB >BBBAAAEEEEAggAABSAA8VkUAAQQQQAABBBBAAAF/AgQg/rwojQACCCCAAAIIIIAAAgEECEAC4LEq >AggggAACCCCAAAII+BMgAPHnRWkEEEAAAQQQQAABBBAIIEAAEgCPVRFAAAEEEEAAAQQQQMCfAAGI >Py9KI4AAAggggAACCCCAQAABApAAeKyKAAIIIIAAAggggAAC/gQIQPx5URoBBBBAAAEEEEAAAQQC >CBCABMBjVQQQQAABBBBAAAEEEPAnQADiz4vSCCCAAAIIIIAAAgggEECAACQAHqsigAACCCCAAAII >IICAPwECEH9elEYAAQQQQAABBBBAAIEAAgQgAfBYFQEEEEAAAQQQQAABBPwJEID486I0AggggAAC >CCCAAAIIBBAgAAmAx6oIIIAAAggggAACCCDgT4AAxJ8XpRFAAAEEEEAAAQQQQCCAAAFIADxWRQAB >BBBAAAEEEEAAAX8CBCD+vCiNAAIIIIAAAggggAACAQQIQALgsSoCCCCAAAIIIIAAAgj4EyAA8edF >aQQQQAABBBBAAAEEEAggQAASAI9VEUAAAQQQQAABBBBAwJ8AAYg/L0ojgAACCCCAAAIIIIBAAAEC >kAB4rIoAAggggAACCCCAAAL+BAhA/HlRGgEEEEAAAQQQQAABBAIIEIAEwGNVBBBAAAEEEEAAAQQQ >8CdAAOLPi9IIIIAAAggggAACCCAQQIAAJAAeqyKAAAIIIIAAAggggIA/AQIQf16URgABBBBAAAEE >EEAAgQACBCAB8FgVAQQQQAABBBBAAAEE/AkQgPjzojQCCCCAAAIIIIAAAggEECAACYDHqggggAAC >CCCAAAIIIOBPgADEnxelEUAAAQQQQAABBBBAIIAAAUgAPFZFAAEEEEAAAQQQQAABfwIEIP68KI0A >AggggAACCCCAAAIBBAhAAuCxKgIIIIAAAggggAACCPgTIADx50VpBBBAAAEEEEAAAQQQCCBAABIA >j1URQAABBBBAAAEEEEDAnwABiD8vSiOAAAIIIIAAAggggEAAAQKQAHisigACCCCAAAIIIIAAAv4E >CED8eVEaAQQQQAABBBBAAAEEAggQgATAY1UEEEAAAQQQQAABBBDwJ0AA4s+L0ggggAACCCCAAAII >IBBAgAAkAB6rIoAAAggggAACCCCAgD8BAhB/XpRGAAEEEEAAAQQQQACBAAIEIAHwWBUBBBBAAAEE >EEAAAQT8CRCA+POiNAIIIIAAAggggAACCAQQIAAJgMeqCCCAAAIIIIAAAggg4E+AAMSfF6URQAAB >BBBAAAEEEEAggAABSAA8VkUAAQQQQAABBBBAAAF/AgQg/rwojQACCCCAAAIIIIAAAgEECEAC4LEq >AggggAACCCCAAAII+BMgAPHnRWkEEEAAAQQQQAABBBAIIEAAEgCPVRFAAAEEEEAAAQQQQMCfAAGI >Py9KI4AAAggggAACCCCAQAABApAAeKyKAAIIIIAAAggggAAC/gQIQPx5URoBBBBAAAEEEEAAAQQC >CBCABMBjVQQQQAABBBBAAAEEEPAnQADiz4vSCCCAAAIIIIAAAgggEECAACQAHqsigAACCCCAAAII >IICAPwECEH9elEYAAQQQQAABBBBAAIEAAgQgAfBYFQEEEEAAAQQQQAABBPwJEID486I0AggggAAC >CCCAAAIIBBAgAAmAx6oIIIAAAggggAACCCDgT4AAxJ8XpRFAAAEEEEAAAQQQQCCAAAFIADxWRQAB >BBBAAAEEEEAAAX8CBCD+vCiNAAIIIIAAAggggAACAQQIQALgsSoCCCCAAAIIIIAAAgj4EyAA8edF >aQQQQAABBBBAAAEEEAggQAASAI9VEUAAAQQQQAABBBBAwJ8AAYg/L0ojgAACCCCAAAIIIIDA/99+ >HdoAAAAgDPv/a24gs/Vg6hYEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxX >AgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQ >IECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA >4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjA >cyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECA >AAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAAB >AgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCA >BDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQEC >BAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQI >ECBA4BMQIJ+XNQECBAgQIECAAAECQUCABFkK/LQAAAi0SURBVDxXAgQIECBAgAABAgQ+AQHyeVkT >IECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBA >gAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAEC >QUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+X >NQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAAB >AgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQ >IBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHy >eVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQI >ECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECA >AAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQ >IJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVA >gAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAEC >BAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+ >AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxX >AgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQ >IECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA >4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjA >cyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECA >AAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAAB >AgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCA >BDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQEC >BAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQI >ECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAE >BEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkT >IECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBA >gAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAEC >QUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+X >NQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAAB >AgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQ >IBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHy >eVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQI >ECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECA >AAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQ >IJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVA >gAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAEC >BAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+ >AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQIECAAAECQUCABDxX >AgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA4BMQIJ+XNQECBAgQ >IECAAAECQUCABDxXAgQIECBAgAABAgQ+AQHyeVkTIECAAAECBAgQIBAEBEjAcyVAgAABAgQIECBA >4BMQIJ+XNQECBAgQIECAAAECQUCABDxXAgQIECBAgAABAgQ+gQFZxezwKEtOpQAAAABJRU5ErkJg >gg== >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 67431
:
106019
|
106023
|
106024