Skip to content

Commit

Permalink
Expose WebGL-related interfaces only in Window
Browse files Browse the repository at this point in the history
  • Loading branch information
nox committed Nov 30, 2016
1 parent 6210bed commit 8af2327
Show file tree
Hide file tree
Showing 26 changed files with 82 additions and 67 deletions.
2 changes: 1 addition & 1 deletion components/script/dom/document.rs
Expand Up @@ -2426,7 +2426,7 @@ impl DocumentMethods for Document {
)
)),
"webglcontextevent" =>
Ok(Root::upcast(WebGLContextEvent::new_uninitialized(self.window.upcast()))),
Ok(Root::upcast(WebGLContextEvent::new_uninitialized(&self.window))),
"storageevent" => {
let USVString(url) = self.URL();
Ok(Root::upcast(StorageEvent::new_uninitialized(&self.window, DOMString::from(url))))
Expand Down
2 changes: 1 addition & 1 deletion components/script/dom/htmlcanvaselement.rs
Expand Up @@ -177,7 +177,7 @@ impl HTMLCanvasElement {
GLContextAttributes::default()
};

let maybe_ctx = WebGLRenderingContext::new(window.upcast(), self, size, attrs);
let maybe_ctx = WebGLRenderingContext::new(&window, self, size, attrs);

*self.context.borrow_mut() = maybe_ctx.map( |ctx| CanvasContext::WebGL(JS::from_ref(&*ctx)));
}
Expand Down
6 changes: 3 additions & 3 deletions components/script/dom/webglactiveinfo.rs
Expand Up @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::WebGLActiveInfoBinding::WebGLActiveInfoMet
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::bindings::str::DOMString;
use dom::globalscope::GlobalScope;
use dom::window::Window;

#[dom_struct]
pub struct WebGLActiveInfo {
Expand All @@ -29,8 +29,8 @@ impl WebGLActiveInfo {
}
}

pub fn new(global: &GlobalScope, size: i32, ty: u32, name: DOMString) -> Root<WebGLActiveInfo> {
reflect_dom_object(box WebGLActiveInfo::new_inherited(size, ty, name), global, WebGLActiveInfoBinding::Wrap)
pub fn new(window: &Window, size: i32, ty: u32, name: DOMString) -> Root<WebGLActiveInfo> {
reflect_dom_object(box WebGLActiveInfo::new_inherited(size, ty, name), window, WebGLActiveInfoBinding::Wrap)
}
}

Expand Down
10 changes: 5 additions & 5 deletions components/script/dom/webglbuffer.rs
Expand Up @@ -7,8 +7,8 @@ use canvas_traits::CanvasMsg;
use dom::bindings::codegen::Bindings::WebGLBufferBinding;
use dom::bindings::js::Root;
use dom::bindings::reflector::reflect_dom_object;
use dom::globalscope::GlobalScope;
use dom::webglobject::WebGLObject;
use dom::window::Window;
use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
use webrender_traits;
Expand Down Expand Up @@ -40,21 +40,21 @@ impl WebGLBuffer {
}
}

pub fn maybe_new(global: &GlobalScope, renderer: IpcSender<CanvasMsg>)
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
-> Option<Root<WebGLBuffer>> {
let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap();
renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateBuffer(sender))).unwrap();

let result = receiver.recv().unwrap();
result.map(|buffer_id| WebGLBuffer::new(global, renderer, buffer_id))
result.map(|buffer_id| WebGLBuffer::new(window, renderer, buffer_id))
}

pub fn new(global: &GlobalScope,
pub fn new(window: &Window,
renderer: IpcSender<CanvasMsg>,
id: WebGLBufferId)
-> Root<WebGLBuffer> {
reflect_dom_object(box WebGLBuffer::new_inherited(renderer, id),
global, WebGLBufferBinding::Wrap)
window, WebGLBufferBinding::Wrap)
}
}

