From 6210bede8b978a353b217f96de3ac120c25ff17c Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 27 Nov 2016 12:42:36 +0100 Subject: [PATCH 1/4] Expose DOMMatrix in Window and Worker --- components/script/dom/webidls/DOMMatrix.webidl | 7 +++---- components/script/dom/webidls/DOMMatrixReadOnly.webidl | 7 +++---- tests/wpt/mozilla/tests/mozilla/interfaces.worker.js | 2 ++ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/script/dom/webidls/DOMMatrix.webidl b/components/script/dom/webidls/DOMMatrix.webidl index d8306d315fb..d1dd65e8a63 100644 --- a/components/script/dom/webidls/DOMMatrix.webidl +++ b/components/script/dom/webidls/DOMMatrix.webidl @@ -11,10 +11,9 @@ */ [Constructor, -// Constructor(DOMString transformList), -Constructor(sequence numberSequence) -// Exposed=(Window,Worker) -] + // Constructor(DOMString transformList), + Constructor(sequence numberSequence), + Exposed=(Window,Worker)] interface DOMMatrix : DOMMatrixReadOnly { [NewObject, Throws] static DOMMatrix fromMatrix(optional DOMMatrixInit other); diff --git a/components/script/dom/webidls/DOMMatrixReadOnly.webidl b/components/script/dom/webidls/DOMMatrixReadOnly.webidl index 6d92a6b0828..9261002e348 100644 --- a/components/script/dom/webidls/DOMMatrixReadOnly.webidl +++ b/components/script/dom/webidls/DOMMatrixReadOnly.webidl @@ -11,10 +11,9 @@ */ [Constructor, -// Constructor(DOMString transformList) -Constructor(sequence numberSequence), -// Exposed=(Window,Worker) -] + // Constructor(DOMString transformList) + Constructor(sequence numberSequence), + Exposed=(Window,Worker)] interface DOMMatrixReadOnly { [NewObject, Throws] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInit other); diff --git a/tests/wpt/mozilla/tests/mozilla/interfaces.worker.js b/tests/wpt/mozilla/tests/mozilla/interfaces.worker.js index 15c6e2d60c6..eca4a7562b6 100644 --- a/tests/wpt/mozilla/tests/mozilla/interfaces.worker.js +++ b/tests/wpt/mozilla/tests/mozilla/interfaces.worker.js @@ -11,6 +11,8 @@ test_interfaces([ "Blob", "CloseEvent", "CSSStyleDeclaration", + "DOMMatrix", + "DOMMatrixReadOnly", "DOMPoint", "DOMPointReadOnly", "DOMQuad", From 8af2327e95fe2f229df27074b868aad56bce2252 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 27 Nov 2016 13:29:22 +0100 Subject: [PATCH 2/4] Expose WebGL-related interfaces only in Window --- components/script/dom/document.rs | 2 +- components/script/dom/htmlcanvaselement.rs | 2 +- components/script/dom/webglactiveinfo.rs | 6 ++--- components/script/dom/webglbuffer.rs | 10 +++---- components/script/dom/webglcontextevent.rs | 11 ++++---- components/script/dom/webglframebuffer.rs | 10 +++---- components/script/dom/webglobject.rs | 6 ++--- components/script/dom/webglprogram.rs | 14 +++++----- components/script/dom/webglrenderbuffer.rs | 10 +++---- .../script/dom/webglrenderingcontext.rs | 27 ++++++++++--------- components/script/dom/webglshader.rs | 13 ++++----- .../script/dom/webglshaderprecisionformat.rs | 6 ++--- components/script/dom/webgltexture.rs | 10 +++---- components/script/dom/webgluniformlocation.rs | 6 ++--- .../script/dom/webidls/WebGLActiveInfo.webidl | 1 + .../script/dom/webidls/WebGLBuffer.webidl | 1 + .../dom/webidls/WebGLContextEvent.webidl | 3 ++- .../dom/webidls/WebGLFramebuffer.webidl | 1 + .../script/dom/webidls/WebGLObject.webidl | 1 + .../script/dom/webidls/WebGLProgram.webidl | 1 + .../dom/webidls/WebGLRenderbuffer.webidl | 1 + .../dom/webidls/WebGLRenderingContext.webidl | 3 ++- .../script/dom/webidls/WebGLShader.webidl | 1 + .../webidls/WebGLShaderPrecisionFormat.webidl | 1 + .../script/dom/webidls/WebGLTexture.webidl | 1 + .../dom/webidls/WebGLUniformLocation.webidl | 1 + 26 files changed, 82 insertions(+), 67 deletions(-) diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 7c2e284dd2c..5334402867c 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -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)))) diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index b5621364c13..b9d7731d652 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -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))); } diff --git a/components/script/dom/webglactiveinfo.rs b/components/script/dom/webglactiveinfo.rs index ff82ce3b05f..515d6afa4a0 100644 --- a/components/script/dom/webglactiveinfo.rs +++ b/components/script/dom/webglactiveinfo.rs @@ -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 { - 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 { + reflect_dom_object(box WebGLActiveInfo::new_inherited(size, ty, name), window, WebGLActiveInfoBinding::Wrap) } } diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs index 6e19c00ae9f..752511df67a 100644 --- a/components/script/dom/webglbuffer.rs +++ b/components/script/dom/webglbuffer.rs @@ -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) + pub fn maybe_new(window: &Window, renderer: IpcSender) -> Option> { 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, id: WebGLBufferId) -> Root { reflect_dom_object(box WebGLBuffer::new_inherited(renderer, id), - global, WebGLBufferBinding::Wrap) + window, WebGLBufferBinding::Wrap) } } diff --git a/components/script/dom/webglcontextevent.rs b/components/script/dom/webglcontextevent.rs index c128515e81a..60b8209c56a 100644 --- a/components/script/dom/webglcontextevent.rs +++ b/components/script/dom/webglcontextevent.rs @@ -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 { + pub fn new_uninitialized(window: &Window) -> Root { // 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 { 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, diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs index 643661d67d4..02a767958e2 100644 --- a/components/script/dom/webglframebuffer.rs +++ b/components/script/dom/webglframebuffer.rs @@ -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) + pub fn maybe_new(window: &Window, renderer: IpcSender) -> Option> { 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, id: WebGLFramebufferId) -> Root { reflect_dom_object(box WebGLFramebuffer::new_inherited(renderer, id), - global, + window, WebGLFramebufferBinding::Wrap) } } diff --git a/components/script/dom/webglobject.rs b/components/script/dom/webglobject.rs index 0964fc5d0cf..9c7382ce5b5 100644 --- a/components/script/dom/webglobject.rs +++ b/components/script/dom/webglobject.rs @@ -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 { - reflect_dom_object(box WebGLObject::new_inherited(), global, WebGLObjectBinding::Wrap) + pub fn new(window: &Window) -> Root { + reflect_dom_object(box WebGLObject::new_inherited(), window, WebGLObjectBinding::Wrap) } } diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 47807a8086e..2e5188269fa 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -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) + pub fn maybe_new(window: &Window, renderer: IpcSender) -> Option> { 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, id: WebGLProgramId) -> Root { 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 diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index d74d045363a..b9d36f33d1c 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -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) + pub fn maybe_new(window: &Window, renderer: IpcSender) -> Option> { 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, id: WebGLRenderbufferId) -> Root { reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id), - global, + window, WebGLRenderbufferBinding::Wrap) } } diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index f43576fba63..706dee4834b 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -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, attrs: GLContextAttributes) -> Result { let (sender, receiver) = ipc::channel().unwrap(); - let constellation_chan = global.constellation_chan(); + let constellation_chan = window.upcast::().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, attrs: GLContextAttributes) + pub fn new(window: &Window, canvas: &HTMLCanvasElement, size: Size2D, attrs: GLContextAttributes) -> Option> { - 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> { - 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> { - 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> { - 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> { - 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> { - 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> { 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())) }) } diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 93da1ca0bc5..d846ac34aa7 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -10,8 +10,8 @@ use dom::bindings::codegen::Bindings::WebGLShaderBinding; use dom::bindings::js::Root; use dom::bindings::reflector::reflect_dom_object; use dom::bindings::str::DOMString; -use dom::globalscope::GlobalScope; use dom::webglobject::WebGLObject; +use dom::window::Window; use ipc_channel::ipc::IpcSender; use std::cell::Cell; use std::sync::{ONCE_INIT, Once}; @@ -66,23 +66,24 @@ impl WebGLShader { } } - pub fn maybe_new(global: &GlobalScope, + pub fn maybe_new(window: &Window, renderer: IpcSender, - shader_type: u32) -> Option> { + shader_type: u32) + -> Option> { let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap(); renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateShader(shader_type, sender))).unwrap(); let result = receiver.recv().unwrap(); - result.map(|shader_id| WebGLShader::new(global, renderer, shader_id, shader_type)) + result.map(|shader_id| WebGLShader::new(window, renderer, shader_id, shader_type)) } - pub fn new(global: &GlobalScope, + pub fn new(window: &Window, renderer: IpcSender, id: WebGLShaderId, shader_type: u32) -> Root { reflect_dom_object(box WebGLShader::new_inherited(renderer, id, shader_type), - global, + window, WebGLShaderBinding::Wrap) } } diff --git a/components/script/dom/webglshaderprecisionformat.rs b/components/script/dom/webglshaderprecisionformat.rs index 18ba8c189a5..c0f954c8d4d 100644 --- a/components/script/dom/webglshaderprecisionformat.rs +++ b/components/script/dom/webglshaderprecisionformat.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::WebGLShaderPrecisionFormatBinding; use dom::bindings::codegen::Bindings::WebGLShaderPrecisionFormatBinding::WebGLShaderPrecisionFormatMethods; 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 WebGLShaderPrecisionFormat { @@ -27,13 +27,13 @@ impl WebGLShaderPrecisionFormat { } } - pub fn new(global: &GlobalScope, + pub fn new(window: &Window, range_min: i32, range_max: i32, precision: i32) -> Root { reflect_dom_object( box WebGLShaderPrecisionFormat::new_inherited(range_min, range_max, precision), - global, + window, WebGLShaderPrecisionFormatBinding::Wrap) } } diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs index 26cf14f7972..9a1e4663152 100644 --- a/components/script/dom/webgltexture.rs +++ b/components/script/dom/webgltexture.rs @@ -9,9 +9,9 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderi use dom::bindings::codegen::Bindings::WebGLTextureBinding; use dom::bindings::js::Root; use dom::bindings::reflector::reflect_dom_object; -use dom::globalscope::GlobalScope; use dom::webgl_validations::types::{TexImageTarget, TexFormat, TexDataType}; use dom::webglobject::WebGLObject; +use dom::window::Window; use ipc_channel::ipc::IpcSender; use std::cell::Cell; use std::cmp; @@ -61,21 +61,21 @@ impl WebGLTexture { } } - pub fn maybe_new(global: &GlobalScope, renderer: IpcSender) + pub fn maybe_new(window: &Window, renderer: IpcSender) -> Option> { let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap(); renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateTexture(sender))).unwrap(); let result = receiver.recv().unwrap(); - result.map(|texture_id| WebGLTexture::new(global, renderer, texture_id)) + result.map(|texture_id| WebGLTexture::new(window, renderer, texture_id)) } - pub fn new(global: &GlobalScope, + pub fn new(window: &Window, renderer: IpcSender, id: WebGLTextureId) -> Root { reflect_dom_object(box WebGLTexture::new_inherited(renderer, id), - global, + window, WebGLTextureBinding::Wrap) } } diff --git a/components/script/dom/webgluniformlocation.rs b/components/script/dom/webgluniformlocation.rs index 6e0683ec833..1b355bd8582 100644 --- a/components/script/dom/webgluniformlocation.rs +++ b/components/script/dom/webgluniformlocation.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::WebGLUniformLocationBinding; use dom::bindings::js::Root; use dom::bindings::reflector::{Reflector, reflect_dom_object}; -use dom::globalscope::GlobalScope; +use dom::window::Window; use webrender_traits::WebGLProgramId; #[dom_struct] @@ -27,12 +27,12 @@ impl WebGLUniformLocation { } } - pub fn new(global: &GlobalScope, + pub fn new(window: &Window, id: i32, program_id: WebGLProgramId) -> Root { reflect_dom_object(box WebGLUniformLocation::new_inherited(id, program_id), - global, + window, WebGLUniformLocationBinding::Wrap) } diff --git a/components/script/dom/webidls/WebGLActiveInfo.webidl b/components/script/dom/webidls/WebGLActiveInfo.webidl index 7195e8bacaa..be9e6f4e2db 100644 --- a/components/script/dom/webidls/WebGLActiveInfo.webidl +++ b/components/script/dom/webidls/WebGLActiveInfo.webidl @@ -6,6 +6,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7 // +[Exposed=Window] interface WebGLActiveInfo { readonly attribute GLint size; readonly attribute GLenum type; diff --git a/components/script/dom/webidls/WebGLBuffer.webidl b/components/script/dom/webidls/WebGLBuffer.webidl index 344850d42e6..ca2697bb9be 100644 --- a/components/script/dom/webidls/WebGLBuffer.webidl +++ b/components/script/dom/webidls/WebGLBuffer.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.4 // +[Exposed=Window] interface WebGLBuffer : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLContextEvent.webidl b/components/script/dom/webidls/WebGLContextEvent.webidl index 6a699754d2c..b5c70b8b17f 100644 --- a/components/script/dom/webidls/WebGLContextEvent.webidl +++ b/components/script/dom/webidls/WebGLContextEvent.webidl @@ -3,7 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15 -[Constructor(DOMString type, optional WebGLContextEventInit eventInit)] +[Constructor(DOMString type, optional WebGLContextEventInit eventInit), + Exposed=Window] interface WebGLContextEvent : Event { readonly attribute DOMString statusMessage; }; diff --git a/components/script/dom/webidls/WebGLFramebuffer.webidl b/components/script/dom/webidls/WebGLFramebuffer.webidl index 2f21edafc0a..306e2c479ed 100644 --- a/components/script/dom/webidls/WebGLFramebuffer.webidl +++ b/components/script/dom/webidls/WebGLFramebuffer.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7 // +[Exposed=Window] interface WebGLFramebuffer : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLObject.webidl b/components/script/dom/webidls/WebGLObject.webidl index 040c76be0c7..3ac7514830a 100644 --- a/components/script/dom/webidls/WebGLObject.webidl +++ b/components/script/dom/webidls/WebGLObject.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.3 // +[Exposed=Window] interface WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLProgram.webidl b/components/script/dom/webidls/WebGLProgram.webidl index 0c9ede907e0..2ee21b2a6a1 100644 --- a/components/script/dom/webidls/WebGLProgram.webidl +++ b/components/script/dom/webidls/WebGLProgram.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.6 // +[Exposed=Window] interface WebGLProgram : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLRenderbuffer.webidl b/components/script/dom/webidls/WebGLRenderbuffer.webidl index 451621ec30c..3024dc7513e 100644 --- a/components/script/dom/webidls/WebGLRenderbuffer.webidl +++ b/components/script/dom/webidls/WebGLRenderbuffer.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.5 // +[Exposed=Window] interface WebGLRenderbuffer : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl index 3f20d89ce96..dd91d53d2d7 100644 --- a/components/script/dom/webidls/WebGLRenderingContext.webidl +++ b/components/script/dom/webidls/WebGLRenderingContext.webidl @@ -41,7 +41,7 @@ dictionary WebGLContextAttributes { GLboolean failIfMajorPerformanceCaveat = false; }; -[NoInterfaceObject] +[Exposed=Window, NoInterfaceObject] interface WebGLRenderingContextBase { @@ -762,6 +762,7 @@ interface WebGLRenderingContextBase void viewport(GLint x, GLint y, GLsizei width, GLsizei height); }; +[Exposed=Window] interface WebGLRenderingContext { }; diff --git a/components/script/dom/webidls/WebGLShader.webidl b/components/script/dom/webidls/WebGLShader.webidl index f160602cba7..671da6405ff 100644 --- a/components/script/dom/webidls/WebGLShader.webidl +++ b/components/script/dom/webidls/WebGLShader.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.8 // +[Exposed=Window] interface WebGLShader : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl b/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl index 2d299232e90..eb7b1370b31 100644 --- a/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl +++ b/components/script/dom/webidls/WebGLShaderPrecisionFormat.webidl @@ -6,6 +6,7 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7 // +[Exposed=Window] interface WebGLShaderPrecisionFormat { readonly attribute GLint rangeMin; readonly attribute GLint rangeMax; diff --git a/components/script/dom/webidls/WebGLTexture.webidl b/components/script/dom/webidls/WebGLTexture.webidl index f1b7fa20f1e..42313c98683 100644 --- a/components/script/dom/webidls/WebGLTexture.webidl +++ b/components/script/dom/webidls/WebGLTexture.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/#5.9 // +[Exposed=Window] interface WebGLTexture : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLUniformLocation.webidl b/components/script/dom/webidls/WebGLUniformLocation.webidl index 467c2d00572..f068eead6e2 100644 --- a/components/script/dom/webidls/WebGLUniformLocation.webidl +++ b/components/script/dom/webidls/WebGLUniformLocation.webidl @@ -6,5 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.10 // +[Exposed=Window] interface WebGLUniformLocation { }; From 973f77c00698938c1333c0df7da30993075264d1 Mon Sep 17 00:00:00 2001 From: Rohan Prinja Date: Thu, 10 Nov 2016 02:24:01 -0500 Subject: [PATCH 3/4] Make WebIDL constructors take a more specific global if possible (fixes #14071) --- .../script/dom/bindings/codegen/CodegenRust.py | 13 ++++++++----- components/script/dom/comment.rs | 6 +++--- components/script/dom/document.rs | 7 +++---- components/script/dom/documentfragment.rs | 6 +++--- components/script/dom/domparser.rs | 5 ++--- components/script/dom/extendableevent.rs | 10 +++++----- components/script/dom/extendablemessageevent.rs | 4 +++- components/script/dom/focusevent.rs | 4 ++-- components/script/dom/htmlimageelement.rs | 6 +++--- components/script/dom/keyboardevent.rs | 5 ++--- components/script/dom/mouseevent.rs | 5 ++--- components/script/dom/range.rs | 6 +++--- components/script/dom/serviceworkerglobalscope.rs | 2 +- components/script/dom/text.rs | 6 +++--- components/script/dom/transitionevent.rs | 4 +++- components/script/dom/uievent.rs | 5 ++--- components/script/dom/webglcontextevent.rs | 5 ++--- 17 files changed, 50 insertions(+), 49 deletions(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 0003496e33e..09681e579b9 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -3168,7 +3168,7 @@ class CGCallGenerator(CGThing): if isFallible: if static: - glob = "&global" + glob = "global.upcast::()" else: glob = "&this.global()" @@ -5245,12 +5245,14 @@ class CGClassConstructHook(CGAbstractExternMethod): assert constructor CGAbstractExternMethod.__init__(self, descriptor, name, 'bool', args) self.constructor = constructor + self.exposureSet = descriptor.interface.exposureSet def definition_body(self): - preamble = CGGeneric("""\ -let global = GlobalScope::from_object(JS_CALLEE(cx, vp).to_object()); -let args = CallArgs::from_vp(vp, argc); -""") + preamble = """let global = GlobalScope::from_object(JS_CALLEE(cx, vp).to_object());\n""" + if len(self.exposureSet) == 1: + preamble += "let global = Root::downcast::(global).unwrap();\n" % list(self.exposureSet)[0] + preamble += """let args = CallArgs::from_vp(vp, argc);\n""" + preamble = CGGeneric(preamble) name = self.constructor.identifier.name nativeName = MakeNativeName(self.descriptor.binaryNameFor(name)) callGenerator = CGMethodCall(["&global"], nativeName, True, @@ -5582,6 +5584,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'dom::bindings::error::throw_dom_exception', 'dom::bindings::guard::Condition', 'dom::bindings::guard::Guard', + 'dom::bindings::inheritance::Castable', 'dom::bindings::proxyhandler', 'dom::bindings::proxyhandler::ensure_expando_object', 'dom::bindings::proxyhandler::fill_property_descriptor', diff --git a/components/script/dom/comment.rs b/components/script/dom/comment.rs index b135def6e2a..9efe8c8164c 100644 --- a/components/script/dom/comment.rs +++ b/components/script/dom/comment.rs @@ -9,8 +9,8 @@ use dom::bindings::js::Root; use dom::bindings::str::DOMString; use dom::characterdata::CharacterData; use dom::document::Document; -use dom::globalscope::GlobalScope; use dom::node::Node; +use dom::window::Window; /// An HTML comment. #[dom_struct] @@ -31,8 +31,8 @@ impl Comment { CommentBinding::Wrap) } - pub fn Constructor(global: &GlobalScope, data: DOMString) -> Fallible> { - let document = global.as_window().Document(); + pub fn Constructor(window: &Window, data: DOMString) -> Fallible> { + let document = window.Document(); Ok(Comment::new(data, &document)) } } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 5334402867c..844bc230043 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1884,11 +1884,10 @@ impl Document { } // https://dom.spec.whatwg.org/#dom-document - pub fn Constructor(global: &GlobalScope) -> Fallible> { - let win = global.as_window(); - let doc = win.Document(); + pub fn Constructor(window: &Window) -> Fallible> { + let doc = window.Document(); let docloader = DocumentLoader::new(&*doc.loader()); - Ok(Document::new(win, + Ok(Document::new(window, None, None, IsHTMLDocument::NonHTMLDocument, diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs index 334e083f1b7..554fb8fe3b3 100644 --- a/components/script/dom/documentfragment.rs +++ b/components/script/dom/documentfragment.rs @@ -12,10 +12,10 @@ use dom::bindings::js::Root; use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::Element; -use dom::globalscope::GlobalScope; use dom::htmlcollection::HTMLCollection; use dom::node::{Node, window_from_node}; use dom::nodelist::NodeList; +use dom::window::Window; use servo_atoms::Atom; // https://dom.spec.whatwg.org/#documentfragment @@ -38,8 +38,8 @@ impl DocumentFragment { DocumentFragmentBinding::Wrap) } - pub fn Constructor(global: &GlobalScope) -> Fallible> { - let document = global.as_window().Document(); + pub fn Constructor(window: &Window) -> Fallible> { + let document = window.Document(); Ok(DocumentFragment::new(&document)) } diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index 2a770aeb3a0..0ce2d50e09a 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -17,7 +17,6 @@ use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::DOMString; use dom::document::{Document, IsHTMLDocument}; use dom::document::DocumentSource; -use dom::globalscope::GlobalScope; use dom::servoparser::ServoParser; use dom::window::Window; @@ -41,8 +40,8 @@ impl DOMParser { DOMParserBinding::Wrap) } - pub fn Constructor(global: &GlobalScope) -> Fallible> { - Ok(DOMParser::new(global.as_window())) + pub fn Constructor(window: &Window) -> Fallible> { + Ok(DOMParser::new(window)) } } diff --git a/components/script/dom/extendableevent.rs b/components/script/dom/extendableevent.rs index 55e9500a8e4..0a7db40b6d5 100644 --- a/components/script/dom/extendableevent.rs +++ b/components/script/dom/extendableevent.rs @@ -10,7 +10,7 @@ use dom::bindings::js::Root; use dom::bindings::reflector::reflect_dom_object; use dom::bindings::str::DOMString; use dom::event::Event; -use dom::globalscope::GlobalScope; +use dom::serviceworkerglobalscope::ServiceWorkerGlobalScope; use js::jsapi::{HandleValue, JSContext}; use servo_atoms::Atom; @@ -28,12 +28,12 @@ impl ExtendableEvent { extensions_allowed: true } } - pub fn new(global: &GlobalScope, + pub fn new(worker: &ServiceWorkerGlobalScope, type_: Atom, bubbles: bool, cancelable: bool) -> Root { - let ev = reflect_dom_object(box ExtendableEvent::new_inherited(), global, ExtendableEventBinding::Wrap); + let ev = reflect_dom_object(box ExtendableEvent::new_inherited(), worker, ExtendableEventBinding::Wrap); { let event = ev.upcast::(); event.init_event(type_, bubbles, cancelable); @@ -41,10 +41,10 @@ impl ExtendableEvent { ev } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(worker: &ServiceWorkerGlobalScope, type_: DOMString, init: &ExtendableEventBinding::ExtendableEventInit) -> Fallible> { - Ok(ExtendableEvent::new(global, + Ok(ExtendableEvent::new(worker, Atom::from(type_), init.parent.bubbles, init.parent.cancelable)) diff --git a/components/script/dom/extendablemessageevent.rs b/components/script/dom/extendablemessageevent.rs index fbbdd59cbd3..8f156a8f4d3 100644 --- a/components/script/dom/extendablemessageevent.rs +++ b/components/script/dom/extendablemessageevent.rs @@ -13,6 +13,7 @@ use dom::event::Event; use dom::eventtarget::EventTarget; use dom::extendableevent::ExtendableEvent; use dom::globalscope::GlobalScope; +use dom::serviceworkerglobalscope::ServiceWorkerGlobalScope; use js::jsapi::{HandleValue, Heap, JSContext}; use js::jsval::JSVal; use servo_atoms::Atom; @@ -46,10 +47,11 @@ impl ExtendableMessageEvent { ev } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(worker: &ServiceWorkerGlobalScope, type_: DOMString, init: &ExtendableMessageEventBinding::ExtendableMessageEventInit) -> Fallible> { + let global = worker.upcast::(); rooted!(in(global.get_cx()) let data = init.data); let ev = ExtendableMessageEvent::new(global, Atom::from(type_), diff --git a/components/script/dom/focusevent.rs b/components/script/dom/focusevent.rs index d06b725286d..1eb3983737d 100644 --- a/components/script/dom/focusevent.rs +++ b/components/script/dom/focusevent.rs @@ -53,12 +53,12 @@ impl FocusEvent { ev } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(window: &Window, type_: DOMString, init: &FocusEventBinding::FocusEventInit) -> Fallible> { let bubbles = EventBubbles::from(init.parent.parent.bubbles); let cancelable = EventCancelable::from(init.parent.parent.cancelable); - let event = FocusEvent::new(global.as_window(), + let event = FocusEvent::new(window, type_, bubbles, cancelable, diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 3b58b383bf4..a86f0258918 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -16,11 +16,11 @@ use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers}; use dom::eventtarget::EventTarget; -use dom::globalscope::GlobalScope; use dom::htmlelement::HTMLElement; use dom::node::{Node, NodeDamage, document_from_node, window_from_node}; use dom::values::UNSIGNED_LONG_MAX; use dom::virtualmethods::VirtualMethods; +use dom::window::Window; use html5ever_atoms::LocalName; use ipc_channel::ipc; use ipc_channel::router::ROUTER; @@ -220,10 +220,10 @@ impl HTMLImageElement { HTMLImageElementBinding::Wrap) } - pub fn Image(global: &GlobalScope, + pub fn Image(window: &Window, width: Option, height: Option) -> Fallible> { - let document = global.as_window().Document(); + let document = window.Document(); let image = HTMLImageElement::new(local_name!("img"), None, &document); if let Some(w) = width { image.SetWidth(w); diff --git a/components/script/dom/keyboardevent.rs b/components/script/dom/keyboardevent.rs index 4da24309e18..99cc61e021f 100644 --- a/components/script/dom/keyboardevent.rs +++ b/components/script/dom/keyboardevent.rs @@ -12,7 +12,6 @@ use dom::bindings::js::{Root, RootedReference}; use dom::bindings::reflector::reflect_dom_object; use dom::bindings::str::DOMString; use dom::event::Event; -use dom::globalscope::GlobalScope; use dom::uievent::UIEvent; use dom::window::Window; use msg::constellation_msg; @@ -101,10 +100,10 @@ impl KeyboardEvent { ev } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(window: &Window, type_: DOMString, init: &KeyboardEventBinding::KeyboardEventInit) -> Fallible> { - let event = KeyboardEvent::new(global.as_window(), + let event = KeyboardEvent::new(window, type_, init.parent.parent.parent.bubbles, init.parent.parent.parent.cancelable, diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index 27a61c79400..2b39d555204 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -12,7 +12,6 @@ use dom::bindings::reflector::reflect_dom_object; use dom::bindings::str::DOMString; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; -use dom::globalscope::GlobalScope; use dom::uievent::UIEvent; use dom::window::Window; use std::cell::Cell; @@ -82,12 +81,12 @@ impl MouseEvent { ev } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(window: &Window, type_: DOMString, init: &MouseEventBinding::MouseEventInit) -> Fallible> { let bubbles = EventBubbles::from(init.parent.parent.parent.bubbles); let cancelable = EventCancelable::from(init.parent.parent.parent.cancelable); - let event = MouseEvent::new(global.as_window(), + let event = MouseEvent::new(window, type_, bubbles, cancelable, diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index 8e8b9888b87..0a5ab7a66df 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -22,11 +22,11 @@ use dom::characterdata::CharacterData; use dom::document::Document; use dom::documentfragment::DocumentFragment; use dom::element::Element; -use dom::globalscope::GlobalScope; use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlscriptelement::HTMLScriptElement; use dom::node::{Node, UnbindContext}; use dom::text::Text; +use dom::window::Window; use heapsize::HeapSizeOf; use js::jsapi::JSTracer; use std::cell::{Cell, UnsafeCell}; @@ -70,8 +70,8 @@ impl Range { } // https://dom.spec.whatwg.org/#dom-range - pub fn Constructor(global: &GlobalScope) -> Fallible> { - let document = global.as_window().Document(); + pub fn Constructor(window: &Window) -> Fallible> { + let document = window.Document(); Ok(Range::new_with_doc(&document)) } diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index a3877064131..b39faeb5694 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -319,7 +319,7 @@ impl ServiceWorkerGlobalScope { } fn dispatch_activate(&self) { - let event = ExtendableEvent::new(self.upcast(), atom!("activate"), false, false); + let event = ExtendableEvent::new(self, atom!("activate"), false, false); let event = (&*event).upcast::(); self.upcast::().dispatch_event(event); } diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index a6034a7dad5..cfa670d9acb 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -14,8 +14,8 @@ use dom::bindings::js::RootedReference; use dom::bindings::str::DOMString; use dom::characterdata::CharacterData; use dom::document::Document; -use dom::globalscope::GlobalScope; use dom::node::Node; +use dom::window::Window; /// An HTML text node. #[dom_struct] @@ -35,8 +35,8 @@ impl Text { document, TextBinding::Wrap) } - pub fn Constructor(global: &GlobalScope, text: DOMString) -> Fallible> { - let document = global.as_window().Document(); + pub fn Constructor(window: &Window, text: DOMString) -> Fallible> { + let document = window.Document(); Ok(Text::new(text, &document)) } } diff --git a/components/script/dom/transitionevent.rs b/components/script/dom/transitionevent.rs index 1f487cb38a5..cc17e77eae1 100644 --- a/components/script/dom/transitionevent.rs +++ b/components/script/dom/transitionevent.rs @@ -13,6 +13,7 @@ use dom::bindings::reflector::reflect_dom_object; use dom::bindings::str::DOMString; use dom::event::Event; use dom::globalscope::GlobalScope; +use dom::window::Window; use servo_atoms::Atom; #[dom_struct] @@ -46,9 +47,10 @@ impl TransitionEvent { ev } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(window: &Window, type_: DOMString, init: &TransitionEventInit) -> Fallible> { + let global = window.upcast::(); Ok(TransitionEvent::new(global, Atom::from(type_), init)) } } diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs index 08e1b0c912c..289088b2977 100644 --- a/components/script/dom/uievent.rs +++ b/components/script/dom/uievent.rs @@ -12,7 +12,6 @@ use dom::bindings::js::Root; 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; use std::cell::Cell; @@ -52,12 +51,12 @@ impl UIEvent { ev } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(window: &Window, type_: DOMString, init: &UIEventBinding::UIEventInit) -> Fallible> { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - let event = UIEvent::new(global.as_window(), + let event = UIEvent::new(window, type_, bubbles, cancelable, init.view.r(), init.detail); diff --git a/components/script/dom/webglcontextevent.rs b/components/script/dom/webglcontextevent.rs index 60b8209c56a..9d13fc8f64a 100644 --- a/components/script/dom/webglcontextevent.rs +++ b/components/script/dom/webglcontextevent.rs @@ -12,7 +12,6 @@ use dom::bindings::js::Root; 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; @@ -71,7 +70,7 @@ impl WebGLContextEvent { event } - pub fn Constructor(global: &GlobalScope, + pub fn Constructor(window: &Window, type_: DOMString, init: &WebGLContextEventInit) -> Fallible> { let status_message = match init.statusMessage.as_ref() { @@ -83,7 +82,7 @@ impl WebGLContextEvent { let cancelable = EventCancelable::from(init.parent.cancelable); - Ok(WebGLContextEvent::new(global.as_window(), + Ok(WebGLContextEvent::new(window, Atom::from(type_), bubbles, cancelable, From ddfb8805dc1c2df97f0596cf063935b4f3c5b90b Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 27 Nov 2016 14:37:04 +0100 Subject: [PATCH 4/4] Make WebIDL static methods take a more specific global if possible --- components/script/dom/bindings/codegen/CodegenRust.py | 9 +++++---- components/script/dom/bluetoothuuid.rs | 10 +++++----- components/script/dom/css.rs | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 09681e579b9..28d0d9af459 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -3378,12 +3378,13 @@ class CGAbstractStaticBindingMethod(CGAbstractMethod): Argument('*mut JSVal', 'vp'), ] CGAbstractMethod.__init__(self, descriptor, name, "bool", args, extern=True) + self.exposureSet = descriptor.interface.exposureSet def definition_body(self): - preamble = CGGeneric("""\ -let global = GlobalScope::from_object(JS_CALLEE(cx, vp).to_object()); -""") - return CGList([preamble, self.generate_code()]) + preamble = "let global = GlobalScope::from_object(JS_CALLEE(cx, vp).to_object());\n" + if len(self.exposureSet) == 1: + preamble += "let global = Root::downcast::(global).unwrap();\n" % list(self.exposureSet)[0] + return CGList([CGGeneric(preamble), self.generate_code()]) def generate_code(self): raise NotImplementedError # Override me! diff --git a/components/script/dom/bluetoothuuid.rs b/components/script/dom/bluetoothuuid.rs index 11fb7af94cb..fbf49142aa3 100644 --- a/components/script/dom/bluetoothuuid.rs +++ b/components/script/dom/bluetoothuuid.rs @@ -7,7 +7,7 @@ use dom::bindings::error::Error::Syntax; use dom::bindings::error::Fallible; use dom::bindings::reflector::Reflector; use dom::bindings::str::DOMString; -use dom::globalscope::GlobalScope; +use dom::window::Window; use regex::Regex; pub type UUID = DOMString; @@ -271,22 +271,22 @@ const VALID_UUID_REGEX: &'static str = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0- impl BluetoothUUID { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-canonicaluuid - pub fn CanonicalUUID(_: &GlobalScope, alias: u32) -> UUID { + pub fn CanonicalUUID(_: &Window, alias: u32) -> UUID { canonical_uuid(alias) } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-getservice - pub fn GetService(_: &GlobalScope, name: BluetoothServiceUUID) -> Fallible { + pub fn GetService(_: &Window, name: BluetoothServiceUUID) -> Fallible { Self::service(name) } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-getcharacteristic - pub fn GetCharacteristic(_: &GlobalScope, name: BluetoothCharacteristicUUID) -> Fallible { + pub fn GetCharacteristic(_: &Window, name: BluetoothCharacteristicUUID) -> Fallible { Self::characteristic(name) } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-getdescriptor - pub fn GetDescriptor(_: &GlobalScope, name: BluetoothDescriptorUUID) -> Fallible { + pub fn GetDescriptor(_: &Window, name: BluetoothDescriptorUUID) -> Fallible { Self::descriptor(name) } } diff --git a/components/script/dom/css.rs b/components/script/dom/css.rs index f2256007aeb..2e04aed50bc 100644 --- a/components/script/dom/css.rs +++ b/components/script/dom/css.rs @@ -6,7 +6,7 @@ use cssparser::serialize_identifier; use dom::bindings::error::Fallible; use dom::bindings::reflector::Reflector; use dom::bindings::str::DOMString; -use dom::globalscope::GlobalScope; +use dom::window::Window; #[dom_struct] pub struct CSS { @@ -15,7 +15,7 @@ pub struct CSS { impl CSS { // http://dev.w3.org/csswg/cssom/#serialize-an-identifier - pub fn Escape(_: &GlobalScope, ident: DOMString) -> Fallible { + pub fn Escape(_: &Window, ident: DOMString) -> Fallible { let mut escaped = String::new(); serialize_identifier(&ident, &mut escaped).unwrap(); Ok(DOMString::from(escaped))