aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/script_task.rs
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno.d@partner.samsung.com>2014-06-27 15:25:09 -0400
committerBruno de Oliveira Abinader <bruno.d@partner.samsung.com>2014-08-05 11:01:53 -0400
commit7771350898ae1dd8e81dd1863da431e8cc7486e3 (patch)
treef53c25429020386995afac1ea043211c7616f790 /src/components/script/script_task.rs
parent40048b791c44a0ef250d09633af38be0a9f257fd (diff)
downloadservo-7771350898ae1dd8e81dd1863da431e8cc7486e3.tar.gz
servo-7771350898ae1dd8e81dd1863da431e8cc7486e3.zip
Implement support for :disabled CSS selector
Diffstat (limited to 'src/components/script/script_task.rs')
-rw-r--r--src/components/script/script_task.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs
index 9b31c8b0dfc..5c6ade2b939 100644
--- a/src/components/script/script_task.rs
+++ b/src/components/script/script_task.rs
@@ -12,13 +12,14 @@ use dom::bindings::js::OptionalRootable;
use dom::bindings::utils::Reflectable;
use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap};
use dom::document::{Document, HTMLDocument, DocumentHelpers};
-use dom::element::{Element};
+use dom::element::{Element, HTMLButtonElementTypeId, HTMLInputElementTypeId};
+use dom::element::{HTMLSelectElementTypeId, HTMLTextAreaElementTypeId, HTMLOptionElementTypeId};
use dom::event::{Event_, ResizeEvent, ReflowEvent, ClickEvent, MouseDownEvent, MouseMoveEvent, MouseUpEvent};
use dom::event::Event;
use dom::uievent::UIEvent;
use dom::eventtarget::{EventTarget, EventTargetHelpers};
use dom::node;
-use dom::node::{Node, NodeHelpers};
+use dom::node::{ElementNodeTypeId, Node, NodeHelpers};
use dom::window::{TimerId, Window, WindowHelpers};
use dom::xmlhttprequest::{TrustedXHRAddress, XMLHttpRequest, XHRProgress};
use html::hubbub_html_parser::HtmlParserResult;
@@ -193,6 +194,24 @@ impl<'a> Drop for ScriptMemoryFailsafe<'a> {
}
}
+trait PrivateScriptTaskHelpers {
+ fn click_event_filter_by_disabled_state(&self) -> bool;
+}
+
+impl<'a> PrivateScriptTaskHelpers for JSRef<'a, Node> {
+ fn click_event_filter_by_disabled_state(&self) -> bool {
+ match self.type_id {
+ ElementNodeTypeId(HTMLButtonElementTypeId) |
+ ElementNodeTypeId(HTMLInputElementTypeId) |
+ // ElementNodeTypeId(HTMLKeygenElementTypeId) |
+ ElementNodeTypeId(HTMLOptionElementTypeId) |
+ ElementNodeTypeId(HTMLSelectElementTypeId) |
+ ElementNodeTypeId(HTMLTextAreaElementTypeId) if self.get_disabled_state() => true,
+ _ => false
+ }
+ }
+}
+
impl ScriptTask {
/// Creates a new script task.
pub fn new(id: PipelineId,
@@ -691,6 +710,8 @@ impl ScriptTask {
match maybe_node {
Some(node) => {
debug!("clicked on {:s}", node.debug_str());
+ // Prevent click event if form control element is disabled.
+ if node.click_event_filter_by_disabled_state() { return; }
match *page.frame() {
Some(ref frame) => {
let window = frame.window.root();