Expand Down
11 changes: 6 additions & 5 deletions components/script/dom/webglcontextevent.rs
Expand Up @@ -13,6 +13,7 @@ use dom::bindings::reflector::reflect_dom_object;
use dom::bindings::str::DOMString;
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::globalscope::GlobalScope;
use dom::window::Window;
use servo_atoms::Atom;

#[dom_struct]
Expand Down Expand Up @@ -41,25 +42,25 @@ impl WebGLContextEvent {
}
}

pub fn new_uninitialized(global_ref: &GlobalScope) -> Root<WebGLContextEvent> {
pub fn new_uninitialized(window: &Window) -> Root<WebGLContextEvent> {
// according to https://www.khronos.org/registry/webgl/specs/1.0/#5.15 this is
// additional information or the empty string if no additional information is
// available.
let status_message = DOMString::new();
reflect_dom_object(
box WebGLContextEvent::new_inherited(status_message),
global_ref,
window,
WebGLContextEventBinding::Wrap)
}

pub fn new(global: &GlobalScope,
pub fn new(window: &Window,
type_: Atom,
bubbles: EventBubbles,
cancelable: EventCancelable,
status_message: DOMString) -> Root<WebGLContextEvent> {
let event = reflect_dom_object(
box WebGLContextEvent::new_inherited(status_message),
global,
window,
WebGLContextEventBinding::Wrap);

{
Expand All @@ -82,7 +83,7 @@ impl WebGLContextEvent {

let cancelable = EventCancelable::from(init.parent.cancelable);

Ok(WebGLContextEvent::new(global,
Ok(WebGLContextEvent::new(global.as_window(),
Atom::from(type_),
bubbles,
cancelable,
Expand Down
10 changes: 5 additions & 5 deletions components/script/dom/webglframebuffer.rs
Expand Up @@ -9,10 +9,10 @@ use dom::bindings::codegen::Bindings::WebGLFramebufferBinding;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use dom::bindings::js::{HeapGCValue, JS, Root};
use dom::bindings::reflector::reflect_dom_object;
use dom::globalscope::GlobalScope;
use dom::webglobject::WebGLObject;
use dom::webglrenderbuffer::WebGLRenderbuffer;
use dom::webgltexture::WebGLTexture;
use dom::window::Window;
use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
use webrender_traits;
Expand Down Expand Up @@ -66,21 +66,21 @@ impl WebGLFramebuffer {
}
}

pub fn maybe_new(global: &GlobalScope, renderer: IpcSender<CanvasMsg>)
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
-> Option<Root<WebGLFramebuffer>> {
let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap();
renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateFramebuffer(sender))).unwrap();

let result = receiver.recv().unwrap();
result.map(|fb_id| WebGLFramebuffer::new(global, renderer, fb_id))
result.map(|fb_id| WebGLFramebuffer::new(window, renderer, fb_id))
}

pub fn new(global: &GlobalScope,
pub fn new(window: &Window,
renderer: IpcSender<CanvasMsg>,
id: WebGLFramebufferId)
-> Root<WebGLFramebuffer> {
reflect_dom_object(box WebGLFramebuffer::new_inherited(renderer, id),
global,
window,
WebGLFramebufferBinding::Wrap)
}
}
Expand Down
6 changes: 3 additions & 3 deletions components/script/dom/webglobject.rs
Expand Up @@ -6,7 +6,7 @@
use dom::bindings::codegen::Bindings::WebGLObjectBinding;
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::globalscope::GlobalScope;
use dom::window::Window;

#[dom_struct]
pub struct WebGLObject {
Expand All @@ -20,7 +20,7 @@ impl WebGLObject {
}
}

pub fn new(global: &GlobalScope) -> Root<WebGLObject> {
reflect_dom_object(box WebGLObject::new_inherited(), global, WebGLObjectBinding::Wrap)
pub fn new(window: &Window) -> Root<WebGLObject> {
reflect_dom_object(box WebGLObject::new_inherited(), window, WebGLObjectBinding::Wrap)
}
}
14 changes: 7 additions & 7 deletions components/script/dom/webglprogram.rs
Expand Up @@ -9,11 +9,11 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderi
use dom::bindings::js::{JS, MutNullableHeap, Root};
use dom::bindings::reflector::{Reflectable, reflect_dom_object};
use dom::bindings::str::DOMString;
use dom::globalscope::GlobalScope;
use dom::webglactiveinfo::WebGLActiveInfo;
use dom::webglobject::WebGLObject;
use dom::webglrenderingcontext::MAX_UNIFORM_AND_ATTRIBUTE_LEN;
use dom::webglshader::WebGLShader;
use dom::window::Window;
use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
use webrender_traits;
Expand Down Expand Up @@ -49,21 +49,21 @@ impl WebGLProgram {
}
}

pub fn maybe_new(global: &GlobalScope, renderer: IpcSender<CanvasMsg>)
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
-> Option<Root<WebGLProgram>> {
let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap();
renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateProgram(sender))).unwrap();

let result = receiver.recv().unwrap();
result.map(|program_id| WebGLProgram::new(global, renderer, program_id))
result.map(|program_id| WebGLProgram::new(window, renderer, program_id))
}

pub fn new(global: &GlobalScope,
pub fn new(window: &Window,
renderer: IpcSender<CanvasMsg>,
id: WebGLProgramId)
-> Root<WebGLProgram> {
reflect_dom_object(box WebGLProgram::new_inherited(renderer, id),
global,
window,
WebGLProgramBinding::Wrap)
}
}
Expand Down Expand Up @@ -231,7 +231,7 @@ impl WebGLProgram {
.unwrap();

receiver.recv().unwrap().map(|(size, ty, name)|
WebGLActiveInfo::new(&self.global(), size, ty, DOMString::from(name)))
WebGLActiveInfo::new(self.global().as_window(), size, ty, DOMString::from(name)))
}

/// glGetActiveAttrib
Expand All @@ -245,7 +245,7 @@ impl WebGLProgram {
.unwrap();

receiver.recv().unwrap().map(|(size, ty, name)|
WebGLActiveInfo::new(&self.global(), size, ty, DOMString::from(name)))
WebGLActiveInfo::new(self.global().as_window(), size, ty, DOMString::from(name)))
}

/// glGetAttribLocation
Expand Down
10 changes: 5 additions & 5 deletions components/script/dom/webglrenderbuffer.rs
Expand Up @@ -8,8 +8,8 @@ use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use dom::bindings::js::Root;
use dom::bindings::reflector::reflect_dom_object;
use dom::globalscope::GlobalScope;
use dom::webglobject::WebGLObject;
use dom::window::Window;
use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
use webrender_traits;
Expand Down Expand Up @@ -42,21 +42,21 @@ impl WebGLRenderbuffer {
}
}

