Implement GetPageSource WebDriver command

This commit is contained in:
George Roman 2019-06-12 22:13:49 +03:00
parent fd174c54ef
commit 13d908ab15
5 changed files with 52 additions and 1 deletions

View file

@ -1902,6 +1902,9 @@ impl ScriptThread {
WebDriverScriptCommand::GetActiveElement(reply) => { WebDriverScriptCommand::GetActiveElement(reply) => {
webdriver_handlers::handle_get_active_element(&*documents, pipeline_id, reply) webdriver_handlers::handle_get_active_element(&*documents, pipeline_id, reply)
}, },
WebDriverScriptCommand::GetPageSource(reply) => {
webdriver_handlers::handle_get_page_source(&*documents, pipeline_id, reply)
},
WebDriverScriptCommand::GetCookies(reply) => { WebDriverScriptCommand::GetCookies(reply) => {
webdriver_handlers::handle_get_cookies(&*documents, pipeline_id, reply) webdriver_handlers::handle_get_cookies(&*documents, pipeline_id, reply)
}, },

View file

@ -10,6 +10,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputE
use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods; use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods;
use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use crate::dom::bindings::codegen::Bindings::XMLSerializerBinding::XMLSerializerMethods;
use crate::dom::bindings::conversions::{ use crate::dom::bindings::conversions::{
ConversionResult, FromJSValConvertible, StringificationBehavior, ConversionResult, FromJSValConvertible, StringificationBehavior,
}; };
@ -24,6 +25,7 @@ use crate::dom::htmlinputelement::HTMLInputElement;
use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::htmloptionelement::HTMLOptionElement;
use crate::dom::node::{window_from_node, Node, ShadowIncluding}; use crate::dom::node::{window_from_node, Node, ShadowIncluding};
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::dom::xmlserializer::XMLSerializer;
use crate::script_thread::Documents; use crate::script_thread::Documents;
use cookie::Cookie; use cookie::Cookie;
use euclid::{Point2D, Rect, Size2D}; use euclid::{Point2D, Rect, Size2D};
@ -281,6 +283,31 @@ pub fn handle_get_active_element(
.unwrap(); .unwrap();
} }
pub fn handle_get_page_source(
documents: &Documents,
pipeline: PipelineId,
reply: IpcSender<Result<String, ()>>,
) {
reply
.send(documents.find_document(pipeline).ok_or(()).and_then(|doc| {
match doc.GetDocumentElement() {
Some(elem) => match elem.GetOuterHTML() {
Ok(source) => Ok(source.to_string()),
Err(_) => {
match XMLSerializer::new(doc.window())
.SerializeToString(elem.upcast::<Node>())
{
Ok(source) => Ok(source.to_string()),
Err(_) => Err(()),
}
},
},
None => Err(()),
}
}))
.unwrap();
}
pub fn handle_get_cookies( pub fn handle_get_cookies(
documents: &Documents, documents: &Documents,
pipeline: PipelineId, pipeline: PipelineId,

View file

@ -39,6 +39,7 @@ pub enum WebDriverScriptCommand {
GetElementText(String, IpcSender<Result<String, ()>>), GetElementText(String, IpcSender<Result<String, ()>>),
GetBrowsingContextId(WebDriverFrameId, IpcSender<Result<BrowsingContextId, ()>>), GetBrowsingContextId(WebDriverFrameId, IpcSender<Result<BrowsingContextId, ()>>),
GetUrl(IpcSender<ServoUrl>), GetUrl(IpcSender<ServoUrl>),
GetPageSource(IpcSender<Result<String, ()>>),
IsEnabled(String, IpcSender<Result<bool, ()>>), IsEnabled(String, IpcSender<Result<bool, ()>>),
IsSelected(String, IpcSender<Result<bool, ()>>), IsSelected(String, IpcSender<Result<bool, ()>>),
GetTitle(IpcSender<String>), GetTitle(IpcSender<String>),

View file

@ -1188,6 +1188,23 @@ impl Handler {
Ok(WebDriverResponse::Void) Ok(WebDriverResponse::Void)
} }
fn handle_get_page_source(&self) -> WebDriverResult<WebDriverResponse> {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetPageSource(sender);
self.browsing_context_script_command(cmd)?;
match receiver.recv().unwrap() {
Ok(source) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(source)?,
))),
Err(_) => Err(WebDriverError::new(
ErrorStatus::UnknownError,
"Unknown error",
)),
}
}
fn handle_execute_script( fn handle_execute_script(
&self, &self,
parameters: &JavascriptCommandParameters, parameters: &JavascriptCommandParameters,
@ -1457,6 +1474,7 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler {
WebDriverCommand::GetCSSValue(ref element, ref name) => { WebDriverCommand::GetCSSValue(ref element, ref name) => {
self.handle_element_css(element, name) self.handle_element_css(element, name)
}, },
WebDriverCommand::GetPageSource => self.handle_get_page_source(),
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) => {

View file

@ -1,2 +1,4 @@
[source.py] [source.py]
disabled: Unimplemented WebDriver command [test_no_browsing_context]
expected: ERROR