diff options
-rw-r--r-- | src/components/script/dom/bindings/codegen/CodegenRust.py | 24 | ||||
-rw-r--r-- | src/components/script/dom/window.rs | 6 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 38 |
3 files changed, 31 insertions, 37 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 1e30647a3d6..22523568719 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2118,7 +2118,10 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): a given interface. """ def __init__(self, descriptor): - args = [Argument('&mut JSPageInfo', 'js_info')] + args = [ + Argument('&JS<Window>', 'window'), + Argument('&mut JSPageInfo', 'js_info'), + ] CGAbstractMethod.__init__(self, descriptor, 'DefineDOMInterface', 'void', args, pub=True) def define(self): @@ -2173,10 +2176,10 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): ('Some(%s)' % TRACE_HOOK_NAME), self.descriptor.name) - return (body + """ let cx = (*js_info.js_context).deref().ptr; - let receiver = js_info.js_compartment.global_obj; - let global: *JSObject = JS_GetGlobalForObject(cx, receiver); - assert!(%s(cx, global, receiver).is_not_null());""" % (getter)) + return (body + """ let cx = (**js_info.js_context).ptr; + let global = window.reflector().get_jsobject(); + assert!(global.is_not_null()); + assert!(%s(cx, global, global).is_not_null());""" % (getter)) def needCx(returnType, arguments, extendedAttributes, considerTypes): return (considerTypes and @@ -4305,13 +4308,16 @@ class CGDictionary(CGThing): class CGRegisterProtos(CGAbstractMethod): def __init__(self, config): - CGAbstractMethod.__init__(self, None, 'Register', 'void', - [Argument('&mut JSPageInfo', 'js_info')], + arguments = [ + Argument('&JS<Window>', 'window'), + Argument('&mut JSPageInfo', 'js_info'), + ] + CGAbstractMethod.__init__(self, None, 'Register', 'void', arguments, unsafe=False, pub=True) self.config = config def _registerProtos(self): - lines = [" codegen::%sBinding::DefineDOMInterface(js_info);" % desc.name + lines = [" codegen::%sBinding::DefineDOMInterface(window, js_info);" % desc.name for desc in self.config.getDescriptors(hasInterfaceObject=True, register=True)] return '\n'.join(lines) + '\n' @@ -5349,6 +5355,8 @@ class GlobalGenRoots(): # TODO - Generate the methods we want return CGImports(CGRegisterProtos(config), [ 'dom::bindings::codegen', + 'dom::bindings::js::JS', + 'dom::window::Window', 'script_task::JSPageInfo', ]) diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 87d94eaff62..04a117650d1 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -20,7 +20,7 @@ use servo_net::image_cache_task::ImageCacheTask; use servo_util::str::DOMString; use servo_util::task::{spawn_named}; -use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JS_PropertyStub, JS_StrictPropertyStub}; +use js::jsapi::{JSContext, JS_DefineProperty, JS_PropertyStub, JS_StrictPropertyStub}; use js::jsval::{NullValue, ObjectValue, JSVal}; use js::JSPROP_ENUMERATE; @@ -91,9 +91,9 @@ pub struct Window { } impl Window { - pub fn get_cx(&self) -> *JSObject { + pub fn get_cx(&self) -> *JSContext { let js_info = self.page().js_info(); - js_info.get_ref().js_compartment.deref().cx.deref().ptr + (**js_info.get_ref().js_context).ptr } pub fn page<'a>(&'a self) -> &'a Page { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 854b060513d..4e7a30705b0 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -33,9 +33,9 @@ use layout_interface; use geom::point::Point2D; use geom::size::Size2D; use js::global::DEBUG_FNS; -use js::jsapi::{JSObject, JS_InhibitGC, JS_AllowGC, JS_CallFunctionValue}; +use js::jsapi::{JSObject, JS_InhibitGC, JS_AllowGC, JS_CallFunctionValue, JS_DefineFunctions}; use js::jsval::NullValue; -use js::rust::{Compartment, Cx, CxUtils, RtUtils}; +use js::rust::{Cx, RtUtils}; use js; use servo_msg::compositor_msg::{FinishedLoading, LayerId, Loading, PerformingLayout}; use servo_msg::compositor_msg::{ScriptListener}; @@ -426,11 +426,6 @@ impl Page { js_context.set_default_options_and_version(); js_context.set_logging_error_reporter(); - let compartment = match js_context.new_compartment_with_global(global) { - Ok(c) => c, - Err(()) => fail!("Failed to create a compartment"), - }; - unsafe { JS_InhibitGC(js_context.deref().ptr); } @@ -438,7 +433,6 @@ impl Page { let mut js_info = self.mut_js_info(); *js_info = Some(JSPageInfo { dom_static: GlobalStaticData(), - js_compartment: Untraceable::new(compartment), js_context: Untraceable::new(js_context), }); } @@ -458,8 +452,6 @@ pub struct Frame { pub struct JSPageInfo { /// Global static data related to the DOM. dom_static: GlobalStaticData, - /// The JavaScript compartment for the origin associated with the script task. - js_compartment: Untraceable<Rc<Compartment>>, /// The JavaScript context. js_context: Untraceable<Rc<Cx>>, } @@ -667,15 +659,15 @@ impl ScriptTask { window.get_mut().active_timers.remove(&timer_data.handle); } - let js_info = page.js_info(); let this_value = if timer_data.args.len() > 0 { fail!("NYI") } else { - js_info.get_ref().js_compartment.global_obj + window.reflector().get_jsobject() }; // TODO: Support extra arguments. This requires passing a `*JSVal` array as `argv`. let rval = NullValue(); + let js_info = page.js_info(); let cx = js_info.get_ref().js_context.deref().deref().ptr; with_gc_enabled(cx, || { unsafe { @@ -802,7 +794,7 @@ impl ScriptTask { { let mut js_info = page.mut_js_info(); - RegisterBindings::Register(js_info.get_mut_ref()); + RegisterBindings::Register(&window, js_info.get_mut_ref()); } self.compositor.set_ready_state(Loading); @@ -879,22 +871,16 @@ impl ScriptTask { debug!("js_scripts: {:?}", js_scripts); // Define debug functions. - let cx = { - let js_info = page.js_info(); - let js_info = js_info.get_ref(); - assert!(js_info.js_compartment.deref().define_functions(DEBUG_FNS).is_ok()); - - js_info.js_context.deref().deref().ptr - }; + unsafe { + assert!(JS_DefineFunctions((*cx).ptr, + window.reflector().get_jsobject(), + DEBUG_FNS.as_ptr()) != 0); + } // Evaluate every script in the document. for file in js_scripts.iter() { - with_gc_enabled(cx, || { - let (cx, global_obj) = { - let js_info = page.js_info(); - (js_info.get_ref().js_context.deref().clone(), - js_info.get_ref().js_compartment.global_obj) - }; + with_gc_enabled((*cx).ptr, || { + let global_obj = window.reflector().get_jsobject(); //FIXME: this should have some kind of error handling, or explicitly // drop an exception on the floor. match cx.evaluate_script(global_obj, file.data.clone(), file.url.to_str(), 1) { |