pub fn maybe_new(global: &GlobalScope, renderer: IpcSender<CanvasMsg>)
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
-> Option<Root<WebGLRenderbuffer>> {
let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap();
renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateRenderbuffer(sender))).unwrap();

let result = receiver.recv().unwrap();
result.map(|renderbuffer_id| WebGLRenderbuffer::new(global, renderer, renderbuffer_id))
result.map(|renderbuffer_id| WebGLRenderbuffer::new(window, renderer, renderbuffer_id))
}

pub fn new(global: &GlobalScope,
pub fn new(window: &Window,
renderer: IpcSender<CanvasMsg>,
id: WebGLRenderbufferId)
-> Root<WebGLRenderbuffer> {
reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id),
global,
window,
WebGLRenderbufferBinding::Wrap)
}
}
Expand Down
27 changes: 14 additions & 13 deletions components/script/dom/webglrenderingcontext.rs
Expand Up @@ -34,6 +34,7 @@ use dom::webglrenderbuffer::WebGLRenderbuffer;
use dom::webglshader::WebGLShader;
use dom::webgltexture::{TexParameterValue, WebGLTexture};
use dom::webgluniformlocation::WebGLUniformLocation;
use dom::window::Window;
use euclid::size::Size2D;
use ipc_channel::ipc::{self, IpcSender};
use js::conversions::ConversionBehavior;
Expand Down Expand Up @@ -135,13 +136,13 @@ pub struct WebGLRenderingContext {
}

