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

Side by Side Diff: Source/bindings/v8/custom/V8WebGLRenderingContextCustom.cpp

Issue 121113004: Improve handling of failed integer type conversions. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 6 years, 11 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/bindings/v8/custom/V8PromiseCustom.cpp ('k') | Source/modules/indexeddb/IDBCursor.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) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 #include "core/dom/ExceptionCode.h" 75 #include "core/dom/ExceptionCode.h"
76 #include "core/html/canvas/WebGLRenderingContext.h" 76 #include "core/html/canvas/WebGLRenderingContext.h"
77 #include "platform/NotImplemented.h" 77 #include "platform/NotImplemented.h"
78 #include "wtf/FastMalloc.h" 78 #include "wtf/FastMalloc.h"
79 #include <limits> 79 #include <limits>
80 80
81 namespace WebCore { 81 namespace WebCore {
82 82
83 // Allocates new storage via fastMalloc. 83 // Allocates new storage via fastMalloc.
84 // Returns NULL if array failed to convert for any reason. 84 // Returns NULL if array failed to convert for any reason.
85 static float* jsArrayToFloatArray(v8::Handle<v8::Array> array, uint32_t len) 85 static float* jsArrayToFloatArray(v8::Handle<v8::Array> array, uint32_t len, Exc eptionState& exceptionState)
86 { 86 {
87 // Convert the data element-by-element. 87 // Convert the data element-by-element.
88 if (len > std::numeric_limits<uint32_t>::max() / sizeof(float)) 88 if (len > std::numeric_limits<uint32_t>::max() / sizeof(float)) {
89 exceptionState.throwTypeError("Array length exceeds supported limit.");
89 return 0; 90 return 0;
91 }
90 float* data = static_cast<float*>(fastMalloc(len * sizeof(float))); 92 float* data = static_cast<float*>(fastMalloc(len * sizeof(float)));
91 93
92 for (uint32_t i = 0; i < len; i++) { 94 for (uint32_t i = 0; i < len; i++) {
93 v8::Local<v8::Value> val = array->Get(i); 95 v8::Local<v8::Value> val = array->Get(i);
94 if (!val->IsNumber()) { 96 float value = toFloat(val, exceptionState);
97 if (exceptionState.hadException()) {
95 fastFree(data); 98 fastFree(data);
96 return 0; 99 return 0;
97 } 100 }
98 data[i] = toFloat(val); 101 data[i] = value;
99 } 102 }
100 return data; 103 return data;
101 } 104 }
102 105
103 // Allocates new storage via fastMalloc. 106 // Allocates new storage via fastMalloc.
104 // Returns NULL if array failed to convert for any reason. 107 // Returns NULL if array failed to convert for any reason.
105 static int* jsArrayToIntArray(v8::Handle<v8::Array> array, uint32_t len) 108 static int* jsArrayToIntArray(v8::Handle<v8::Array> array, uint32_t len, Excepti onState& exceptionState)
106 { 109 {
107 // Convert the data element-by-element. 110 // Convert the data element-by-element.
108 if (len > std::numeric_limits<uint32_t>::max() / sizeof(int)) 111 if (len > std::numeric_limits<uint32_t>::max() / sizeof(int)) {
112 exceptionState.throwTypeError("Array length exceeds supported limit.");
109 return 0; 113 return 0;
114 }
110 int* data = static_cast<int*>(fastMalloc(len * sizeof(int))); 115 int* data = static_cast<int*>(fastMalloc(len * sizeof(int)));
111 116
112 for (uint32_t i = 0; i < len; i++) { 117 for (uint32_t i = 0; i < len; i++) {
113 v8::Local<v8::Value> val = array->Get(i); 118 v8::Local<v8::Value> val = array->Get(i);
114 bool ok; 119 int ival = toInt32(val, exceptionState);
115 int ival = toInt32(val, ok); 120 if (exceptionState.hadException()) {
116 if (!ok) {
117 fastFree(data); 121 fastFree(data);
118 return 0; 122 return 0;
119 } 123 }
120 data[i] = ival; 124 data[i] = ival;
121 } 125 }
122 return data; 126 return data;
123 } 127 }
124 128
125 static v8::Handle<v8::Value> toV8Object(const WebGLGetInfo& args, v8::Handle<v8: :Object> creationContext, v8::Isolate* isolate) 129 static v8::Handle<v8::Value> toV8Object(const WebGLGetInfo& args, v8::Handle<v8: :Object> creationContext, v8::Isolate* isolate)
126 { 130 {
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 } 258 }
255 ASSERT(!extensionObject.IsEmpty()); 259 ASSERT(!extensionObject.IsEmpty());
256 V8HiddenPropertyName::setNamedHiddenReference(contextObject, referenceName, extensionObject); 260 V8HiddenPropertyName::setNamedHiddenReference(contextObject, referenceName, extensionObject);
257 return extensionObject; 261 return extensionObject;
258 } 262 }
259 263
260 enum ObjectType { 264 enum ObjectType {
261 kBuffer, kRenderbuffer, kTexture, kVertexAttrib 265 kBuffer, kRenderbuffer, kTexture, kVertexAttrib
262 }; 266 };
263 267
264 static void getObjectParameter(const v8::FunctionCallbackInfo<v8::Value>& info, ObjectType objectType, const char* method) 268 static void getObjectParameter(const v8::FunctionCallbackInfo<v8::Value>& info, ObjectType objectType, ExceptionState& exceptionState)
265 { 269 {
266 if (info.Length() != 2) { 270 if (info.Length() != 2) {
267 throwTypeError(ExceptionMessages::failedToExecute(method, "WebGLRenderin gContext", ExceptionMessages::notEnoughArguments(2, info.Length())), info.GetIso late()); 271 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, i nfo.Length()));
272 exceptionState.throwIfNeeded();
268 return; 273 return;
269 } 274 }
270 275
271 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 276 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
272 unsigned target = toInt32(info[0]); 277 unsigned target = toInt32(info[0], exceptionState);
273 unsigned pname = toInt32(info[1]); 278 if (exceptionState.throwIfNeeded())
279 return;
280 unsigned pname = toInt32(info[1], exceptionState);
281 if (exceptionState.throwIfNeeded())
282 return;
274 WebGLGetInfo args; 283 WebGLGetInfo args;
275 switch (objectType) { 284 switch (objectType) {
276 case kBuffer: 285 case kBuffer:
277 args = context->getBufferParameter(target, pname); 286 args = context->getBufferParameter(target, pname);
278 break; 287 break;
279 case kRenderbuffer: 288 case kRenderbuffer:
280 args = context->getRenderbufferParameter(target, pname); 289 args = context->getRenderbufferParameter(target, pname);
281 break; 290 break;
282 case kTexture: 291 case kTexture:
283 args = context->getTexParameter(target, pname); 292 args = context->getTexParameter(target, pname);
284 break; 293 break;
285 case kVertexAttrib: 294 case kVertexAttrib:
286 // target => index 295 // target => index
287 args = context->getVertexAttrib(target, pname); 296 args = context->getVertexAttrib(target, pname);
288 break; 297 break;
289 default: 298 default:
290 notImplemented(); 299 notImplemented();
291 break; 300 break;
292 } 301 }
293 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); 302 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate()));
294 } 303 }
295 304
296 static WebGLUniformLocation* toWebGLUniformLocation(v8::Handle<v8::Value> value, bool& ok, v8::Isolate* isolate) 305 static WebGLUniformLocation* toWebGLUniformLocation(v8::Handle<v8::Value> value, v8::Isolate* isolate)
297 { 306 {
298 ok = false; 307 if (!V8WebGLUniformLocation::hasInstance(value, isolate, worldType(isolate)) )
299 WebGLUniformLocation* location = 0; 308 return 0;
300 if (V8WebGLUniformLocation::hasInstance(value, isolate, worldType(isolate))) { 309 return V8WebGLUniformLocation::toNative(value->ToObject());
301 location = V8WebGLUniformLocation::toNative(value->ToObject());
302 ok = true;
303 }
304 return location;
305 } 310 }
306 311
307 enum WhichProgramCall { 312 enum WhichProgramCall {
308 kProgramParameter, kUniform 313 kProgramParameter, kUniform
309 }; 314 };
310 315
311 void V8WebGLRenderingContext::getAttachedShadersMethodCustom(const v8::FunctionC allbackInfo<v8::Value>& info) 316 void V8WebGLRenderingContext::getAttachedShadersMethodCustom(const v8::FunctionC allbackInfo<v8::Value>& info)
312 { 317 {
318 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getAttached Shaders", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
313 if (info.Length() < 1) { 319 if (info.Length() < 1) {
314 throwTypeError(ExceptionMessages::failedToExecute("getAttachedShaders", "WebGLRenderingContext", ExceptionMessages::notEnoughArguments(1, info.Length()) ), info.GetIsolate()); 320 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(1, i nfo.Length()));
321 exceptionState.throwIfNeeded();
315 return; 322 return;
316 } 323 }
317 324
325 const int programArgumentIndex = 0;
318 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 326 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
319 if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLProgram::has Instance(info[0], info.GetIsolate(), worldType(info.GetIsolate()))) { 327 if (info.Length() > 0 && !isUndefinedOrNull(info[programArgumentIndex]) && ! V8WebGLProgram::hasInstance(info[programArgumentIndex], info.GetIsolate(), world Type(info.GetIsolate()))) {
320 throwUninformativeAndGenericTypeError(info.GetIsolate()); 328 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(p rogramArgumentIndex + 1, "is not a WebGLProgram object."));
329 exceptionState.throwIfNeeded();
321 return; 330 return;
322 } 331 }
323 WebGLProgram* program = V8WebGLProgram::hasInstance(info[0], info.GetIsolate (), worldType(info.GetIsolate())) ? V8WebGLProgram::toNative(v8::Handle<v8::Obje ct>::Cast(info[0])) : 0; 332 WebGLProgram* program = V8WebGLProgram::hasInstance(info[0], info.GetIsolate (), worldType(info.GetIsolate())) ? V8WebGLProgram::toNative(v8::Handle<v8::Obje ct>::Cast(info[0])) : 0;
324 Vector<RefPtr<WebGLShader> > shaders; 333 Vector<RefPtr<WebGLShader> > shaders;
325 bool succeed = context->getAttachedShaders(program, shaders); 334 bool succeed = context->getAttachedShaders(program, shaders);
326 if (!succeed) { 335 if (!succeed) {
327 v8SetReturnValueNull(info); 336 v8SetReturnValueNull(info);
328 return; 337 return;
329 } 338 }
330 v8::Local<v8::Array> array = v8::Array::New(info.GetIsolate(), shaders.size( )); 339 v8::Local<v8::Array> array = v8::Array::New(info.GetIsolate(), shaders.size( ));
331 for (size_t ii = 0; ii < shaders.size(); ++ii) 340 for (size_t ii = 0; ii < shaders.size(); ++ii)
332 array->Set(v8::Integer::New(info.GetIsolate(), ii), toV8(shaders[ii].get (), info.Holder(), info.GetIsolate())); 341 array->Set(v8::Integer::New(info.GetIsolate(), ii), toV8(shaders[ii].get (), info.Holder(), info.GetIsolate()));
333 v8SetReturnValue(info, array); 342 v8SetReturnValue(info, array);
334 } 343 }
335 344
336 void V8WebGLRenderingContext::getBufferParameterMethodCustom(const v8::FunctionC allbackInfo<v8::Value>& info) 345 void V8WebGLRenderingContext::getBufferParameterMethodCustom(const v8::FunctionC allbackInfo<v8::Value>& info)
337 { 346 {
338 getObjectParameter(info, kBuffer, "getBufferParameter"); 347 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getBufferPa rameter", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
348 getObjectParameter(info, kBuffer, exceptionState);
339 } 349 }
340 350
341 void V8WebGLRenderingContext::getExtensionMethodCustom(const v8::FunctionCallbac kInfo<v8::Value>& info) 351 void V8WebGLRenderingContext::getExtensionMethodCustom(const v8::FunctionCallbac kInfo<v8::Value>& info)
342 { 352 {
353 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getExtensio n", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
343 WebGLRenderingContext* imp = V8WebGLRenderingContext::toNative(info.Holder() ); 354 WebGLRenderingContext* imp = V8WebGLRenderingContext::toNative(info.Holder() );
344 if (info.Length() < 1) { 355 if (info.Length() < 1) {
345 throwTypeError(ExceptionMessages::failedToExecute("getExtension", "WebGL RenderingContext", ExceptionMessages::notEnoughArguments(1, info.Length())), inf o.GetIsolate()); 356 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(1, i nfo.Length()));
357 exceptionState.throwIfNeeded();
346 return; 358 return;
347 } 359 }
348 V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, name, info[0]); 360 V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, name, info[0]);
349 RefPtr<WebGLExtension> extension(imp->getExtension(name)); 361 RefPtr<WebGLExtension> extension(imp->getExtension(name));
350 v8SetReturnValue(info, toV8Object(extension.get(), info.Holder(), info.GetIs olate())); 362 v8SetReturnValue(info, toV8Object(extension.get(), info.Holder(), info.GetIs olate()));
351 } 363 }
352 364
353 void V8WebGLRenderingContext::getFramebufferAttachmentParameterMethodCustom(cons t v8::FunctionCallbackInfo<v8::Value>& info) 365 void V8WebGLRenderingContext::getFramebufferAttachmentParameterMethodCustom(cons t v8::FunctionCallbackInfo<v8::Value>& info)
354 { 366 {
367 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getFramebuf ferAttachmentParameter", "WebGLRenderingContext", info.Holder(), info.GetIsolate ());
355 if (info.Length() != 3) { 368 if (info.Length() != 3) {
356 throwTypeError(ExceptionMessages::failedToExecute("getFramebufferAttachm entParameter", "WebGLRenderingContext", ExceptionMessages::notEnoughArguments(3, info.Length())), info.GetIsolate()); 369 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(3, i nfo.Length()));
370 exceptionState.throwIfNeeded();
357 return; 371 return;
358 } 372 }
359 373
360 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 374 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
361 unsigned target = toInt32(info[0]); 375 unsigned target = toInt32(info[0]);
362 unsigned attachment = toInt32(info[1]); 376 unsigned attachment = toInt32(info[1], exceptionState);
363 unsigned pname = toInt32(info[2]); 377 if (exceptionState.throwIfNeeded())
378 return;
379 unsigned pname = toInt32(info[2], exceptionState);
380 if (exceptionState.throwIfNeeded())
381 return;
364 WebGLGetInfo args = context->getFramebufferAttachmentParameter(target, attac hment, pname); 382 WebGLGetInfo args = context->getFramebufferAttachmentParameter(target, attac hment, pname);
365 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); 383 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate()));
366 } 384 }
367 385
368 void V8WebGLRenderingContext::getParameterMethodCustom(const v8::FunctionCallbac kInfo<v8::Value>& info) 386 void V8WebGLRenderingContext::getParameterMethodCustom(const v8::FunctionCallbac kInfo<v8::Value>& info)
369 { 387 {
388 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getParamete r", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
370 if (info.Length() != 1) { 389 if (info.Length() != 1) {
371 throwTypeError(ExceptionMessages::failedToExecute("getParameter", "WebGL RenderingContext", ExceptionMessages::notEnoughArguments(1, info.Length())), inf o.GetIsolate()); 390 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(1, i nfo.Length()));
391 exceptionState.throwIfNeeded();
372 return; 392 return;
373 } 393 }
374 394
375 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 395 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
376 unsigned pname = toInt32(info[0]); 396 unsigned pname = toInt32(info[0], exceptionState);
397 if (exceptionState.throwIfNeeded())
398 return;
377 WebGLGetInfo args = context->getParameter(pname); 399 WebGLGetInfo args = context->getParameter(pname);
378 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); 400 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate()));
379 } 401 }
380 402
381 void V8WebGLRenderingContext::getProgramParameterMethodCustom(const v8::Function CallbackInfo<v8::Value>& info) 403 void V8WebGLRenderingContext::getProgramParameterMethodCustom(const v8::Function CallbackInfo<v8::Value>& info)
382 { 404 {
405 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getProgramP arameter", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
383 if (info.Length() != 2) { 406 if (info.Length() != 2) {
384 throwTypeError(ExceptionMessages::failedToExecute("getProgramParameter", "WebGLRenderingContext", ExceptionMessages::notEnoughArguments(2, info.Length() )), info.GetIsolate()); 407 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, i nfo.Length()));
408 exceptionState.throwIfNeeded();
385 return; 409 return;
386 } 410 }
387 411
412 const int programArgumentIndex = 0;
388 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 413 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
389 if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLProgram::has Instance(info[0], info.GetIsolate(), worldType(info.GetIsolate()))) { 414 if (info.Length() > 0 && !isUndefinedOrNull(info[programArgumentIndex]) && ! V8WebGLProgram::hasInstance(info[programArgumentIndex], info.GetIsolate(), world Type(info.GetIsolate()))) {
390 throwUninformativeAndGenericTypeError(info.GetIsolate()); 415 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(p rogramArgumentIndex + 1, "is not a WebGLProgram object."));
416 exceptionState.throwIfNeeded();
391 return; 417 return;
392 } 418 }
393 WebGLProgram* program = V8WebGLProgram::hasInstance(info[0], info.GetIsolate (), worldType(info.GetIsolate())) ? V8WebGLProgram::toNative(v8::Handle<v8::Obje ct>::Cast(info[0])) : 0; 419 WebGLProgram* program = V8WebGLProgram::hasInstance(info[0], info.GetIsolate (), worldType(info.GetIsolate())) ? V8WebGLProgram::toNative(v8::Handle<v8::Obje ct>::Cast(info[0])) : 0;
394 unsigned pname = toInt32(info[1]); 420 unsigned pname = toInt32(info[1], exceptionState);
421 if (exceptionState.throwIfNeeded())
422 return;
395 WebGLGetInfo args = context->getProgramParameter(program, pname); 423 WebGLGetInfo args = context->getProgramParameter(program, pname);
396 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); 424 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate()));
397 } 425 }
398 426
399 void V8WebGLRenderingContext::getRenderbufferParameterMethodCustom(const v8::Fun ctionCallbackInfo<v8::Value>& info) 427 void V8WebGLRenderingContext::getRenderbufferParameterMethodCustom(const v8::Fun ctionCallbackInfo<v8::Value>& info)
400 { 428 {
401 getObjectParameter(info, kRenderbuffer, "getRenderbufferParameter"); 429 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getRenderbu fferParameter", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
430 getObjectParameter(info, kRenderbuffer, exceptionState);
402 } 431 }
403 432
404 void V8WebGLRenderingContext::getShaderParameterMethodCustom(const v8::FunctionC allbackInfo<v8::Value>& info) 433 void V8WebGLRenderingContext::getShaderParameterMethodCustom(const v8::FunctionC allbackInfo<v8::Value>& info)
405 { 434 {
435 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getShaderPa rameter", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
406 if (info.Length() != 2) { 436 if (info.Length() != 2) {
407 throwTypeError(ExceptionMessages::failedToExecute("getShaderParameter", "WebGLRenderingContext", ExceptionMessages::notEnoughArguments(2, info.Length()) ), info.GetIsolate()); 437 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, i nfo.Length()));
438 exceptionState.throwIfNeeded();
408 return; 439 return;
409 } 440 }
410 441
442 const int shaderArgumentIndex = 0;
411 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 443 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
412 if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLShader::hasI nstance(info[0], info.GetIsolate(), worldType(info.GetIsolate()))) { 444 if (info.Length() > 0 && !isUndefinedOrNull(info[shaderArgumentIndex]) && !V 8WebGLShader::hasInstance(info[shaderArgumentIndex], info.GetIsolate(), worldTyp e(info.GetIsolate()))) {
413 throwUninformativeAndGenericTypeError(info.GetIsolate()); 445 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(s haderArgumentIndex + 1, "is not a WebGLShader object."));
446 exceptionState.throwIfNeeded();
414 return; 447 return;
415 } 448 }
416 WebGLShader* shader = V8WebGLShader::hasInstance(info[0], info.GetIsolate(), worldType(info.GetIsolate())) ? V8WebGLShader::toNative(v8::Handle<v8::Object>: :Cast(info[0])) : 0; 449 WebGLShader* shader = V8WebGLShader::hasInstance(info[shaderArgumentIndex], info.GetIsolate(), worldType(info.GetIsolate())) ? V8WebGLShader::toNative(v8::H andle<v8::Object>::Cast(info[0])) : 0;
417 unsigned pname = toInt32(info[1]); 450 unsigned pname = toInt32(info[1], exceptionState);
451 if (exceptionState.throwIfNeeded())
452 return;
418 WebGLGetInfo args = context->getShaderParameter(shader, pname); 453 WebGLGetInfo args = context->getShaderParameter(shader, pname);
419 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); 454 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate()));
420 } 455 }
421 456
422 void V8WebGLRenderingContext::getSupportedExtensionsMethodCustom(const v8::Funct ionCallbackInfo<v8::Value>& info) 457 void V8WebGLRenderingContext::getSupportedExtensionsMethodCustom(const v8::Funct ionCallbackInfo<v8::Value>& info)
423 { 458 {
424 WebGLRenderingContext* imp = V8WebGLRenderingContext::toNative(info.Holder() ); 459 WebGLRenderingContext* imp = V8WebGLRenderingContext::toNative(info.Holder() );
425 if (imp->isContextLost()) { 460 if (imp->isContextLost()) {
426 v8SetReturnValueNull(info); 461 v8SetReturnValueNull(info);
427 return; 462 return;
428 } 463 }
429 464
430 Vector<String> value = imp->getSupportedExtensions(); 465 Vector<String> value = imp->getSupportedExtensions();
431 v8::Local<v8::Array> array = v8::Array::New(info.GetIsolate(), value.size()) ; 466 v8::Local<v8::Array> array = v8::Array::New(info.GetIsolate(), value.size()) ;
432 for (size_t ii = 0; ii < value.size(); ++ii) 467 for (size_t ii = 0; ii < value.size(); ++ii)
433 array->Set(v8::Integer::New(info.GetIsolate(), ii), v8String(info.GetIso late(), value[ii])); 468 array->Set(v8::Integer::New(info.GetIsolate(), ii), v8String(info.GetIso late(), value[ii]));
434 v8SetReturnValue(info, array); 469 v8SetReturnValue(info, array);
435 } 470 }
436 471
437 void V8WebGLRenderingContext::getTexParameterMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info) 472 void V8WebGLRenderingContext::getTexParameterMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info)
438 { 473 {
439 getObjectParameter(info, kTexture, "getTexParameter"); 474 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getTexParam eter", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
475 getObjectParameter(info, kTexture, exceptionState);
440 } 476 }
441 477
442 void V8WebGLRenderingContext::getUniformMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 478 void V8WebGLRenderingContext::getUniformMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
443 { 479 {
480 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getUniform" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
444 if (info.Length() != 2) { 481 if (info.Length() != 2) {
445 throwTypeError(ExceptionMessages::failedToExecute("getUniform", "WebGLRe nderingContext", ExceptionMessages::notEnoughArguments(2, info.Length())), info. GetIsolate()); 482 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, i nfo.Length()));
483 exceptionState.throwIfNeeded();
446 return; 484 return;
447 } 485 }
448 486
487 const int programArgumentIndex = 0;
449 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 488 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
450 if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLProgram::has Instance(info[0], info.GetIsolate(), worldType(info.GetIsolate()))) { 489 if (info.Length() > 0 && !isUndefinedOrNull(info[programArgumentIndex]) && ! V8WebGLProgram::hasInstance(info[programArgumentIndex], info.GetIsolate(), world Type(info.GetIsolate()))) {
451 throwUninformativeAndGenericTypeError(info.GetIsolate()); 490 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(p rogramArgumentIndex + 1, "is not a WebGLProgram object."));
491 exceptionState.throwIfNeeded();
452 return; 492 return;
453 } 493 }
454 WebGLProgram* program = V8WebGLProgram::hasInstance(info[0], info.GetIsolate (), worldType(info.GetIsolate())) ? V8WebGLProgram::toNative(v8::Handle<v8::Obje ct>::Cast(info[0])) : 0; 494 WebGLProgram* program = V8WebGLProgram::hasInstance(info[programArgumentInde x], info.GetIsolate(), worldType(info.GetIsolate())) ? V8WebGLProgram::toNative( v8::Handle<v8::Object>::Cast(info[0])) : 0;
455 495
456 if (info.Length() > 1 && !isUndefinedOrNull(info[1]) && !V8WebGLUniformLocat ion::hasInstance(info[1], info.GetIsolate(), worldType(info.GetIsolate()))) { 496 const int uniformArgumentIndex = 1;
457 throwUninformativeAndGenericTypeError(info.GetIsolate()); 497 if (info.Length() > 1 && !isUndefinedOrNull(info[uniformArgumentIndex]) && ! V8WebGLUniformLocation::hasInstance(info[uniformArgumentIndex], info.GetIsolate( ), worldType(info.GetIsolate()))) {
498 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(u niformArgumentIndex + 1, "is not a WebGLUniformLocation object."));
499 exceptionState.throwIfNeeded();
458 return; 500 return;
459 } 501 }
460 bool ok = false; 502 const int uniformLocationArgumentIndex = 1;
461 WebGLUniformLocation* location = toWebGLUniformLocation(info[1], ok, info.Ge tIsolate()); 503 WebGLUniformLocation* location = toWebGLUniformLocation(info[uniformLocation ArgumentIndex], info.GetIsolate());
462 504
463 WebGLGetInfo args = context->getUniform(program, location); 505 WebGLGetInfo args = context->getUniform(program, location);
464 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); 506 v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate()));
465 } 507 }
466 508
467 void V8WebGLRenderingContext::getVertexAttribMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info) 509 void V8WebGLRenderingContext::getVertexAttribMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info)
468 { 510 {
469 getObjectParameter(info, kVertexAttrib, "getVertexAttrib"); 511 ExceptionState exceptionState(ExceptionState::ExecutionContext, "getVertexAt trib", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
512 getObjectParameter(info, kVertexAttrib, exceptionState);
470 } 513 }
471 514
472 enum FunctionToCall { 515 enum FunctionToCall {
473 kUniform1v, kUniform2v, kUniform3v, kUniform4v, 516 kUniform1v, kUniform2v, kUniform3v, kUniform4v,
474 kVertexAttrib1v, kVertexAttrib2v, kVertexAttrib3v, kVertexAttrib4v 517 kVertexAttrib1v, kVertexAttrib2v, kVertexAttrib3v, kVertexAttrib4v
475 }; 518 };
476 519
477 bool isFunctionToCallForAttribute(FunctionToCall functionToCall) 520 bool isFunctionToCallForAttribute(FunctionToCall functionToCall)
478 { 521 {
479 switch (functionToCall) { 522 switch (functionToCall) {
480 case kVertexAttrib1v: 523 case kVertexAttrib1v:
481 case kVertexAttrib2v: 524 case kVertexAttrib2v:
482 case kVertexAttrib3v: 525 case kVertexAttrib3v:
483 case kVertexAttrib4v: 526 case kVertexAttrib4v:
484 return true; 527 return true;
485 default: 528 default:
486 break; 529 break;
487 } 530 }
488 return false; 531 return false;
489 } 532 }
490 533
491 static void vertexAttribAndUniformHelperf(const v8::FunctionCallbackInfo<v8::Val ue>& info, FunctionToCall functionToCall, const char* method) 534 static void vertexAttribAndUniformHelperf(const v8::FunctionCallbackInfo<v8::Val ue>& info, FunctionToCall functionToCall, ExceptionState& exceptionState)
492 { 535 {
493 // Forms: 536 // Forms:
494 // * glUniform1fv(WebGLUniformLocation location, Array data); 537 // * glUniform1fv(WebGLUniformLocation location, Array data);
495 // * glUniform1fv(WebGLUniformLocation location, Float32Array data); 538 // * glUniform1fv(WebGLUniformLocation location, Float32Array data);
496 // * glUniform2fv(WebGLUniformLocation location, Array data); 539 // * glUniform2fv(WebGLUniformLocation location, Array data);
497 // * glUniform2fv(WebGLUniformLocation location, Float32Array data); 540 // * glUniform2fv(WebGLUniformLocation location, Float32Array data);
498 // * glUniform3fv(WebGLUniformLocation location, Array data); 541 // * glUniform3fv(WebGLUniformLocation location, Array data);
499 // * glUniform3fv(WebGLUniformLocation location, Float32Array data); 542 // * glUniform3fv(WebGLUniformLocation location, Float32Array data);
500 // * glUniform4fv(WebGLUniformLocation location, Array data); 543 // * glUniform4fv(WebGLUniformLocation location, Array data);
501 // * glUniform4fv(WebGLUniformLocation location, Float32Array data); 544 // * glUniform4fv(WebGLUniformLocation location, Float32Array data);
502 // * glVertexAttrib1fv(GLint index, Array data); 545 // * glVertexAttrib1fv(GLint index, Array data);
503 // * glVertexAttrib1fv(GLint index, Float32Array data); 546 // * glVertexAttrib1fv(GLint index, Float32Array data);
504 // * glVertexAttrib2fv(GLint index, Array data); 547 // * glVertexAttrib2fv(GLint index, Array data);
505 // * glVertexAttrib2fv(GLint index, Float32Array data); 548 // * glVertexAttrib2fv(GLint index, Float32Array data);
506 // * glVertexAttrib3fv(GLint index, Array data); 549 // * glVertexAttrib3fv(GLint index, Array data);
507 // * glVertexAttrib3fv(GLint index, Float32Array data); 550 // * glVertexAttrib3fv(GLint index, Float32Array data);
508 // * glVertexAttrib4fv(GLint index, Array data); 551 // * glVertexAttrib4fv(GLint index, Array data);
509 // * glVertexAttrib4fv(GLint index, Float32Array data); 552 // * glVertexAttrib4fv(GLint index, Float32Array data);
510 553
511 if (info.Length() != 2) { 554 if (info.Length() != 2) {
512 throwTypeError(ExceptionMessages::failedToExecute(method, "WebGLRenderin gContext", ExceptionMessages::notEnoughArguments(2, info.Length())), info.GetIso late()); 555 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, i nfo.Length()));
556 exceptionState.throwIfNeeded();
513 return; 557 return;
514 } 558 }
515 559
516 bool ok = false;
517 int index = -1; 560 int index = -1;
518 WebGLUniformLocation* location = 0; 561 WebGLUniformLocation* location = 0;
519 562
520 if (isFunctionToCallForAttribute(functionToCall)) 563 if (isFunctionToCallForAttribute(functionToCall)) {
521 index = toInt32(info[0]); 564 index = toInt32(info[0], exceptionState);
522 else { 565 if (exceptionState.throwIfNeeded())
523 if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLUniformL ocation::hasInstance(info[0], info.GetIsolate(), worldType(info.GetIsolate()))) { 566 return;
524 throwUninformativeAndGenericTypeError(info.GetIsolate()); 567 } else {
568 const int uniformLocationArgumentIndex = 0;
569 if (info.Length() > 0 && !isUndefinedOrNull(info[uniformLocationArgument Index]) && !V8WebGLUniformLocation::hasInstance(info[uniformLocationArgumentInde x], info.GetIsolate(), worldType(info.GetIsolate()))) {
570 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentTy pe(uniformLocationArgumentIndex + 1, "is not a WebGLUniformLocation object."));
571 exceptionState.throwIfNeeded();
525 return; 572 return;
526 } 573 }
527 location = toWebGLUniformLocation(info[0], ok, info.GetIsolate()); 574 location = toWebGLUniformLocation(info[uniformLocationArgumentIndex], in fo.GetIsolate());
528 } 575 }
529 576
530 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 577 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
531 578
532 if (V8Float32Array::hasInstance(info[1], info.GetIsolate(), worldType(info.G etIsolate()))) { 579 const int indexArrayArgument = 1;
533 Float32Array* array = V8Float32Array::toNative(info[1]->ToObject()); 580 if (V8Float32Array::hasInstance(info[indexArrayArgument], info.GetIsolate(), worldType(info.GetIsolate()))) {
581 Float32Array* array = V8Float32Array::toNative(info[indexArrayArgument]- >ToObject());
534 ASSERT(array != NULL); 582 ASSERT(array != NULL);
535 switch (functionToCall) { 583 switch (functionToCall) {
536 case kUniform1v: context->uniform1fv(location, array); break; 584 case kUniform1v: context->uniform1fv(location, array); break;
537 case kUniform2v: context->uniform2fv(location, array); break; 585 case kUniform2v: context->uniform2fv(location, array); break;
538 case kUniform3v: context->uniform3fv(location, array); break; 586 case kUniform3v: context->uniform3fv(location, array); break;
539 case kUniform4v: context->uniform4fv(location, array); break; 587 case kUniform4v: context->uniform4fv(location, array); break;
540 case kVertexAttrib1v: context->vertexAttrib1fv(index, array); break; 588 case kVertexAttrib1v: context->vertexAttrib1fv(index, array); break;
541 case kVertexAttrib2v: context->vertexAttrib2fv(index, array); break; 589 case kVertexAttrib2v: context->vertexAttrib2fv(index, array); break;
542 case kVertexAttrib3v: context->vertexAttrib3fv(index, array); break; 590 case kVertexAttrib3v: context->vertexAttrib3fv(index, array); break;
543 case kVertexAttrib4v: context->vertexAttrib4fv(index, array); break; 591 case kVertexAttrib4v: context->vertexAttrib4fv(index, array); break;
544 default: ASSERT_NOT_REACHED(); break; 592 default: ASSERT_NOT_REACHED(); break;
545 } 593 }
546 return; 594 return;
547 } 595 }
548 596
549 if (info[1].IsEmpty() || !info[1]->IsArray()) { 597 if (info[indexArrayArgument].IsEmpty() || !info[indexArrayArgument]->IsArray ()) {
550 throwUninformativeAndGenericTypeError(info.GetIsolate()); 598 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(i ndexArrayArgument + 1, "is not an Array."));
599 exceptionState.throwIfNeeded();
551 return; 600 return;
552 } 601 }
553 v8::Handle<v8::Array> array = v8::Local<v8::Array>::Cast(info[1]); 602 v8::Handle<v8::Array> array = v8::Local<v8::Array>::Cast(info[1]);
554 uint32_t len = array->Length(); 603 uint32_t len = array->Length();
555 float* data = jsArrayToFloatArray(array, len); 604 float* data = jsArrayToFloatArray(array, len, exceptionState);
605 if (exceptionState.throwIfNeeded())
606 return;
556 if (!data) { 607 if (!data) {
557 // FIXME: consider different / better exception type. 608 // FIXME: consider different / better exception type.
558 setDOMException(SyntaxError, info.GetIsolate()); 609 exceptionState.throwDOMException(SyntaxError, "Failed to convert array a rgument");
610 exceptionState.throwIfNeeded();
559 return; 611 return;
560 } 612 }
561 switch (functionToCall) { 613 switch (functionToCall) {
562 case kUniform1v: context->uniform1fv(location, data, len); break; 614 case kUniform1v: context->uniform1fv(location, data, len); break;
563 case kUniform2v: context->uniform2fv(location, data, len); break; 615 case kUniform2v: context->uniform2fv(location, data, len); break;
564 case kUniform3v: context->uniform3fv(location, data, len); break; 616 case kUniform3v: context->uniform3fv(location, data, len); break;
565 case kUniform4v: context->uniform4fv(location, data, len); break; 617 case kUniform4v: context->uniform4fv(location, data, len); break;
566 case kVertexAttrib1v: context->vertexAttrib1fv(index, data, len); break; 618 case kVertexAttrib1v: context->vertexAttrib1fv(index, data, len); break;
567 case kVertexAttrib2v: context->vertexAttrib2fv(index, data, len); break; 619 case kVertexAttrib2v: context->vertexAttrib2fv(index, data, len); break;
568 case kVertexAttrib3v: context->vertexAttrib3fv(index, data, len); break; 620 case kVertexAttrib3v: context->vertexAttrib3fv(index, data, len); break;
569 case kVertexAttrib4v: context->vertexAttrib4fv(index, data, len); break; 621 case kVertexAttrib4v: context->vertexAttrib4fv(index, data, len); break;
570 default: ASSERT_NOT_REACHED(); break; 622 default: ASSERT_NOT_REACHED(); break;
571 } 623 }
572 fastFree(data); 624 fastFree(data);
573 } 625 }
574 626
575 static void uniformHelperi(const v8::FunctionCallbackInfo<v8::Value>& info, Func tionToCall functionToCall, const char* method) 627 static void uniformHelperi(const v8::FunctionCallbackInfo<v8::Value>& info, Func tionToCall functionToCall, ExceptionState& exceptionState)
576 { 628 {
577 // Forms: 629 // Forms:
578 // * glUniform1iv(GLUniformLocation location, Array data); 630 // * glUniform1iv(GLUniformLocation location, Array data);
579 // * glUniform1iv(GLUniformLocation location, Int32Array data); 631 // * glUniform1iv(GLUniformLocation location, Int32Array data);
580 // * glUniform2iv(GLUniformLocation location, Array data); 632 // * glUniform2iv(GLUniformLocation location, Array data);
581 // * glUniform2iv(GLUniformLocation location, Int32Array data); 633 // * glUniform2iv(GLUniformLocation location, Int32Array data);
582 // * glUniform3iv(GLUniformLocation location, Array data); 634 // * glUniform3iv(GLUniformLocation location, Array data);
583 // * glUniform3iv(GLUniformLocation location, Int32Array data); 635 // * glUniform3iv(GLUniformLocation location, Int32Array data);
584 // * glUniform4iv(GLUniformLocation location, Array data); 636 // * glUniform4iv(GLUniformLocation location, Array data);
585 // * glUniform4iv(GLUniformLocation location, Int32Array data); 637 // * glUniform4iv(GLUniformLocation location, Int32Array data);
586 638
587 if (info.Length() != 2) { 639 if (info.Length() != 2) {
588 throwTypeError(ExceptionMessages::failedToExecute(method, "WebGLRenderin gContext", ExceptionMessages::notEnoughArguments(2, info.Length())), info.GetIso late()); 640 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(2, i nfo.Length()));
641 exceptionState.throwIfNeeded();
589 return; 642 return;
590 } 643 }
591 644
645 const int uniformLocationArgumentIndex = 0;
592 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 646 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
593 if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLUniformLocat ion::hasInstance(info[0], info.GetIsolate(), worldType(info.GetIsolate()))) { 647 if (info.Length() > 0 && !isUndefinedOrNull(info[uniformLocationArgumentInde x]) && !V8WebGLUniformLocation::hasInstance(info[uniformLocationArgumentIndex], info.GetIsolate(), worldType(info.GetIsolate()))) {
594 throwUninformativeAndGenericTypeError(info.GetIsolate()); 648 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(u niformLocationArgumentIndex + 1, "is not a WebGLUniformLocation object."));
649 exceptionState.throwIfNeeded();
595 return; 650 return;
596 } 651 }
597 bool ok = false; 652 WebGLUniformLocation* location = toWebGLUniformLocation(info[uniformLocation ArgumentIndex], info.GetIsolate());
598 WebGLUniformLocation* location = toWebGLUniformLocation(info[0], ok, info.Ge tIsolate());
599 653
600 if (V8Int32Array::hasInstance(info[1], info.GetIsolate(), worldType(info.Get Isolate()))) { 654 const int indexArrayArgumentIndex = 1;
601 Int32Array* array = V8Int32Array::toNative(info[1]->ToObject()); 655 if (V8Int32Array::hasInstance(info[indexArrayArgumentIndex], info.GetIsolate (), worldType(info.GetIsolate()))) {
656 Int32Array* array = V8Int32Array::toNative(info[indexArrayArgumentIndex] ->ToObject());
602 ASSERT(array != NULL); 657 ASSERT(array != NULL);
603 switch (functionToCall) { 658 switch (functionToCall) {
604 case kUniform1v: context->uniform1iv(location, array); break; 659 case kUniform1v: context->uniform1iv(location, array); break;
605 case kUniform2v: context->uniform2iv(location, array); break; 660 case kUniform2v: context->uniform2iv(location, array); break;
606 case kUniform3v: context->uniform3iv(location, array); break; 661 case kUniform3v: context->uniform3iv(location, array); break;
607 case kUniform4v: context->uniform4iv(location, array); break; 662 case kUniform4v: context->uniform4iv(location, array); break;
608 default: ASSERT_NOT_REACHED(); break; 663 default: ASSERT_NOT_REACHED(); break;
609 } 664 }
610 return; 665 return;
611 } 666 }
612 667
613 if (info[1].IsEmpty() || !info[1]->IsArray()) { 668 if (info[indexArrayArgumentIndex].IsEmpty() || !info[indexArrayArgumentIndex ]->IsArray()) {
614 throwUninformativeAndGenericTypeError(info.GetIsolate()); 669 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(i ndexArrayArgumentIndex + 1, "is not an Array."));
670 exceptionState.throwIfNeeded();
615 return; 671 return;
616 } 672 }
617 v8::Handle<v8::Array> array = v8::Local<v8::Array>::Cast(info[1]); 673 v8::Handle<v8::Array> array = v8::Local<v8::Array>::Cast(info[indexArrayArgu mentIndex]);
618 uint32_t len = array->Length(); 674 uint32_t len = array->Length();
619 int* data = jsArrayToIntArray(array, len); 675 int* data = jsArrayToIntArray(array, len, exceptionState);
676 if (exceptionState.throwIfNeeded())
677 return;
620 if (!data) { 678 if (!data) {
621 // FIXME: consider different / better exception type. 679 // FIXME: consider different / better exception type.
622 setDOMException(SyntaxError, info.GetIsolate()); 680 exceptionState.throwDOMException(SyntaxError, "Failed to convert array a rgument");
681 exceptionState.throwIfNeeded();
623 return; 682 return;
624 } 683 }
625 switch (functionToCall) { 684 switch (functionToCall) {
626 case kUniform1v: context->uniform1iv(location, data, len); break; 685 case kUniform1v: context->uniform1iv(location, data, len); break;
627 case kUniform2v: context->uniform2iv(location, data, len); break; 686 case kUniform2v: context->uniform2iv(location, data, len); break;
628 case kUniform3v: context->uniform3iv(location, data, len); break; 687 case kUniform3v: context->uniform3iv(location, data, len); break;
629 case kUniform4v: context->uniform4iv(location, data, len); break; 688 case kUniform4v: context->uniform4iv(location, data, len); break;
630 default: ASSERT_NOT_REACHED(); break; 689 default: ASSERT_NOT_REACHED(); break;
631 } 690 }
632 fastFree(data); 691 fastFree(data);
633 } 692 }
634 693
635 void V8WebGLRenderingContext::uniform1fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 694 void V8WebGLRenderingContext::uniform1fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
636 { 695 {
637 vertexAttribAndUniformHelperf(info, kUniform1v, "uniform1fv"); 696 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform1fv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
697 vertexAttribAndUniformHelperf(info, kUniform1v, exceptionState);
638 } 698 }
639 699
640 void V8WebGLRenderingContext::uniform1ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 700 void V8WebGLRenderingContext::uniform1ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
641 { 701 {
642 uniformHelperi(info, kUniform1v, "uniform1iv"); 702 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform1iv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
703 uniformHelperi(info, kUniform1v, exceptionState);
643 } 704 }
644 705
645 void V8WebGLRenderingContext::uniform2fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 706 void V8WebGLRenderingContext::uniform2fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
646 { 707 {
647 vertexAttribAndUniformHelperf(info, kUniform2v, "uniform2fv"); 708 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform2fv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
709 vertexAttribAndUniformHelperf(info, kUniform2v, exceptionState);
648 } 710 }
649 711
650 void V8WebGLRenderingContext::uniform2ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 712 void V8WebGLRenderingContext::uniform2ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
651 { 713 {
652 uniformHelperi(info, kUniform2v, "uniform2iv"); 714 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform2iv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
715 uniformHelperi(info, kUniform2v, exceptionState);
653 } 716 }
654 717
655 void V8WebGLRenderingContext::uniform3fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 718 void V8WebGLRenderingContext::uniform3fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
656 { 719 {
657 vertexAttribAndUniformHelperf(info, kUniform3v, "uniform3fv"); 720 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform3fv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
721 vertexAttribAndUniformHelperf(info, kUniform3v, exceptionState);
658 } 722 }
659 723
660 void V8WebGLRenderingContext::uniform3ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 724 void V8WebGLRenderingContext::uniform3ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
661 { 725 {
662 uniformHelperi(info, kUniform3v, "uniform3iv"); 726 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform3iv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
727 uniformHelperi(info, kUniform3v, exceptionState);
663 } 728 }
664 729
665 void V8WebGLRenderingContext::uniform4fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 730 void V8WebGLRenderingContext::uniform4fvMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
666 { 731 {
667 vertexAttribAndUniformHelperf(info, kUniform4v, "uniform4fv"); 732 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform4fv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
733 vertexAttribAndUniformHelperf(info, kUniform4v, exceptionState);
668 } 734 }
669 735
670 void V8WebGLRenderingContext::uniform4ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info) 736 void V8WebGLRenderingContext::uniform4ivMethodCustom(const v8::FunctionCallbackI nfo<v8::Value>& info)
671 { 737 {
672 uniformHelperi(info, kUniform4v, "uniform4iv"); 738 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniform4iv" , "WebGLRenderingContext", info.Holder(), info.GetIsolate());
739 uniformHelperi(info, kUniform4v, exceptionState);
673 } 740 }
674 741
675 static void uniformMatrixHelper(const v8::FunctionCallbackInfo<v8::Value>& info, int matrixSize, const char* method) 742 static void uniformMatrixHelper(const v8::FunctionCallbackInfo<v8::Value>& info, int matrixSize, ExceptionState& exceptionState)
676 { 743 {
677 // Forms: 744 // Forms:
678 // * glUniformMatrix2fv(GLint location, GLboolean transpose, Array data); 745 // * glUniformMatrix2fv(GLint location, GLboolean transpose, Array data);
679 // * glUniformMatrix2fv(GLint location, GLboolean transpose, Float32Array da ta); 746 // * glUniformMatrix2fv(GLint location, GLboolean transpose, Float32Array da ta);
680 // * glUniformMatrix3fv(GLint location, GLboolean transpose, Array data); 747 // * glUniformMatrix3fv(GLint location, GLboolean transpose, Array data);
681 // * glUniformMatrix3fv(GLint location, GLboolean transpose, Float32Array da ta); 748 // * glUniformMatrix3fv(GLint location, GLboolean transpose, Float32Array da ta);
682 // * glUniformMatrix4fv(GLint location, GLboolean transpose, Array data); 749 // * glUniformMatrix4fv(GLint location, GLboolean transpose, Array data);
683 // * glUniformMatrix4fv(GLint location, GLboolean transpose, Float32Array da ta); 750 // * glUniformMatrix4fv(GLint location, GLboolean transpose, Float32Array da ta);
684 // 751 //
685 // FIXME: need to change to accept Float32Array as well. 752 // FIXME: need to change to accept Float32Array as well.
686 if (info.Length() != 3) { 753 if (info.Length() != 3) {
687 throwTypeError(ExceptionMessages::failedToExecute(method, "WebGLRenderin gContext", ExceptionMessages::notEnoughArguments(3, info.Length())), info.GetIso late()); 754 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments(3, i nfo.Length()));
755 exceptionState.throwIfNeeded();
688 return; 756 return;
689 } 757 }
690 758
691 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er()); 759 WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Hold er());
692 760
693 if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLUniformLocat ion::hasInstance(info[0], info.GetIsolate(), worldType(info.GetIsolate()))) { 761 const int uniformLocationArgumentIndex = 0;
694 throwUninformativeAndGenericTypeError(info.GetIsolate()); 762 if (info.Length() > 0 && !isUndefinedOrNull(info[uniformLocationArgumentInde x]) && !V8WebGLUniformLocation::hasInstance(info[uniformLocationArgumentIndex], info.GetIsolate(), worldType(info.GetIsolate()))) {
763 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(u niformLocationArgumentIndex + 1, "is not a WebGLUniformLocation object."));
764 exceptionState.throwIfNeeded();
695 return; 765 return;
696 } 766 }
697 bool ok = false; 767 WebGLUniformLocation* location = toWebGLUniformLocation(info[uniformLocation ArgumentIndex], info.GetIsolate());
698 WebGLUniformLocation* location = toWebGLUniformLocation(info[0], ok, info.Ge tIsolate());
699 768
700 bool transpose = info[1]->BooleanValue(); 769 bool transpose = info[1]->BooleanValue();
701 if (V8Float32Array::hasInstance(info[2], info.GetIsolate(), worldType(info.G etIsolate()))) { 770 const int arrayArgumentIndex = 2;
702 Float32Array* array = V8Float32Array::toNative(info[2]->ToObject()); 771 if (V8Float32Array::hasInstance(info[arrayArgumentIndex], info.GetIsolate(), worldType(info.GetIsolate()))) {
772 Float32Array* array = V8Float32Array::toNative(info[arrayArgumentIndex]- >ToObject());
703 ASSERT(array != NULL); 773 ASSERT(array != NULL);
704 switch (matrixSize) { 774 switch (matrixSize) {
705 case 2: context->uniformMatrix2fv(location, transpose, array); break; 775 case 2: context->uniformMatrix2fv(location, transpose, array); break;
706 case 3: context->uniformMatrix3fv(location, transpose, array); break; 776 case 3: context->uniformMatrix3fv(location, transpose, array); break;
707 case 4: context->uniformMatrix4fv(location, transpose, array); break; 777 case 4: context->uniformMatrix4fv(location, transpose, array); break;
708 default: ASSERT_NOT_REACHED(); break; 778 default: ASSERT_NOT_REACHED(); break;
709 } 779 }
710 return; 780 return;
711 } 781 }
712 782
713 if (info[2].IsEmpty() || !info[2]->IsArray()) { 783 if (info[arrayArgumentIndex].IsEmpty() || !info[arrayArgumentIndex]->IsArray ()) {
714 throwUninformativeAndGenericTypeError(info.GetIsolate()); 784 exceptionState.throwTypeError(ExceptionMessages::incorrectArgumentType(a rrayArgumentIndex + 1, "is not an Array."));
785 exceptionState.throwIfNeeded();
715 return; 786 return;
716 } 787 }
717 v8::Handle<v8::Array> array = v8::Local<v8::Array>::Cast(info[2]); 788 v8::Handle<v8::Array> array = v8::Local<v8::Array>::Cast(info[2]);
718 uint32_t len = array->Length(); 789 uint32_t len = array->Length();
719 float* data = jsArrayToFloatArray(array, len); 790 float* data = jsArrayToFloatArray(array, len, exceptionState);
791 if (exceptionState.throwIfNeeded())
792 return;
720 if (!data) { 793 if (!data) {
721 // FIXME: consider different / better exception type. 794 // FIXME: consider different / better exception type.
722 setDOMException(SyntaxError, info.GetIsolate()); 795 exceptionState.throwDOMException(SyntaxError, "failed to convert Array v alue");
796 exceptionState.throwIfNeeded();
723 return; 797 return;
724 } 798 }
725 switch (matrixSize) { 799 switch (matrixSize) {
726 case 2: context->uniformMatrix2fv(location, transpose, data, len); break; 800 case 2: context->uniformMatrix2fv(location, transpose, data, len); break;
727 case 3: context->uniformMatrix3fv(location, transpose, data, len); break; 801 case 3: context->uniformMatrix3fv(location, transpose, data, len); break;
728 case 4: context->uniformMatrix4fv(location, transpose, data, len); break; 802 case 4: context->uniformMatrix4fv(location, transpose, data, len); break;
729 default: ASSERT_NOT_REACHED(); break; 803 default: ASSERT_NOT_REACHED(); break;
730 } 804 }
731 fastFree(data); 805 fastFree(data);
732 } 806 }
733 807
734 void V8WebGLRenderingContext::uniformMatrix2fvMethodCustom(const v8::FunctionCal lbackInfo<v8::Value>& info) 808 void V8WebGLRenderingContext::uniformMatrix2fvMethodCustom(const v8::FunctionCal lbackInfo<v8::Value>& info)
735 { 809 {
736 uniformMatrixHelper(info, 2, "uniformMatrix2fv"); 810 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniformMatr ix2fv", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
811 uniformMatrixHelper(info, 2, exceptionState);
737 } 812 }
738 813
739 void V8WebGLRenderingContext::uniformMatrix3fvMethodCustom(const v8::FunctionCal lbackInfo<v8::Value>& info) 814 void V8WebGLRenderingContext::uniformMatrix3fvMethodCustom(const v8::FunctionCal lbackInfo<v8::Value>& info)
740 { 815 {
741 uniformMatrixHelper(info, 3, "uniformMatrix3fv"); 816 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniformMatr ix3fv", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
817 uniformMatrixHelper(info, 3, exceptionState);
742 } 818 }
743 819
744 void V8WebGLRenderingContext::uniformMatrix4fvMethodCustom(const v8::FunctionCal lbackInfo<v8::Value>& info) 820 void V8WebGLRenderingContext::uniformMatrix4fvMethodCustom(const v8::FunctionCal lbackInfo<v8::Value>& info)
745 { 821 {
746 uniformMatrixHelper(info, 4, "uniformMatrix4fv"); 822 ExceptionState exceptionState(ExceptionState::ExecutionContext, "uniformMatr ix4fv", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
823 uniformMatrixHelper(info, 4, exceptionState);
747 } 824 }
748 825
749 void V8WebGLRenderingContext::vertexAttrib1fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info) 826 void V8WebGLRenderingContext::vertexAttrib1fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info)
750 { 827 {
751 vertexAttribAndUniformHelperf(info, kVertexAttrib1v, "vertexAttrib1fv"); 828 ExceptionState exceptionState(ExceptionState::ExecutionContext, "vertexAttri b1fv", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
829 vertexAttribAndUniformHelperf(info, kVertexAttrib1v, exceptionState);
752 } 830 }
753 831
754 void V8WebGLRenderingContext::vertexAttrib2fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info) 832 void V8WebGLRenderingContext::vertexAttrib2fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info)
755 { 833 {
756 vertexAttribAndUniformHelperf(info, kVertexAttrib2v, "vertexAttrib2fv"); 834 ExceptionState exceptionState(ExceptionState::ExecutionContext, "vertexAttri b2fv", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
835 vertexAttribAndUniformHelperf(info, kVertexAttrib2v, exceptionState);
757 } 836 }
758 837
759 void V8WebGLRenderingContext::vertexAttrib3fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info) 838 void V8WebGLRenderingContext::vertexAttrib3fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info)
760 { 839 {
761 vertexAttribAndUniformHelperf(info, kVertexAttrib3v, "vertexAttrib3fv"); 840 ExceptionState exceptionState(ExceptionState::ExecutionContext, "vertexAttri b3fv", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
841 vertexAttribAndUniformHelperf(info, kVertexAttrib3v, exceptionState);
762 } 842 }
763 843
764 void V8WebGLRenderingContext::vertexAttrib4fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info) 844 void V8WebGLRenderingContext::vertexAttrib4fvMethodCustom(const v8::FunctionCall backInfo<v8::Value>& info)
765 { 845 {
766 vertexAttribAndUniformHelperf(info, kVertexAttrib4v, "vertexAttrib4fv"); 846 ExceptionState exceptionState(ExceptionState::ExecutionContext, "vertexAttri b4fv", "WebGLRenderingContext", info.Holder(), info.GetIsolate());
847 vertexAttribAndUniformHelperf(info, kVertexAttrib4v, exceptionState);
767 } 848 }
768 849
769 } // namespace WebCore 850 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/bindings/v8/custom/V8PromiseCustom.cpp ('k') | Source/modules/indexeddb/IDBCursor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698