From a94a427da0e4a45422e9aaea903ed1f81ad1c576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 15 Feb 2016 21:51:01 +0100 Subject: [PATCH] require new in constructor --- src/Canvas.cc | 4 ++++ src/CanvasGradient.cc | 4 ++++ src/CanvasPattern.cc | 4 ++++ src/CanvasRenderingContext2d.cc | 4 ++++ src/FontFace.cc | 5 ++++- src/Image.cc | 4 ++++ src/ImageData.cc | 4 ++++ test/canvas.test.js | 4 ++++ test/image.test.js | 4 ++++ test/imageData.test.js | 4 ++++ 10 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/Canvas.cc b/src/Canvas.cc index 7e77013..83de51e 100644 --- a/src/Canvas.cc +++ b/src/Canvas.cc @@ -63,6 +63,10 @@ Canvas::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { */ NAN_METHOD(Canvas::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'"); + } + int width = 0, height = 0; canvas_type_t type = CANVAS_TYPE_IMAGE; if (info[0]->IsNumber()) width = info[0]->Uint32Value(); diff --git a/src/CanvasGradient.cc b/src/CanvasGradient.cc index 2b4f4e4..8063b6d 100644 --- a/src/CanvasGradient.cc +++ b/src/CanvasGradient.cc @@ -35,6 +35,10 @@ Gradient::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { */ NAN_METHOD(Gradient::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'"); + } + // Linear if (4 == info.Length()) { Gradient *grad = new Gradient( diff --git a/src/CanvasPattern.cc b/src/CanvasPattern.cc index 1e1be3d..4c54633 100644 --- a/src/CanvasPattern.cc +++ b/src/CanvasPattern.cc @@ -37,6 +37,10 @@ Pattern::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { */ NAN_METHOD(Pattern::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'"); + } + int w = 0 , h = 0; cairo_surface_t *surface; diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index ff52bdb..f1a2358 100755 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -536,6 +536,10 @@ Context2d::blur(cairo_surface_t *surface, int radius) { */ NAN_METHOD(Context2d::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'"); + } + Local obj = info[0]->ToObject(); if (!Nan::New(Canvas::constructor)->HasInstance(obj)) return Nan::ThrowTypeError("Canvas expected"); diff --git a/src/FontFace.cc b/src/FontFace.cc index 3758f15..5d48c17 100755 --- a/src/FontFace.cc +++ b/src/FontFace.cc @@ -53,6 +53,10 @@ static cairo_user_data_key_t key; */ NAN_METHOD(FontFace::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'"); + } + if (!info[0]->IsString() || !info[1]->IsNumber()) { return Nan::ThrowError("Wrong argument types passed to FontFace constructor"); @@ -107,4 +111,3 @@ NAN_METHOD(FontFace::New) { face->Wrap(info.This()); info.GetReturnValue().Set(info.This()); } - diff --git a/src/Image.cc b/src/Image.cc index 70f32f9..2a7bced 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -67,6 +67,10 @@ Image::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { */ NAN_METHOD(Image::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'"); + } + Image *img = new Image; img->data_mode = DATA_IMAGE; img->Wrap(info.This()); diff --git a/src/ImageData.cc b/src/ImageData.cc index 6d6f082..73730da 100644 --- a/src/ImageData.cc +++ b/src/ImageData.cc @@ -35,6 +35,10 @@ ImageData::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { */ NAN_METHOD(ImageData::New) { + if (!info.IsConstructCall()) { + return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'"); + } + #if NODE_MAJOR_VERSION == 0 && NODE_MINOR_VERSION <= 10 Local clampedArray; Local global = Context::GetCurrent()->Global(); diff --git a/test/canvas.test.js b/test/canvas.test.js index 6f1ea83..ad62344 100644 --- a/test/canvas.test.js +++ b/test/canvas.test.js @@ -12,6 +12,10 @@ console.log(' canvas: %s', Canvas.version); console.log(' cairo: %s', Canvas.cairoVersion); describe('Canvas', function () { + it('should require new', function () { + assert.throws(function () { Canvas(); }, TypeError); + }); + it('.version', function () { assert.ok(/^\d+\.\d+\.\d+$/.test(Canvas.version)); }); diff --git a/test/image.test.js b/test/image.test.js index 10c98fe..ae39d62 100644 --- a/test/image.test.js +++ b/test/image.test.js @@ -11,6 +11,10 @@ var png_checkers = __dirname + '/fixtures/checkers.png'; var png_clock = __dirname + '/fixtures/clock.png'; describe('Image', function () { + it('should require new', function () { + assert.throws(function () { Image(); }, TypeError); + }); + it('Image', function () { assert.ok(Image instanceof Function); }); diff --git a/test/imageData.test.js b/test/imageData.test.js index 5e535af..fe2f46a 100644 --- a/test/imageData.test.js +++ b/test/imageData.test.js @@ -5,6 +5,10 @@ var Canvas = require('../') , assert = require('assert'); describe('ImageData', function () { + it('should require new', function () { + assert.throws(function () { ImageData(); }, TypeError); + }); + it('should throw with invalid numeric arguments', function () { assert.throws(function () { new ImageData(0, 0);