diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-04-23 13:41:11 -0500 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-04-23 13:41:11 -0500 |
commit | 38ac11d0b8ae4244f49b59a6321a1a570ea01e03 (patch) | |
tree | 2ff2f2b65614f94f34181813bd81bf38ca84ade4 /components/script | |
parent | 1b08211a5e9ec00eeaf241b916d51dc665289825 (diff) | |
parent | c2fc6e311a0cb3ec4c702c77bb5d13f97bd19078 (diff) | |
download | servo-38ac11d0b8ae4244f49b59a6321a1a570ea01e03.tar.gz servo-38ac11d0b8ae4244f49b59a6321a1a570ea01e03.zip |
Auto merge of #5808 - jgraham:webdriver_execute_script, r=jdm
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5808)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/Cargo.toml | 3 | ||||
-rw-r--r-- | components/script/lib.rs | 2 | ||||
-rw-r--r-- | components/script/script_task.rs | 13 | ||||
-rw-r--r-- | components/script/webdriver_handlers.rs | 38 |
4 files changed, 56 insertions, 0 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 63eaea80142..50607cabefe 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -42,6 +42,9 @@ path = "../gfx" [dependencies.canvas] path = "../canvas" +[dependencies.webdriver_traits] +path = "../webdriver_traits" + [dependencies.cssparser] git = "https://github.com/servo/rust-cssparser" diff --git a/components/script/lib.rs b/components/script/lib.rs index b9f4b42f84d..5c2e522f5d4 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -52,6 +52,7 @@ extern crate style; extern crate url; extern crate uuid; extern crate string_cache; +extern crate webdriver_traits; pub mod cors; @@ -67,3 +68,4 @@ pub mod script_task; mod timers; pub mod textinput; mod devtools; +mod webdriver_handlers; diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 6886137e48c..6de72745163 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -45,6 +45,7 @@ use layout_interface; use page::{Page, IterablePage, Frame}; use timers::TimerId; use devtools; +use webdriver_handlers; use devtools_traits::{DevtoolsControlChan, DevtoolsControlPort, DevtoolsPageInfo}; use devtools_traits::{DevtoolsControlMsg, DevtoolScriptControlMsg}; @@ -56,6 +57,7 @@ use script_traits::CompositorEvent::{MouseMoveEvent, KeyEvent}; use script_traits::{NewLayoutInfo, OpaqueScriptLayoutChannel}; use script_traits::{ConstellationControlMsg, ScriptControlChan}; use script_traits::ScriptTaskFactory; +use webdriver_traits::WebDriverScriptCommand; use msg::compositor_msg::ReadyState::{FinishedLoading, Loading, PerformingLayout}; use msg::compositor_msg::{LayerId, ScriptListener}; use msg::constellation_msg::{ConstellationChan, FocusType}; @@ -727,6 +729,9 @@ impl ScriptTask { self.handle_update_subpage_id(containing_pipeline_id, old_subpage_id, new_subpage_id), ConstellationControlMsg::FocusIFrameMsg(containing_pipeline_id, subpage_id) => self.handle_focus_iframe_msg(containing_pipeline_id, subpage_id), + ConstellationControlMsg::WebDriverCommandMsg(pipeline_id, msg) => { + self.handle_webdriver_msg(pipeline_id, msg); + } } } @@ -783,6 +788,14 @@ impl ScriptTask { msg.responder.unwrap().respond(msg.image); } + fn handle_webdriver_msg(&self, pipeline_id: PipelineId, msg: WebDriverScriptCommand) { + let page = self.root_page(); + match msg { + WebDriverScriptCommand::EvaluateJS(script, reply) => + webdriver_handlers::handle_evaluate_js(&page, pipeline_id, script, reply) + } + } + fn handle_resize(&self, id: PipelineId, size: WindowSizeData) { let page = self.page.borrow(); if let Some(ref page) = page.as_ref() { diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs new file mode 100644 index 00000000000..4d0aeca61cc --- /dev/null +++ b/components/script/webdriver_handlers.rs @@ -0,0 +1,38 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use webdriver_traits::{EvaluateJSReply}; +use dom::bindings::conversions::FromJSValConvertible; +use dom::bindings::conversions::StringificationBehavior; +use dom::bindings::js::OptionalRootable; +use dom::window::ScriptHelpers; +use dom::document::DocumentHelpers; +use page::Page; +use msg::constellation_msg::PipelineId; +use script_task::get_page; + +use std::rc::Rc; +use std::sync::mpsc::Sender; + +pub fn handle_evaluate_js(page: &Rc<Page>, pipeline: PipelineId, eval: String, reply: Sender<Result<EvaluateJSReply, ()>>){ + let page = get_page(&*page, pipeline); + let window = page.window().root(); + let cx = window.r().get_cx(); + let rval = window.r().evaluate_js_on_global_with_result(&eval); + + reply.send(if rval.is_undefined() { + Ok(EvaluateJSReply::VoidValue) + } else if rval.is_boolean() { + Ok(EvaluateJSReply::BooleanValue(rval.to_boolean())) + } else if rval.is_double() { + Ok(EvaluateJSReply::NumberValue(FromJSValConvertible::from_jsval(cx, rval, ()).unwrap())) + } else if rval.is_string() { + //FIXME: use jsstring_to_str when jsval grows to_jsstring + Ok(EvaluateJSReply::StringValue(FromJSValConvertible::from_jsval(cx, rval, StringificationBehavior::Default).unwrap())) + } else if rval.is_null() { + Ok(EvaluateJSReply::NullValue) + } else { + Err(()) + }).unwrap(); +} |