diff options
author | Josh Matthews <josh@joshmatthews.net> | 2014-08-29 16:17:14 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2014-09-18 15:06:40 -0400 |
commit | cdb4037ca22409af50847321ce86653073df39e6 (patch) | |
tree | 7b3fc5684c78a1081d5a69743ea457de37520e7f /components/script/script_task.rs | |
parent | f0f7e98dfaf73e8a759a1c56979fff1c418e2ead (diff) | |
download | servo-cdb4037ca22409af50847321ce86653073df39e6.tar.gz servo-cdb4037ca22409af50847321ce86653073df39e6.zip |
Enable executing JS snippets in the context of the main Servo window and viewing the responses from the Firefox remote console.
Diffstat (limited to 'components/script/script_task.rs')
-rw-r--r-- | components/script/script_task.rs | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 20f5eb3ded5..02fa3d10921 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -6,6 +6,7 @@ //! and layout tasks. use dom::bindings::codegen::InheritTypes::{EventTargetCast, NodeCast, EventCast}; +use dom::bindings::conversions; use dom::bindings::conversions::{FromJSValConvertible, Empty}; use dom::bindings::global::Window; use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalSettable}; @@ -31,8 +32,9 @@ use layout_interface::ContentChangedDocumentDamage; use layout_interface; use page::{Page, IterablePage, Frame}; +use devtools_traits; use devtools_traits::{DevtoolsControlChan, DevtoolsControlPort, NewGlobal}; -use devtools_traits::{DevtoolScriptControlMsg, EvaluateJS}; +use devtools_traits::{DevtoolScriptControlMsg, EvaluateJS, EvaluateJSReply}; use script_traits::{CompositorEvent, ResizeEvent, ReflowEvent, ClickEvent, MouseDownEvent}; use script_traits::{MouseMoveEvent, MouseUpEvent, ConstellationControlMsg, ScriptTaskFactory}; use script_traits::{ResizeMsg, AttachLayoutMsg, LoadMsg, SendEventMsg, ResizeInactiveMsg}; @@ -315,7 +317,7 @@ impl ScriptTask { //FIXME: Move this into handle_load after we create a window instead. let (devtools_sender, devtools_receiver) = channel(); devtools_chan.as_ref().map(|chan| { - chan.send(NewGlobal(devtools_sender.clone())); + chan.send(NewGlobal(id, devtools_sender.clone())); }); Rc::new(ScriptTask { @@ -496,13 +498,36 @@ impl ScriptTask { FromScript(DOMMessage(..)) => fail!("unexpected message"), FromScript(WorkerPostMessage(addr, data, nbytes)) => Worker::handle_message(addr, data, nbytes), FromScript(WorkerRelease(addr)) => Worker::handle_release(addr), - FromDevtools(EvaluateJS(_s, _reply)) => {/*TODO*/} + FromDevtools(EvaluateJS(id, s, reply)) => self.handle_evaluate_js(id, s, reply), } } true } + fn handle_evaluate_js(&self, pipeline: PipelineId, eval: String, reply: Sender<EvaluateJSReply>) { + let page = get_page(&*self.page.borrow(), pipeline); + let frame = page.frame(); + let window = frame.get_ref().window.root(); + let cx = window.get_cx(); + let rval = window.evaluate_js_with_result(eval.as_slice()); + + reply.send(if rval.is_undefined() { + devtools_traits::VoidValue + } else if rval.is_boolean() { + devtools_traits::BooleanValue(rval.to_boolean()) + } else if rval.is_double() { + devtools_traits::NumberValue(FromJSValConvertible::from_jsval(cx, rval, ()).unwrap()) + } else if rval.is_string() { + //FIXME: use jsstring_to_str when jsval grows to_jsstring + devtools_traits::StringValue(FromJSValConvertible::from_jsval(cx, rval, conversions::Default).unwrap()) + } else { + //FIXME: jsvals don't have an is_int32/is_number yet + assert!(rval.is_object_or_null()); + fail!("object values unimplemented") + }); + } + fn handle_new_layout(&self, new_layout_info: NewLayoutInfo) { debug!("Script: new layout: {:?}", new_layout_info); let NewLayoutInfo { |