diff options
Diffstat (limited to 'Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp')
-rw-r--r-- | Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp b/Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp new file mode 100644 index 000000000..66d7ebd04 --- /dev/null +++ b/Source/WebCore/bindings/js/JSWebGLRenderingContextBaseCustom.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2015-2017 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#if ENABLE(WEBGL) + +#include "EXTBlendMinMax.h" +#include "EXTFragDepth.h" +#include "EXTShaderTextureLOD.h" +#include "EXTTextureFilterAnisotropic.h" +#include "EXTsRGB.h" +#include "ExceptionCode.h" +#include "JSANGLEInstancedArrays.h" +#include "JSEXTBlendMinMax.h" +#include "JSEXTFragDepth.h" +#include "JSEXTShaderTextureLOD.h" +#include "JSEXTTextureFilterAnisotropic.h" +#include "JSEXTsRGB.h" +#include "JSHTMLCanvasElement.h" +#include "JSHTMLImageElement.h" +#include "JSImageData.h" +#include "JSOESElementIndexUint.h" +#include "JSOESStandardDerivatives.h" +#include "JSOESTextureFloat.h" +#include "JSOESTextureFloatLinear.h" +#include "JSOESTextureHalfFloat.h" +#include "JSOESTextureHalfFloatLinear.h" +#include "JSOESVertexArrayObject.h" +#include "JSWebGLBuffer.h" +#include "JSWebGLCompressedTextureATC.h" +#include "JSWebGLCompressedTexturePVRTC.h" +#include "JSWebGLCompressedTextureS3TC.h" +#include "JSWebGLDebugRendererInfo.h" +#include "JSWebGLDebugShaders.h" +#include "JSWebGLDepthTexture.h" +#include "JSWebGLDrawBuffers.h" +#include "JSWebGLFramebuffer.h" +#include "JSWebGLLoseContext.h" +#include "JSWebGLProgram.h" +#include "JSWebGLRenderbuffer.h" +#include "JSWebGLRenderingContext.h" +#include "JSWebGLShader.h" +#include "JSWebGLTexture.h" +#include "JSWebGLUniformLocation.h" +#include "JSWebGLVertexArrayObject.h" +#include "JSWebGLVertexArrayObjectOES.h" +#include "JSWebKitCSSMatrix.h" +#include "OESElementIndexUint.h" +#include "OESStandardDerivatives.h" +#include "OESTextureFloat.h" +#include "OESTextureFloatLinear.h" +#include "OESTextureHalfFloat.h" +#include "OESTextureHalfFloatLinear.h" +#include "OESVertexArrayObject.h" +#include "WebGLBuffer.h" +#include "WebGLCompressedTextureATC.h" +#include "WebGLCompressedTexturePVRTC.h" +#include "WebGLCompressedTextureS3TC.h" +#include "WebGLDebugRendererInfo.h" +#include "WebGLDebugShaders.h" +#include "WebGLDepthTexture.h" +#include "WebGLDrawBuffers.h" +#include "WebGLExtension.h" +#include "WebGLFramebuffer.h" +#include "WebGLLoseContext.h" +#include "WebGLProgram.h" +#include "WebGLRenderingContextBase.h" +#include "WebGLVertexArrayObject.h" +#include "WebGLVertexArrayObjectOES.h" +#include <runtime/Error.h> +#include <runtime/JSObjectInlines.h> +#include <runtime/JSTypedArrays.h> +#include <runtime/TypedArrayInlines.h> +#include <runtime/TypedArrays.h> +#include <wtf/FastMalloc.h> + +#if ENABLE(VIDEO) +#include "JSHTMLVideoElement.h" +#endif + +#if ENABLE(WEBGL2) +#include "JSWebGL2RenderingContext.h" +#endif + +using namespace JSC; + +namespace WebCore { + +JSValue toJSNewlyCreated(ExecState*, JSDOMGlobalObject* globalObject, Ref<WebGLRenderingContextBase>&& object) +{ +#if ENABLE(WEBGL2) + if (is<WebGL2RenderingContext>(object)) + return createWrapper<WebGL2RenderingContext>(globalObject, WTFMove(object)); +#endif + return createWrapper<WebGLRenderingContext>(globalObject, WTFMove(object)); +} + +JSValue toJS(ExecState* state, JSDOMGlobalObject* globalObject, WebGLRenderingContextBase& object) +{ + return wrap(state, globalObject, object); +} + +static JSValue toJS(ExecState& state, JSDOMGlobalObject& globalObject, WebGLExtension* extension) +{ + if (!extension) + return jsNull(); + switch (extension->getName()) { + case WebGLExtension::WebGLLoseContextName: + return toJS(&state, &globalObject, static_cast<WebGLLoseContext*>(extension)); + case WebGLExtension::EXTShaderTextureLODName: + return toJS(&state, &globalObject, static_cast<EXTShaderTextureLOD*>(extension)); + case WebGLExtension::EXTTextureFilterAnisotropicName: + return toJS(&state, &globalObject, static_cast<EXTTextureFilterAnisotropic*>(extension)); + case WebGLExtension::EXTsRGBName: + return toJS(&state, &globalObject, static_cast<EXTsRGB*>(extension)); + case WebGLExtension::EXTFragDepthName: + return toJS(&state, &globalObject, static_cast<EXTFragDepth*>(extension)); + case WebGLExtension::EXTBlendMinMaxName: + return toJS(&state, &globalObject, static_cast<EXTBlendMinMax*>(extension)); + case WebGLExtension::OESStandardDerivativesName: + return toJS(&state, &globalObject, static_cast<OESStandardDerivatives*>(extension)); + case WebGLExtension::OESTextureFloatName: + return toJS(&state, &globalObject, static_cast<OESTextureFloat*>(extension)); + case WebGLExtension::OESTextureFloatLinearName: + return toJS(&state, &globalObject, static_cast<OESTextureFloatLinear*>(extension)); + case WebGLExtension::OESTextureHalfFloatName: + return toJS(&state, &globalObject, static_cast<OESTextureHalfFloat*>(extension)); + case WebGLExtension::OESTextureHalfFloatLinearName: + return toJS(&state, &globalObject, static_cast<OESTextureHalfFloatLinear*>(extension)); + case WebGLExtension::OESVertexArrayObjectName: + return toJS(&state, &globalObject, static_cast<OESVertexArrayObject*>(extension)); + case WebGLExtension::OESElementIndexUintName: + return toJS(&state, &globalObject, static_cast<OESElementIndexUint*>(extension)); + case WebGLExtension::WebGLDebugRendererInfoName: + return toJS(&state, &globalObject, static_cast<WebGLDebugRendererInfo*>(extension)); + case WebGLExtension::WebGLDebugShadersName: + return toJS(&state, &globalObject, static_cast<WebGLDebugShaders*>(extension)); + case WebGLExtension::WebGLCompressedTextureATCName: + return toJS(&state, &globalObject, static_cast<WebGLCompressedTextureATC*>(extension)); + case WebGLExtension::WebGLCompressedTexturePVRTCName: + return toJS(&state, &globalObject, static_cast<WebGLCompressedTexturePVRTC*>(extension)); + case WebGLExtension::WebGLCompressedTextureS3TCName: + return toJS(&state, &globalObject, static_cast<WebGLCompressedTextureS3TC*>(extension)); + case WebGLExtension::WebGLDepthTextureName: + return toJS(&state, &globalObject, static_cast<WebGLDepthTexture*>(extension)); + case WebGLExtension::WebGLDrawBuffersName: + return toJS(&state, &globalObject, static_cast<WebGLDrawBuffers*>(extension)); + case WebGLExtension::ANGLEInstancedArraysName: + return toJS(&state, &globalObject, static_cast<ANGLEInstancedArrays*>(extension)); + } + ASSERT_NOT_REACHED(); + return jsNull(); +} + +bool JSWebGLRenderingContextBaseOwner::isReachableFromOpaqueRoots(Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) +{ + JSWebGLRenderingContextBase* jsWebGLRenderingContext = jsCast<JSWebGLRenderingContextBase*>(handle.slot()->asCell()); + void* root = WebCore::root(jsWebGLRenderingContext->wrapped().canvas()); + return visitor.containsOpaqueRoot(root); +} + +void JSWebGLRenderingContextBase::visitAdditionalChildren(SlotVisitor& visitor) +{ + visitor.addOpaqueRoot(&wrapped()); + visitor.addOpaqueRoot(root(wrapped().canvas())); +} + +JSValue JSWebGLRenderingContextBase::getExtension(ExecState& state) +{ + VM& vm = state.vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + if (state.argumentCount() < 1) + return throwException(&state, scope, createNotEnoughArgumentsError(&state)); + + auto name = state.uncheckedArgument(0).toWTFString(&state); + RETURN_IF_EXCEPTION(scope, { }); + return toJS(state, *globalObject(), wrapped().getExtension(name)); +} + +} // namespace WebCore + +#endif // ENABLE(WEBGL) |