123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /*
- * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <LibWeb/DOM/Document.h>
- #include <LibWeb/HTML/HTMLCanvasElement.h>
- #include <LibWeb/HTML/Window.h>
- #include <LibWeb/WebGL/WebGLContextEvent.h>
- #include <LibWeb/WebGL/WebGLRenderingContext.h>
- namespace Web::WebGL {
- // https://www.khronos.org/registry/webgl/specs/latest/1.0/#fire-a-webgl-context-event
- static void fire_webgl_context_event(HTML::HTMLCanvasElement& canvas_element, FlyString const& type)
- {
- // To fire a WebGL context event named e means that an event using the WebGLContextEvent interface, with its type attribute [DOM4] initialized to e, its cancelable attribute initialized to true, and its isTrusted attribute [DOM4] initialized to true, is to be dispatched at the given object.
- // FIXME: Consider setting a status message.
- auto event = WebGLContextEvent::create(canvas_element.document().window(), type, WebGLContextEventInit {});
- event->set_is_trusted(true);
- event->set_cancelable(true);
- canvas_element.dispatch_event(*event);
- }
- // https://www.khronos.org/registry/webgl/specs/latest/1.0/#fire-a-webgl-context-creation-error
- static void fire_webgl_context_creation_error(HTML::HTMLCanvasElement& canvas_element)
- {
- // 1. Fire a WebGL context event named "webglcontextcreationerror" at canvas, optionally with its statusMessage attribute set to a platform dependent string about the nature of the failure.
- fire_webgl_context_event(canvas_element, "webglcontextcreationerror"sv);
- }
- JS::ThrowCompletionOr<JS::GCPtr<WebGLRenderingContext>> WebGLRenderingContext::create(HTML::Window& window, HTML::HTMLCanvasElement& canvas_element, JS::Value options)
- {
- // We should be coming here from getContext being called on a wrapped <canvas> element.
- auto context_attributes = TRY(convert_value_to_context_attributes_dictionary(canvas_element.vm(), options));
- bool created_bitmap = canvas_element.create_bitmap(/* minimum_width= */ 1, /* minimum_height= */ 1);
- if (!created_bitmap) {
- fire_webgl_context_creation_error(canvas_element);
- return JS::GCPtr<WebGLRenderingContext> { nullptr };
- }
- auto context_or_error = GL::create_context(*canvas_element.bitmap());
- if (context_or_error.is_error()) {
- fire_webgl_context_creation_error(canvas_element);
- return JS::GCPtr<WebGLRenderingContext> { nullptr };
- }
- return window.heap().allocate<WebGLRenderingContext>(window.realm(), window, canvas_element, context_or_error.release_value(), context_attributes, context_attributes);
- }
- WebGLRenderingContext::WebGLRenderingContext(HTML::Window& window, HTML::HTMLCanvasElement& canvas_element, NonnullOwnPtr<GL::GLContext> context, WebGLContextAttributes context_creation_parameters, WebGLContextAttributes actual_context_parameters)
- : WebGLRenderingContextBase(window, canvas_element, move(context), move(context_creation_parameters), move(actual_context_parameters))
- {
- set_prototype(&window.cached_web_prototype("WebGLRenderingContext"));
- }
- WebGLRenderingContext::~WebGLRenderingContext() = default;
- }
|