diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 90012015b1c..8fead633996 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1902,6 +1902,9 @@ impl ScriptThread { WebDriverScriptCommand::GetActiveElement(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) => { webdriver_handlers::handle_get_cookies(&*documents, pipeline_id, reply) }, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 81f45283c9a..5574451bd5b 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -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::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; +use crate::dom::bindings::codegen::Bindings::XMLSerializerBinding::XMLSerializerMethods; use crate::dom::bindings::conversions::{ ConversionResult, FromJSValConvertible, StringificationBehavior, }; @@ -24,6 +25,7 @@ use crate::dom::htmlinputelement::HTMLInputElement; use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::node::{window_from_node, Node, ShadowIncluding}; use crate::dom::window::Window; +use crate::dom::xmlserializer::XMLSerializer; use crate::script_thread::Documents; use cookie::Cookie; use euclid::{Point2D, Rect, Size2D}; @@ -281,6 +283,31 @@ pub fn handle_get_active_element( .unwrap(); } +pub fn handle_get_page_source( + documents: &Documents, + pipeline: PipelineId, + reply: IpcSender>, +) { + 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::()) + { + Ok(source) => Ok(source.to_string()), + Err(_) => Err(()), + } + }, + }, + None => Err(()), + } + })) + .unwrap(); +} + pub fn handle_get_cookies( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 0970ebcfa5f..02a2190f0cd 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -39,6 +39,7 @@ pub enum WebDriverScriptCommand { GetElementText(String, IpcSender>), GetBrowsingContextId(WebDriverFrameId, IpcSender>), GetUrl(IpcSender), + GetPageSource(IpcSender>), IsEnabled(String, IpcSender>), IsSelected(String, IpcSender>), GetTitle(IpcSender), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index dcce929652b..c43699629f7 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -1188,6 +1188,23 @@ impl Handler { Ok(WebDriverResponse::Void) } + fn handle_get_page_source(&self) -> WebDriverResult { + 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( &self, parameters: &JavascriptCommandParameters, @@ -1457,6 +1474,7 @@ impl WebDriverHandler for Handler { WebDriverCommand::GetCSSValue(ref element, ref name) => { self.handle_element_css(element, name) }, + WebDriverCommand::GetPageSource => self.handle_get_page_source(), WebDriverCommand::ExecuteScript(ref x) => self.handle_execute_script(x), WebDriverCommand::ExecuteAsyncScript(ref x) => self.handle_execute_async_script(x), WebDriverCommand::ElementSendKeys(ref element, ref keys) => { diff --git a/tests/wpt/metadata/webdriver/tests/get_page_source/source.py.ini b/tests/wpt/metadata/webdriver/tests/get_page_source/source.py.ini index 79dd7803e09..b6c06e2ce00 100644 --- a/tests/wpt/metadata/webdriver/tests/get_page_source/source.py.ini +++ b/tests/wpt/metadata/webdriver/tests/get_page_source/source.py.ini @@ -1,2 +1,4 @@ [source.py] - disabled: Unimplemented WebDriver command + [test_no_browsing_context] + expected: ERROR +