зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #8621 - Add support for getting an element's computed style through WebDriver (from jgraham:webdriver_css); r=jdm
Source-Repo: https://github.com/servo/servo Source-Revision: 585d2d5c8c4e59be20ab9660dab75fc55438e247
This commit is contained in:
Родитель
37cb887a5a
Коммит
0e8c63fadf
|
@ -16,6 +16,7 @@ pub enum WebDriverScriptCommand {
|
||||||
FocusElement(String, IpcSender<Result<(), ()>>),
|
FocusElement(String, IpcSender<Result<(), ()>>),
|
||||||
GetActiveElement(IpcSender<Option<String>>),
|
GetActiveElement(IpcSender<Option<String>>),
|
||||||
GetElementAttribute(String, String, IpcSender<Result<Option<String>, ()>>),
|
GetElementAttribute(String, String, IpcSender<Result<Option<String>, ()>>),
|
||||||
|
GetElementCSS(String, String, IpcSender<Result<String, ()>>),
|
||||||
GetElementTagName(String, IpcSender<Result<String, ()>>),
|
GetElementTagName(String, IpcSender<Result<String, ()>>),
|
||||||
GetElementText(String, IpcSender<Result<String, ()>>),
|
GetElementText(String, IpcSender<Result<String, ()>>),
|
||||||
GetFrameId(WebDriverFrameId, IpcSender<Result<Option<PipelineId>, ()>>),
|
GetFrameId(WebDriverFrameId, IpcSender<Result<Option<PipelineId>, ()>>),
|
||||||
|
|
|
@ -1108,6 +1108,8 @@ impl ScriptTask {
|
||||||
webdriver_handlers::handle_get_name(&page, pipeline_id, node_id, reply),
|
webdriver_handlers::handle_get_name(&page, pipeline_id, node_id, reply),
|
||||||
WebDriverScriptCommand::GetElementAttribute(node_id, name, reply) =>
|
WebDriverScriptCommand::GetElementAttribute(node_id, name, reply) =>
|
||||||
webdriver_handlers::handle_get_attribute(&page, pipeline_id, node_id, name, reply),
|
webdriver_handlers::handle_get_attribute(&page, pipeline_id, node_id, name, reply),
|
||||||
|
WebDriverScriptCommand::GetElementCSS(node_id, name, reply) =>
|
||||||
|
webdriver_handlers::handle_get_css(&page, pipeline_id, node_id, name, reply),
|
||||||
WebDriverScriptCommand::GetElementText(node_id, reply) =>
|
WebDriverScriptCommand::GetElementText(node_id, reply) =>
|
||||||
webdriver_handlers::handle_get_text(&page, pipeline_id, node_id, reply),
|
webdriver_handlers::handle_get_text(&page, pipeline_id, node_id, reply),
|
||||||
WebDriverScriptCommand::GetFrameId(frame_id, reply) =>
|
WebDriverScriptCommand::GetFrameId(frame_id, reply) =>
|
||||||
|
|
|
@ -2,12 +2,14 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclarationMethods;
|
||||||
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
|
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
|
||||||
use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
|
use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementMethods;
|
use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementMethods;
|
||||||
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
|
||||||
use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods;
|
use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods;
|
||||||
|
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||||
use dom::bindings::conversions::{FromJSValConvertible, StringificationBehavior};
|
use dom::bindings::conversions::{FromJSValConvertible, StringificationBehavior};
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
use dom::bindings::js::Root;
|
use dom::bindings::js::Root;
|
||||||
|
@ -217,6 +219,21 @@ pub fn handle_get_attribute(page: &Rc<Page>,
|
||||||
}).unwrap();
|
}).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn handle_get_css(page: &Rc<Page>,
|
||||||
|
pipeline: PipelineId,
|
||||||
|
node_id: String,
|
||||||
|
name: String,
|
||||||
|
reply: IpcSender<Result<String, ()>>) {
|
||||||
|
reply.send(match find_node_by_unique_id(&*page, pipeline, node_id) {
|
||||||
|
Some(node) => {
|
||||||
|
let window = page.window();
|
||||||
|
let elem = node.downcast::<Element>().unwrap();
|
||||||
|
Ok(String::from(
|
||||||
|
window.GetComputedStyle(&elem, None).GetPropertyValue(DOMString::from(name))))
|
||||||
|
},
|
||||||
|
None => Err(())
|
||||||
|
}).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn handle_get_url(page: &Rc<Page>,
|
pub fn handle_get_url(page: &Rc<Page>,
|
||||||
_pipeline: PipelineId,
|
_pipeline: PipelineId,
|
||||||
|
|
|
@ -539,6 +539,20 @@ impl Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_element_css(&self, element: &WebElement, name: &String) -> WebDriverResult<WebDriverResponse> {
|
||||||
|
let pipeline_id = try!(self.frame_pipeline());
|
||||||
|
|
||||||
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
|
let cmd = WebDriverScriptCommand::GetElementCSS(element.id.clone(), name.clone(), sender);
|
||||||
|
let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd);
|
||||||
|
self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap();
|
||||||
|
match receiver.recv().unwrap() {
|
||||||
|
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))),
|
||||||
|
Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference,
|
||||||
|
"Unable to find element in document"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_set_timeouts(&mut self, parameters: &TimeoutsParameters) -> WebDriverResult<WebDriverResponse> {
|
fn handle_set_timeouts(&mut self, parameters: &TimeoutsParameters) -> WebDriverResult<WebDriverResponse> {
|
||||||
//TODO: this conversion is crazy, spec should limit these to u32 and check upstream
|
//TODO: this conversion is crazy, spec should limit these to u32 and check upstream
|
||||||
let value = parameters.ms as u32;
|
let value = parameters.ms as u32;
|
||||||
|
@ -731,6 +745,8 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler {
|
||||||
WebDriverCommand::GetElementTagName(ref element) => self.handle_element_tag_name(element),
|
WebDriverCommand::GetElementTagName(ref element) => self.handle_element_tag_name(element),
|
||||||
WebDriverCommand::GetElementAttribute(ref element, ref name) =>
|
WebDriverCommand::GetElementAttribute(ref element, ref name) =>
|
||||||
self.handle_element_attribute(element, name),
|
self.handle_element_attribute(element, name),
|
||||||
|
WebDriverCommand::GetCSSValue(ref element, ref name) =>
|
||||||
|
self.handle_element_css(element, name),
|
||||||
WebDriverCommand::ExecuteScript(ref x) => self.handle_execute_script(x),
|
WebDriverCommand::ExecuteScript(ref x) => self.handle_execute_script(x),
|
||||||
WebDriverCommand::ExecuteAsyncScript(ref x) => self.handle_execute_async_script(x),
|
WebDriverCommand::ExecuteAsyncScript(ref x) => self.handle_execute_async_script(x),
|
||||||
WebDriverCommand::ElementSendKeys(ref element, ref keys) =>
|
WebDriverCommand::ElementSendKeys(ref element, ref keys) =>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче