WebGLContextAttributes toWebGLContextAttributes(const CanvasContextCreationAttributes& attrs) { WebGLContextAttributes result; result.setAlpha(attrs.alpha()); result.setDepth(attrs.depth()); result.setStencil(attrs.stencil()); result.setAntialias(attrs.antialias()); result.setPremultipliedAlpha(attrs.premultipliedAlpha()); result.setPreserveDrawingBuffer(attrs.preserveDrawingBuffer()); result.setFailIfMajorPerformanceCaveat(attrs.failIfMajorPerformanceCaveat()); return result; }
JSValue JSHTMLCanvasElement::getContext(ExecState* exec) { HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(impl()); const UString& contextId = exec->argument(0).toString(exec)->value(exec); RefPtr<CanvasContextAttributes> attrs; #if ENABLE(WEBGL) if (contextId == "experimental-webgl" || contextId == "webkit-3d") { attrs = WebGLContextAttributes::create(); WebGLContextAttributes* webGLAttrs = static_cast<WebGLContextAttributes*>(attrs.get()); if (exec->argumentCount() > 1 && exec->argument(1).isObject()) { JSObject* jsAttrs = exec->argument(1).getObject(); Identifier alpha(exec, "alpha"); if (jsAttrs->hasProperty(exec, alpha)) webGLAttrs->setAlpha(jsAttrs->get(exec, alpha).toBoolean(exec)); Identifier depth(exec, "depth"); if (jsAttrs->hasProperty(exec, depth)) webGLAttrs->setDepth(jsAttrs->get(exec, depth).toBoolean(exec)); Identifier stencil(exec, "stencil"); if (jsAttrs->hasProperty(exec, stencil)) webGLAttrs->setStencil(jsAttrs->get(exec, stencil).toBoolean(exec)); Identifier antialias(exec, "antialias"); if (jsAttrs->hasProperty(exec, antialias)) webGLAttrs->setAntialias(jsAttrs->get(exec, antialias).toBoolean(exec)); Identifier premultipliedAlpha(exec, "premultipliedAlpha"); if (jsAttrs->hasProperty(exec, premultipliedAlpha)) webGLAttrs->setPremultipliedAlpha(jsAttrs->get(exec, premultipliedAlpha).toBoolean(exec)); Identifier preserveDrawingBuffer(exec, "preserveDrawingBuffer"); if (jsAttrs->hasProperty(exec, preserveDrawingBuffer)) webGLAttrs->setPreserveDrawingBuffer(jsAttrs->get(exec, preserveDrawingBuffer).toBoolean(exec)); } } #endif CanvasRenderingContext* context = canvas->getContext(ustringToString(contextId), attrs.get()); if (!context) return jsNull(); JSValue jsValue = toJS(exec, globalObject(), WTF::getPtr(context)); #if ENABLE(WEBGL) if (context->is3d() && InspectorInstrumentation::hasFrontends()) { ScriptObject glContext(exec, jsValue.getObject()); ScriptObject wrapped = InspectorInstrumentation::wrapWebGLRenderingContextForInstrumentation(canvas->document(), glContext); if (!wrapped.hasNoValue()) return wrapped.jsValue(); } #endif return jsValue; }
void setJSWebGLContextAttributesPreserveDrawingBuffer(ExecState* exec, JSObject* thisObject, JSValue value) { JSWebGLContextAttributes* castedThis = static_cast<JSWebGLContextAttributes*>(thisObject); WebGLContextAttributes* imp = static_cast<WebGLContextAttributes*>(castedThis->impl()); imp->setPreserveDrawingBuffer(value.toBoolean(exec)); }
v8::Handle<v8::Value> V8HTMLCanvasElement::getContextCallback(const v8::Arguments& args) { INC_STATS("DOM.HTMLCanvasElement.context"); v8::Handle<v8::Object> holder = args.Holder(); HTMLCanvasElement* imp = V8HTMLCanvasElement::toNative(holder); String contextId = toWebCoreString(args[0]); RefPtr<CanvasContextAttributes> attrs; #if ENABLE(WEBGL) if (contextId == "experimental-webgl" || contextId == "webkit-3d") { attrs = WebGLContextAttributes::create(); WebGLContextAttributes* webGLAttrs = static_cast<WebGLContextAttributes*>(attrs.get()); if (args.Length() > 1 && args[1]->IsObject()) { v8::Handle<v8::Object> jsAttrs = args[1]->ToObject(); v8::Handle<v8::String> alpha = v8::String::New("alpha"); if (jsAttrs->Has(alpha)) webGLAttrs->setAlpha(jsAttrs->Get(alpha)->BooleanValue()); v8::Handle<v8::String> depth = v8::String::New("depth"); if (jsAttrs->Has(depth)) webGLAttrs->setDepth(jsAttrs->Get(depth)->BooleanValue()); v8::Handle<v8::String> stencil = v8::String::New("stencil"); if (jsAttrs->Has(stencil)) webGLAttrs->setStencil(jsAttrs->Get(stencil)->BooleanValue()); v8::Handle<v8::String> antialias = v8::String::New("antialias"); if (jsAttrs->Has(antialias)) webGLAttrs->setAntialias(jsAttrs->Get(antialias)->BooleanValue()); v8::Handle<v8::String> premultipliedAlpha = v8::String::New("premultipliedAlpha"); if (jsAttrs->Has(premultipliedAlpha)) webGLAttrs->setPremultipliedAlpha(jsAttrs->Get(premultipliedAlpha)->BooleanValue()); v8::Handle<v8::String> preserveDrawingBuffer = v8::String::New("preserveDrawingBuffer"); if (jsAttrs->Has(preserveDrawingBuffer)) webGLAttrs->setPreserveDrawingBuffer(jsAttrs->Get(preserveDrawingBuffer)->BooleanValue()); } } #endif CanvasRenderingContext* result = imp->getContext(contextId, attrs.get()); if (!result) return v8::Null(args.GetIsolate()); else if (result->is2d()) { v8::Handle<v8::Value> v8Result = toV8(static_cast<CanvasRenderingContext2D*>(result), args.Holder(), args.GetIsolate()); if (InspectorInstrumentation::canvasAgentEnabled(imp->document())) { ScriptState* scriptState = ScriptState::forContext(v8::Context::GetCurrent()); ScriptObject context(scriptState, v8::Handle<v8::Object>::Cast(v8Result)); ScriptObject wrapped = InspectorInstrumentation::wrapCanvas2DRenderingContextForInstrumentation(imp->document(), context); if (!wrapped.hasNoValue()) return wrapped.v8Value(); } return v8Result; } #if ENABLE(WEBGL) else if (result->is3d()) { // 3D canvas contexts can hold on to lots of GPU resources, and we want to take an // opportunity to get rid of them as soon as possible when we navigate away from pages using // them. V8PerIsolateData* perIsolateData = V8PerIsolateData::from(args.GetIsolate()); perIsolateData->setShouldCollectGarbageSoon(); v8::Handle<v8::Value> v8Result = toV8(static_cast<WebGLRenderingContext*>(result), args.Holder(), args.GetIsolate()); if (InspectorInstrumentation::canvasAgentEnabled(imp->document())) { ScriptState* scriptState = ScriptState::forContext(v8::Context::GetCurrent()); ScriptObject glContext(scriptState, v8::Handle<v8::Object>::Cast(v8Result)); ScriptObject wrapped = InspectorInstrumentation::wrapWebGLRenderingContextForInstrumentation(imp->document(), glContext); if (!wrapped.hasNoValue()) return wrapped.v8Value(); } return v8Result; } #endif ASSERT_NOT_REACHED(); return v8::Null(args.GetIsolate()); }