aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/document.rs51
-rw-r--r--components/script/dom/htmliframeelement.rs5
-rw-r--r--components/script/script_task.rs25
3 files changed, 49 insertions, 32 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index a30e923cee8..0e790188320 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -5,12 +5,15 @@
use document_loader::{DocumentLoader, LoadType};
use dom::attr::{Attr, AttrValue};
use dom::bindings::cell::DOMRefCell;
+use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
use dom::bindings::codegen::Bindings::DocumentBinding;
use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
+use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull;
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
+use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementMethods;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter;
use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods;
@@ -82,13 +85,14 @@ use msg::compositor_msg::ScriptToCompositorMsg;
use msg::constellation_msg::ScriptMsg as ConstellationMsg;
use msg::constellation_msg::{ALT, CONTROL, SHIFT, SUPER};
use msg::constellation_msg::{AnimationState, PipelineId};
-use msg::constellation_msg::{ConstellationChan, FocusType, Key, KeyModifiers, KeyState, MozBrowserEvent, SubpageId};
+use msg::constellation_msg::{ConstellationChan, FocusType, Key, KeyModifiers, KeyState};
+use msg::constellation_msg::{MouseButton, MouseEventType, MozBrowserEvent, SubpageId};
use net_traits::ControlMsg::{GetCookiesForUrl, SetCookiesForUrl};
use net_traits::CookieSource::NonHTTP;
use net_traits::{AsyncResponseTarget, PendingAsyncLoad};
use num::ToPrimitive;
use script_task::{MainThreadScriptMsg, Runnable};
-use script_traits::{MouseButton, TouchEventType, TouchId, UntrustedNodeAddress};
+use script_traits::{TouchEventType, TouchId, UntrustedNodeAddress};
use std::ascii::AsciiExt;
use std::borrow::ToOwned;
use std::boxed::FnBox;
@@ -603,7 +607,7 @@ impl Document {
pub fn handle_mouse_event(&self,
js_runtime: *mut JSRuntime,
- _button: MouseButton,
+ button: MouseButton,
client_point: Point2D<f32>,
mouse_event_type: MouseEventType) {
let mouse_event_type_string = match mouse_event_type {
@@ -634,6 +638,21 @@ impl Document {
},
};
+ // If the target is an iframe, forward the event to the child document.
+ if let Some(iframe) = el.downcast::<HTMLIFrameElement>() {
+ if let Some(pipeline_id) = iframe.pipeline_id() {
+ let rect = iframe.upcast::<Element>().GetBoundingClientRect();
+ let child_origin = Point2D::new(rect.X() as f32, rect.Y() as f32);
+ let child_point = client_point - child_origin;
+
+ let event = ConstellationMsg::ForwardMouseButtonEvent(pipeline_id,
+ mouse_event_type,
+ button, child_point);
+ self.window.constellation_chan().0.send(event).unwrap();
+ }
+ return;
+ }
+
let node = el.upcast::<Node>();
debug!("{} on {:?}", mouse_event_type_string, node.debug_str());
// Prevent click event if form control element is disabled.
@@ -766,11 +785,23 @@ impl Document {
if mouse_over_addresses.len() > 0 {
let top_most_node = node::from_untrusted_node_address(js_runtime,
mouse_over_addresses[0]);
+ let client_point = client_point.unwrap(); // Must succeed because hit test succeeded.
- let target = top_most_node.upcast();
- if let Some(client_point) = client_point {
- self.fire_mouse_event(client_point, target, "mousemove".to_owned());
+ // If the target is an iframe, forward the event to the child document.
+ if let Some(iframe) = top_most_node.downcast::<HTMLIFrameElement>() {
+ if let Some(pipeline_id) = iframe.pipeline_id() {
+ let rect = iframe.upcast::<Element>().GetBoundingClientRect();
+ let child_origin = Point2D::new(rect.X() as f32, rect.Y() as f32);
+ let child_point = client_point - child_origin;
+
+ let event = ConstellationMsg::ForwardMouseMoveEvent(pipeline_id, child_point);
+ self.window.constellation_chan().0.send(event).unwrap();
+ }
+ return;
}
+
+ let target = top_most_node.upcast();
+ self.fire_mouse_event(client_point, target, "mousemove".to_owned());
}
// Store the current mouse over targets for next frame
@@ -1362,14 +1393,6 @@ impl Document {
}
}
-#[derive(HeapSizeOf)]
-pub enum MouseEventType {
- Click,
- MouseDown,
- MouseUp,
-}
-
-
#[derive(PartialEq, HeapSizeOf)]
pub enum DocumentSource {
FromParser,
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index 4c7f7276ca7..3798ab4f539 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -186,6 +186,11 @@ impl HTMLIFrameElement {
}
#[inline]
+ pub fn pipeline_id(&self) -> Option<PipelineId> {
+ self.pipeline_id.get()
+ }
+
+ #[inline]
pub fn subpage_id(&self) -> Option<SubpageId> {
self.subpage_id.get()
}
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index 8b9800063e2..736c95b0d2d 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -31,8 +31,7 @@ use dom::bindings::js::{Root, RootCollectionPtr, RootedReference};
use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference, trace_refcounted_objects};
use dom::bindings::trace::{JSTraceable, RootedVec, trace_traceables};
use dom::bindings::utils::{DOM_CALLBACKS, WRAP_CALLBACKS};
-use dom::document::{Document, DocumentProgressHandler, IsHTMLDocument};
-use dom::document::{DocumentSource, MouseEventType};
+use dom::document::{Document, DocumentProgressHandler, DocumentSource, IsHTMLDocument};
use dom::element::Element;
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::htmlanchorelement::HTMLAnchorElement;
@@ -65,7 +64,7 @@ use mem::heap_size_of_self_and_children;
use msg::compositor_msg::{EventResult, LayerId, ScriptToCompositorMsg};
use msg::constellation_msg::ScriptMsg as ConstellationMsg;
use msg::constellation_msg::{ConstellationChan, FocusType, LoadData};
-use msg::constellation_msg::{MozBrowserEvent, PipelineId};
+use msg::constellation_msg::{MouseButton, MouseEventType, MozBrowserEvent, PipelineId};
use msg::constellation_msg::{PipelineNamespace};
use msg::constellation_msg::{SubpageId, WindowSizeData, WorkerId};
use msg::webdriver_msg::WebDriverScriptCommand;
@@ -78,11 +77,9 @@ use page::{Frame, IterablePage, Page};
use parse::html::{ParseContext, parse_html};
use profile_traits::mem::{self, OpaqueSender, Report, ReportKind, ReportsChan};
use profile_traits::time::{self, ProfilerCategory, profile};
-use script_traits::CompositorEvent::{ClickEvent, ResizeEvent};
-use script_traits::CompositorEvent::{KeyEvent, MouseMoveEvent};
-use script_traits::CompositorEvent::{MouseDownEvent, MouseUpEvent, TouchEvent};
-use script_traits::{CompositorEvent, ConstellationControlMsg};
-use script_traits::{InitialScriptState, MouseButton, NewLayoutInfo};
+use script_traits::CompositorEvent::{KeyEvent, MouseButtonEvent, MouseMoveEvent, ResizeEvent};
+use script_traits::CompositorEvent::{TouchEvent};
+use script_traits::{CompositorEvent, ConstellationControlMsg, InitialScriptState, NewLayoutInfo};
use script_traits::{OpaqueScriptLayoutChannel, ScriptState, ScriptTaskFactory};
use script_traits::{TimerEvent, TimerEventRequest, TimerSource};
use script_traits::{TouchEventType, TouchId};
@@ -1786,16 +1783,8 @@ impl ScriptTask {
self.handle_resize_event(pipeline_id, new_size);
}
- ClickEvent(button, point) => {
- self.handle_mouse_event(pipeline_id, MouseEventType::Click, button, point);
- }
-
- MouseDownEvent(button, point) => {
- self.handle_mouse_event(pipeline_id, MouseEventType::MouseDown, button, point);
- }
-
- MouseUpEvent(button, point) => {
- self.handle_mouse_event(pipeline_id, MouseEventType::MouseUp, button, point);
+ MouseButtonEvent(event_type, button, point) => {
+ self.handle_mouse_event(pipeline_id, event_type, button, point);
}
MouseMoveEvent(point) => {