Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
2010-04-20 Yaar Schnitman <yaar@chromium.org>
        Reviewed by Nate Chapin.

        Null value should be legit value for wrapped types. This requires some cleanup in canvas which was missing built-in null argument checks;
        https://bugs.webkit.org/show_bug.cgi?id=37810

        * bindings/js/JSCanvasRenderingContext2DCustom.cpp:
        (WebCore::JSCanvasRenderingContext2D::drawImage): Passes ec to drawImage(3) too
        * bindings/scripts/CodeGeneratorV8.pm: A null value is now legit value for wrapped types.
        * bindings/v8/test/V8TestObj.cpp:
        (WebCore::TestObjInternal::overloadedMethodCallback):
        * html/canvas/CanvasRenderingContext2D.cpp:
        (WebCore::CanvasRenderingContext2D::drawImage): Added null checks.
        (WebCore::CanvasRenderingContext2D::createPattern): Added null checks.
        * html/canvas/CanvasRenderingContext2D.h: Added needed raises "DOMException".
        * html/canvas/CanvasRenderingContext2D.idl: Added needed raises "DOMException".

Canonical link: https://commits.webkit.org/49170@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@57889 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
eseidel committed Apr 20, 2010
1 parent 18520d7 commit 8d07016
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 27 deletions.
18 changes: 18 additions & 0 deletions WebCore/ChangeLog
@@ -1,3 +1,21 @@
2010-04-20 Yaar Schnitman <yaar@chromium.org>

Reviewed by Nate Chapin.

Null value should be legit value for wrapped types. This requires some cleanup in canvas which was missing built-in null argument checks;
https://bugs.webkit.org/show_bug.cgi?id=37810

* bindings/js/JSCanvasRenderingContext2DCustom.cpp:
(WebCore::JSCanvasRenderingContext2D::drawImage): Passes ec to drawImage(3) too
* bindings/scripts/CodeGeneratorV8.pm: A null value is now legit value for wrapped types.
* bindings/v8/test/V8TestObj.cpp:
(WebCore::TestObjInternal::overloadedMethodCallback):
* html/canvas/CanvasRenderingContext2D.cpp:
(WebCore::CanvasRenderingContext2D::drawImage): Added null checks.
(WebCore::CanvasRenderingContext2D::createPattern): Added null checks.
* html/canvas/CanvasRenderingContext2D.h: Added needed raises "DOMException".
* html/canvas/CanvasRenderingContext2D.idl: Added needed raises "DOMException".

2010-04-20 Evan Stade <estade@chromium.org>

