Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make WebIDL static items take a more specific global if possible #14376

Merged
merged 4 commits into from Dec 1, 2016
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Expose WebGL-related interfaces only in Window

  • Loading branch information
nox committed Nov 30, 2016
commit 8af2327e95fe2f229df27074b868aad56bce2252
@@ -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))))
@@ -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)));
}
@@ -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 {
@@ -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)
}
}

@@ -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;
@@ -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)
}
}

@@ -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]
@@ -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);

{
@@ -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,
@@ -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;
@@ -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)
}
}
@@ -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 {
@@ -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)
}
}
@@ -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;
@@ -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)
}
}
@@ -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
@@ -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
@@ -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;
@@ -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)
}
}
@@ -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;
@@ -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();
@@ -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,
@@ -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
@@ -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
@@ -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()))
})
}

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.