aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-04-23 13:41:11 -0500
committerbors-servo <metajack+bors@gmail.com>2015-04-23 13:41:11 -0500
commit38ac11d0b8ae4244f49b59a6321a1a570ea01e03 (patch)
tree2ff2f2b65614f94f34181813bd81bf38ca84ade4 /components/script
parent1b08211a5e9ec00eeaf241b916d51dc665289825 (diff)
parentc2fc6e311a0cb3ec4c702c77bb5d13f97bd19078 (diff)
downloadservo-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.toml3
-rw-r--r--components/script/lib.rs2
-rw-r--r--components/script/script_task.rs13
-rw-r--r--components/script/webdriver_handlers.rs38
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();
+}