impl WebGLRenderingContext {
fn new_inherited(global: &GlobalScope,
fn new_inherited(window: &Window,
canvas: &HTMLCanvasElement,
size: Size2D<i32>,
attrs: GLContextAttributes)
-> Result<WebGLRenderingContext, String> {
let (sender, receiver) = ipc::channel().unwrap();
let constellation_chan = global.constellation_chan();
let constellation_chan = window.upcast::<GlobalScope>().constellation_chan();
constellation_chan.send(ConstellationMsg::CreateWebGLPaintThread(size, attrs, sender))
.unwrap();
let result = receiver.recv().unwrap();
Expand All @@ -167,13 +168,13 @@ impl WebGLRenderingContext {
}

#[allow(unrooted_must_root)]
pub fn new(global: &GlobalScope, canvas: &HTMLCanvasElement, size: Size2D<i32>, attrs: GLContextAttributes)
pub fn new(window: &Window, canvas: &HTMLCanvasElement, size: Size2D<i32>, attrs: GLContextAttributes)
-> Option<Root<WebGLRenderingContext>> {
match WebGLRenderingContext::new_inherited(global, canvas, size, attrs) {
Ok(ctx) => Some(reflect_dom_object(box ctx, global, WebGLRenderingContextBinding::Wrap)),
match WebGLRenderingContext::new_inherited(window, canvas, size, attrs) {
Ok(ctx) => Some(reflect_dom_object(box ctx, window, WebGLRenderingContextBinding::Wrap)),
Err(msg) => {
error!("Couldn't create WebGLRenderingContext: {}", msg);
let event = WebGLContextEvent::new(global,
let event = WebGLContextEvent::new(window,
atom!("webglcontextcreationerror"),
EventBubbles::DoesNotBubble,
EventCancelable::Cancelable,
Expand Down Expand Up @@ -1248,27 +1249,27 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// generated objects, either here or in the webgl thread
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
fn CreateBuffer(&self) -> Option<Root<WebGLBuffer>> {
WebGLBuffer::maybe_new(&self.global(), self.ipc_renderer.clone())
WebGLBuffer::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
}

// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6
fn CreateFramebuffer(&self) -> Option<Root<WebGLFramebuffer>> {
WebGLFramebuffer::maybe_new(&self.global(), self.ipc_renderer.clone())
WebGLFramebuffer::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
}

// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7
fn CreateRenderbuffer(&self) -> Option<Root<WebGLRenderbuffer>> {
WebGLRenderbuffer::maybe_new(&self.global(), self.ipc_renderer.clone())
WebGLRenderbuffer::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
}

// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
fn CreateTexture(&self) -> Option<Root<WebGLTexture>> {
WebGLTexture::maybe_new(&self.global(), self.ipc_renderer.clone())
WebGLTexture::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
}

// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn CreateProgram(&self) -> Option<Root<WebGLProgram>> {
WebGLProgram::maybe_new(&self.global(), self.ipc_renderer.clone())
WebGLProgram::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
}

// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
Expand All @@ -1280,7 +1281,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return None;
}
}
WebGLShader::maybe_new(&self.global(), self.ipc_renderer.clone(), shader_type)
WebGLShader::maybe_new(self.global().as_window(), self.ipc_renderer.clone(), shader_type)
}

// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
Expand Down Expand Up @@ -1612,7 +1613,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
name: DOMString) -> Option<Root<WebGLUniformLocation>> {
program.and_then(|p| {
handle_potential_webgl_error!(self, p.get_uniform_location(name), None)
.map(|location| WebGLUniformLocation::new(&self.global(), location, p.id()))
.map(|location| WebGLUniformLocation::new(self.global().as_window(), location, p.id()))
})
}

Expand Down

0 comments on commit 8af2327

Please sign in to comment.