Reviewed by David Levin.
Expand Down
6 changes: 3 additions & 3 deletions WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp
Expand Up @@ -198,7 +198,7 @@ JSValue JSCanvasRenderingContext2D::drawImage(ExecState* exec, const ArgList& ar
HTMLImageElement* imgElt = static_cast<HTMLImageElement*>(static_cast<JSHTMLElement*>(o)->impl());
switch (args.size()) {
case 3:
context->drawImage(imgElt, args.at(1).toFloat(exec), args.at(2).toFloat(exec));
context->drawImage(imgElt, args.at(1).toFloat(exec), args.at(2).toFloat(exec), ec);
break;
case 5:
context->drawImage(imgElt, args.at(1).toFloat(exec), args.at(2).toFloat(exec),
Expand All @@ -219,7 +219,7 @@ JSValue JSCanvasRenderingContext2D::drawImage(ExecState* exec, const ArgList& ar
HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(static_cast<JSHTMLElement*>(o)->impl());
switch (args.size()) {
case 3:
context->drawImage(canvas, args.at(1).toFloat(exec), args.at(2).toFloat(exec));
context->drawImage(canvas, args.at(1).toFloat(exec), args.at(2).toFloat(exec), ec);
break;
case 5:
context->drawImage(canvas, args.at(1).toFloat(exec), args.at(2).toFloat(exec),
Expand All @@ -241,7 +241,7 @@ JSValue JSCanvasRenderingContext2D::drawImage(ExecState* exec, const ArgList& ar
HTMLVideoElement* video = static_cast<HTMLVideoElement*>(static_cast<JSHTMLElement*>(o)->impl());
switch (args.size()) {
case 3:
context->drawImage(video, args.at(1).toFloat(exec), args.at(2).toFloat(exec));
context->drawImage(video, args.at(1).toFloat(exec), args.at(2).toFloat(exec), ec);
break;
case 5:
context->drawImage(video, args.at(1).toFloat(exec), args.at(2).toFloat(exec),
Expand Down
2 changes: 1 addition & 1 deletion WebCore/bindings/scripts/CodeGeneratorV8.pm
Expand Up @@ -1036,7 +1036,7 @@ sub GenerateParametersCheckExpression
# these are acceptable values for a DOMString argument (any Object can
# be converted to a string via .toString).
push(@andExpression, "(${value}->IsNull() || ${value}->IsUndefined() || ${value}->IsString() || ${value}->IsObject())") if $codeGenerator->IsStringType($type);
push(@andExpression, "V8${type}::HasInstance($value)") if IsWrapperType($type);
push(@andExpression, "(${value}->IsNull() || V8${type}::HasInstance($value))") if IsWrapperType($type);

$parameterIndex++;
}
Expand Down
4 changes: 2 additions & 2 deletions WebCore/bindings/v8/test/V8TestObj.cpp
Expand Up @@ -305,9 +305,9 @@ static v8::Handle<v8::Value> overloadedMethod4Callback(const v8::Arguments& args

static v8::Handle<v8::Value> overloadedMethodCallback(const v8::Arguments& args) {
INC_STATS("DOM.TestObj.overloadedMethod");
if ((args.Length() == 2 && V8TestObj::HasInstance(args[0]) && (args[1]->IsNull() || args[1]->IsUndefined() || args[1]->IsString() || args[1]->IsObject()))) {
if ((args.Length() == 2 && (args[0]->IsNull() || V8TestObj::HasInstance(args[0])) && (args[1]->IsNull() || args[1]->IsUndefined() || args[1]->IsString() || args[1]->IsObject()))) {
return overloadedMethod1Callback(args);
} else if ((args.Length() == 1 && V8TestObj::HasInstance(args[0])) || (args.Length() == 2 && V8TestObj::HasInstance(args[0]))) {
} else if ((args.Length() == 1 && (args[0]->IsNull() || V8TestObj::HasInstance(args[0]))) || (args.Length() == 2 && (args[0]->IsNull() || V8TestObj::HasInstance(args[0])))) {
return overloadedMethod2Callback(args);
} else if ((args.Length() == 1 && (args[0]->IsNull() || args[0]->IsUndefined() || args[0]->IsString() || args[0]->IsObject()))) {
return overloadedMethod3Callback(args);
Expand Down
66 changes: 51 additions & 15 deletions WebCore/html/canvas/CanvasRenderingContext2D.cpp
Expand Up @@ -954,18 +954,23 @@ void CanvasRenderingContext2D::checkOrigin(const String& url)
checkOrigin(KURL(KURL(), url));
}

void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, float x, float y)
void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, float x, float y, ExceptionCode& ec)
{
ASSERT(image);
if (!image) {
ec = TYPE_MISMATCH_ERR;
return;
}
IntSize s = size(image);
ExceptionCode ec;
drawImage(image, x, y, s.width(), s.height(), ec);
}

void CanvasRenderingContext2D::drawImage(HTMLImageElement* image,
float x, float y, float width, float height, ExceptionCode& ec)
{
ASSERT(image);
if (!image) {
ec = TYPE_MISMATCH_ERR;
return;
}
IntSize s = size(image);
drawImage(image, FloatRect(0, 0, s.width(), s.height()), FloatRect(x, y, width, height), ec);
}
Expand All @@ -974,13 +979,20 @@ void CanvasRenderingContext2D::drawImage(HTMLImageElement* image,
float sx, float sy, float sw, float sh,
float dx, float dy, float dw, float dh, ExceptionCode& ec)
{
if (!image) {
ec = TYPE_MISMATCH_ERR;
return;
}
drawImage(image, FloatRect(sx, sy, sw, sh), FloatRect(dx, dy, dw, dh), ec);
}

void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, const FloatRect& srcRect, const FloatRect& dstRect,
ExceptionCode& ec)
{
ASSERT(image);
if (!image) {
ec = TYPE_MISMATCH_ERR;
return;
}

ec = 0;

Expand Down Expand Up @@ -1015,17 +1027,22 @@ void CanvasRenderingContext2D::drawImage(HTMLImageElement* image, const FloatRec
c->drawImage(cachedImage->image(), DeviceColorSpace, destRect, sourceRect, state().m_globalComposite);
}

void CanvasRenderingContext2D::drawImage(HTMLCanvasElement* canvas, float x, float y)
void CanvasRenderingContext2D::drawImage(HTMLCanvasElement* canvas, float x, float y, ExceptionCode& ec)
{
ASSERT(canvas);
ExceptionCode ec;
if (!canvas) {
ec = TYPE_MISMATCH_ERR;
return;
}
drawImage(canvas, x, y, canvas->width(), canvas->height(), ec);
}

void CanvasRenderingContext2D::drawImage(HTMLCanvasElement* canvas,
float x, float y, float width, float height, ExceptionCode& ec)
{
ASSERT(canvas);
if (!canvas) {
ec = TYPE_MISMATCH_ERR;
return;
}
drawImage(canvas, FloatRect(0, 0, canvas->width(), canvas->height()), FloatRect(x, y, width, height), ec);
}

Expand All @@ -1039,7 +1056,10 @@ void CanvasRenderingContext2D::drawImage(HTMLCanvasElement* canvas,
void CanvasRenderingContext2D::drawImage(HTMLCanvasElement* sourceCanvas, const FloatRect& srcRect,
const FloatRect& dstRect, ExceptionCode& ec)
{
ASSERT(sourceCanvas);
if (!sourceCanvas) {
ec = TYPE_MISMATCH_ERR;
return;
}

ec = 0;

Expand Down Expand Up @@ -1075,18 +1095,23 @@ void CanvasRenderingContext2D::drawImage(HTMLCanvasElement* sourceCanvas, const
}

#if ENABLE(VIDEO)
void CanvasRenderingContext2D::drawImage(HTMLVideoElement* video, float x, float y)
void CanvasRenderingContext2D::drawImage(HTMLVideoElement* video, float x, float y, ExceptionCode& ec)
{
ASSERT(video);
if (!video) {
ec = TYPE_MISMATCH_ERR;
return;
}
IntSize s = size(video);
ExceptionCode ec;
drawImage(video, x, y, s.width(), s.height(), ec);
}

void CanvasRenderingContext2D::drawImage(HTMLVideoElement* video,
float x, float y, float width, float height, ExceptionCode& ec)
{
ASSERT(video);
if (!video) {
ec = TYPE_MISMATCH_ERR;
return;
}
IntSize s = size(video);
drawImage(video, FloatRect(0, 0, s.width(), s.height()), FloatRect(x, y, width, height), ec);
}
Expand All @@ -1101,7 +1126,10 @@ void CanvasRenderingContext2D::drawImage(HTMLVideoElement* video,
void CanvasRenderingContext2D::drawImage(HTMLVideoElement* video, const FloatRect& srcRect, const FloatRect& dstRect,
ExceptionCode& ec)
{
ASSERT(video);
if (!video) {
ec = TYPE_MISMATCH_ERR;
return;
}

ec = 0;
FloatRect videoRect = FloatRect(FloatPoint(), size(video));
Expand Down Expand Up @@ -1220,6 +1248,10 @@ PassRefPtr<CanvasGradient> CanvasRenderingContext2D::createRadialGradient(float
PassRefPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(HTMLImageElement* image,
const String& repetitionType, ExceptionCode& ec)
{
if (!image) {
ec = TYPE_MISMATCH_ERR;
return 0;
}
bool repeatX, repeatY;
ec = 0;
CanvasPattern::parseRepetitionType(repetitionType, repeatX, repeatY, ec);
Expand All @@ -1242,6 +1274,10 @@ PassRefPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(HTMLImageEleme
PassRefPtr<CanvasPattern> CanvasRenderingContext2D::createPattern(HTMLCanvasElement* canvas,
const String& repetitionType, ExceptionCode& ec)
{
if (!canvas) {
ec = TYPE_MISMATCH_ERR;
return 0;
}
if (!canvas->width() || !canvas->height()) {
ec = INVALID_STATE_ERR;
return 0;
Expand Down
6 changes: 3 additions & 3 deletions WebCore/html/canvas/CanvasRenderingContext2D.h
Expand Up @@ -154,16 +154,16 @@ namespace WebCore {

void clearShadow();

void drawImage(HTMLImageElement*, float x, float y);
void drawImage(HTMLImageElement*, float x, float y, ExceptionCode&);
void drawImage(HTMLImageElement*, float x, float y, float width, float height, ExceptionCode&);
void drawImage(HTMLImageElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
void drawImage(HTMLImageElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
void drawImage(HTMLCanvasElement*, float x, float y);
void drawImage(HTMLCanvasElement*, float x, float y, ExceptionCode&);
void drawImage(HTMLCanvasElement*, float x, float y, float width, float height, ExceptionCode&);
void drawImage(HTMLCanvasElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
void drawImage(HTMLCanvasElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
#if ENABLE(VIDEO)
void drawImage(HTMLVideoElement*, float x, float y);
void drawImage(HTMLVideoElement*, float x, float y, ExceptionCode&);
void drawImage(HTMLVideoElement*, float x, float y, float width, float height, ExceptionCode&);
void drawImage(HTMLVideoElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
void drawImage(HTMLVideoElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
Expand Down
9 changes: 6 additions & 3 deletions WebCore/html/canvas/CanvasRenderingContext2D.idl
Expand Up @@ -113,18 +113,21 @@ module html {

void strokeRect(in float x, in float y, in float width, in float height, in [Optional] float lineWidth);

void drawImage(in HTMLImageElement image, in float x, in float y);
void drawImage(in HTMLImageElement image, in float x, in float y)
raises (DOMException);
void drawImage(in HTMLImageElement image, in float x, in float y, in float width, in float height)
raises (DOMException);
void drawImage(in HTMLImageElement image, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
raises (DOMException);
void drawImage(in HTMLCanvasElement canvas, in float x, in float y);
void drawImage(in HTMLCanvasElement canvas, in float x, in float y)
raises (DOMException);
void drawImage(in HTMLCanvasElement canvas, in float x, in float y, in float width, in float height)
raises (DOMException);
void drawImage(in HTMLCanvasElement canvas, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
raises (DOMException);
#if defined(ENABLE_VIDEO) && ENABLE_VIDEO
void drawImage(in HTMLVideoElement video, in float x, in float y);
void drawImage(in HTMLVideoElement video, in float x, in float y)
raises (DOMException);
void drawImage(in HTMLVideoElement video, in float x, in float y, in float width, in float height)
raises (DOMException);
void drawImage(in HTMLVideoElement video, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
Expand Down

0 comments on commit 8d07016

Please sign in to comment.