| Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
 | 
| diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
 | 
| index 4eea12475e641bce52e6482f6efa3b73d6060b7e..57c1f5ef584658e7df061c62cd080281ecfb36e2 100644
 | 
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
 | 
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
 | 
| @@ -862,8 +862,12 @@ void CanvasRenderingContext2D::setTransform(float m11, float m12, float m21, flo
 | 
|      transform(m11, m12, m21, m22, dx, dy);
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::setStrokeColor(const String& color)
 | 
| +void CanvasRenderingContext2D::setStrokeColor(const String& color, Optional<float> alpha)
 | 
|  {
 | 
| +    if (!alpha.isMissing()) {
 | 
| +        setStrokeStyle(CanvasStyle::createFromStringWithOverrideAlpha(color, alpha));
 | 
| +        return;
 | 
| +    }
 | 
|      if (color == state().m_unparsedStrokeColor)
 | 
|          return;
 | 
|      realizeSaves();
 | 
| @@ -871,18 +875,6 @@ void CanvasRenderingContext2D::setStrokeColor(const String& color)
 | 
|      modifiableState().m_unparsedStrokeColor = color;
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::setStrokeColor(float grayLevel)
 | 
| -{
 | 
| -    if (state().m_strokeStyle && state().m_strokeStyle->isEquivalentRGBA(grayLevel, grayLevel, grayLevel, 1.0f))
 | 
| -        return;
 | 
| -    setStrokeStyle(CanvasStyle::createFromGrayLevelWithAlpha(grayLevel, 1.0f));
 | 
| -}
 | 
| -
 | 
| -void CanvasRenderingContext2D::setStrokeColor(const String& color, float alpha)
 | 
| -{
 | 
| -    setStrokeStyle(CanvasStyle::createFromStringWithOverrideAlpha(color, alpha));
 | 
| -}
 | 
| -
 | 
|  void CanvasRenderingContext2D::setStrokeColor(float grayLevel, float alpha)
 | 
|  {
 | 
|      if (state().m_strokeStyle && state().m_strokeStyle->isEquivalentRGBA(grayLevel, grayLevel, grayLevel, alpha))
 | 
| @@ -904,8 +896,12 @@ void CanvasRenderingContext2D::setStrokeColor(float c, float m, float y, float k
 | 
|      setStrokeStyle(CanvasStyle::createFromCMYKAChannels(c, m, y, k, a));
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::setFillColor(const String& color)
 | 
| +void CanvasRenderingContext2D::setFillColor(const String& color, Optional<float> alpha)
 | 
|  {
 | 
| +    if (!alpha.isMissing()) {
 | 
| +        setFillStyle(CanvasStyle::createFromStringWithOverrideAlpha(color, alpha));
 | 
| +        return;
 | 
| +    }
 | 
|      if (color == state().m_unparsedFillColor)
 | 
|          return;
 | 
|      realizeSaves();
 | 
| @@ -913,18 +909,6 @@ void CanvasRenderingContext2D::setFillColor(const String& color)
 | 
|      modifiableState().m_unparsedFillColor = color;
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::setFillColor(float grayLevel)
 | 
| -{
 | 
| -    if (state().m_fillStyle && state().m_fillStyle->isEquivalentRGBA(grayLevel, grayLevel, grayLevel, 1.0f))
 | 
| -        return;
 | 
| -    setFillStyle(CanvasStyle::createFromGrayLevelWithAlpha(grayLevel, 1.0f));
 | 
| -}
 | 
| -
 | 
| -void CanvasRenderingContext2D::setFillColor(const String& color, float alpha)
 | 
| -{
 | 
| -    setFillStyle(CanvasStyle::createFromStringWithOverrideAlpha(color, alpha));
 | 
| -}
 | 
| -
 | 
|  void CanvasRenderingContext2D::setFillColor(float grayLevel, float alpha)
 | 
|  {
 | 
|      if (state().m_fillStyle && state().m_fillStyle->isEquivalentRGBA(grayLevel, grayLevel, grayLevel, alpha))
 | 
| @@ -1180,14 +1164,9 @@ bool CanvasRenderingContext2D::isPointInStrokeInternal(const Path& path, const f
 | 
|      return path.strokeContains(transformedPoint, strokeData);
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::scrollPathIntoView()
 | 
| -{
 | 
| -    scrollPathIntoViewInternal(m_path);
 | 
| -}
 | 
| -
 | 
|  void CanvasRenderingContext2D::scrollPathIntoView(Path2D* path2d)
 | 
|  {
 | 
| -    scrollPathIntoViewInternal(path2d->path());
 | 
| +    scrollPathIntoViewInternal(path2d ? path2d->path() : m_path);
 | 
|  }
 | 
|  
 | 
|  void CanvasRenderingContext2D::scrollPathIntoViewInternal(const Path& path)
 | 
| @@ -1344,32 +1323,18 @@ void CanvasRenderingContext2D::strokeRect(float x, float y, float width, float h
 | 
|      }
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::setShadow(float width, float height, float blur)
 | 
| -{
 | 
| -    setShadow(FloatSize(width, height), blur, Color::transparent);
 | 
| -}
 | 
| -
 | 
| -void CanvasRenderingContext2D::setShadow(float width, float height, float blur, const String& color)
 | 
| +void CanvasRenderingContext2D::setShadow(float width, float height, float blur, const Optional<String>& color, Optional<float> alpha)
 | 
|  {
 | 
|      RGBA32 rgba;
 | 
| -    if (!parseColorOrCurrentColor(rgba, color, canvas()))
 | 
| +    if (color.isMissing())
 | 
| +        rgba = Color::transparent;
 | 
| +    else if (!parseColorOrCurrentColor(rgba, color, canvas()))
 | 
|          return;
 | 
| +    if (!alpha.isMissing())
 | 
| +        rgba = colorWithOverrideAlpha(rgba, alpha);
 | 
|      setShadow(FloatSize(width, height), blur, rgba);
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::setShadow(float width, float height, float blur, float grayLevel)
 | 
| -{
 | 
| -    setShadow(FloatSize(width, height), blur, makeRGBA32FromFloats(grayLevel, grayLevel, grayLevel, 1));
 | 
| -}
 | 
| -
 | 
| -void CanvasRenderingContext2D::setShadow(float width, float height, float blur, const String& color, float alpha)
 | 
| -{
 | 
| -    RGBA32 rgba;
 | 
| -    if (!parseColorOrCurrentColor(rgba, color, canvas()))
 | 
| -        return;
 | 
| -    setShadow(FloatSize(width, height), blur, colorWithOverrideAlpha(rgba, alpha));
 | 
| -}
 | 
| -
 | 
|  void CanvasRenderingContext2D::setShadow(float width, float height, float blur, float grayLevel, float alpha)
 | 
|  {
 | 
|      setShadow(FloatSize(width, height), blur, makeRGBA32FromFloats(grayLevel, grayLevel, grayLevel, alpha));
 | 
| @@ -2016,24 +1981,14 @@ void CanvasRenderingContext2D::setTextBaseline(const String& s)
 | 
|      modifiableState().m_textBaseline = baseline;
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::fillText(const String& text, float x, float y)
 | 
| -{
 | 
| -    drawTextInternal(text, x, y, true);
 | 
| -}
 | 
| -
 | 
| -void CanvasRenderingContext2D::fillText(const String& text, float x, float y, float maxWidth)
 | 
| -{
 | 
| -    drawTextInternal(text, x, y, true, maxWidth, true);
 | 
| -}
 | 
| -
 | 
| -void CanvasRenderingContext2D::strokeText(const String& text, float x, float y)
 | 
| +void CanvasRenderingContext2D::fillText(const String& text, float x, float y, Optional<float> maxWidth)
 | 
|  {
 | 
| -    drawTextInternal(text, x, y, false);
 | 
| +    drawTextInternal(text, x, y, true, maxWidth.get(), !maxWidth.isMissing());
 | 
|  }
 | 
|  
 | 
| -void CanvasRenderingContext2D::strokeText(const String& text, float x, float y, float maxWidth)
 | 
| +void CanvasRenderingContext2D::strokeText(const String& text, float x, float y, Optional<float> maxWidth)
 | 
|  {
 | 
| -    drawTextInternal(text, x, y, false, maxWidth, true);
 | 
| +    drawTextInternal(text, x, y, false, maxWidth.get(), !maxWidth.isMissing());
 | 
|  }
 | 
|  
 | 
|  static inline bool isSpaceCharacter(UChar c)
 | 
| 
 |