aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/script_thread.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/script_thread.rs')
-rw-r--r--components/script/script_thread.rs83
1 files changed, 35 insertions, 48 deletions
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 0a4f3d6fb3b..8b87dcb2169 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -33,7 +33,7 @@ use dom::bindings::refcounted::{LiveDOMReferences, Trusted};
use dom::bindings::str::DOMString;
use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::WRAP_CALLBACKS;
-use dom::browsingcontext::{BrowsingContext, IterableContext};
+use dom::browsingcontext::BrowsingContext;
use dom::document::{Document, DocumentProgressHandler, DocumentSource, FocusType, IsHTMLDocument};
use dom::element::Element;
use dom::event::{Event, EventBubbles, EventCancelable};
@@ -58,7 +58,7 @@ use js::jsapi::{JSContext, JS_SetWrapObjectCallbacks, JSTracer, SetWindowProxyCl
use js::jsval::UndefinedValue;
use js::rust::Runtime;
use layout_interface::{ReflowQueryType};
-use layout_interface::{self, LayoutChan, NewLayoutThreadInfo, ScriptLayoutChan};
+use layout_interface::{self, LayoutChan, NewLayoutThreadInfo};
use mem::heap_size_of_self_and_children;
use msg::constellation_msg::{LoadData, PanicMsg, PipelineId, PipelineNamespace};
use msg::constellation_msg::{SubpageId, WindowSizeData, WindowSizeType};
@@ -79,15 +79,15 @@ use script_runtime::{ScriptPort, StackRootTLS, new_rt_and_cx, get_reports};
use script_traits::CompositorEvent::{KeyEvent, MouseButtonEvent, MouseMoveEvent, ResizeEvent};
use script_traits::CompositorEvent::{TouchEvent, TouchpadPressureEvent};
use script_traits::{CompositorEvent, ConstellationControlMsg, EventResult};
-use script_traits::{InitialScriptState, MouseButton, MouseEventType, MozBrowserEvent, NewLayoutInfo};
-use script_traits::{LayoutMsg, OpaqueScriptLayoutChannel, ScriptMsg as ConstellationMsg};
-use script_traits::{ScriptThreadFactory, ScriptToCompositorMsg, TimerEvent, TimerEventRequest, TimerSource};
+use script_traits::{InitialScriptState, MouseButton, MouseEventType, MozBrowserEvent};
+use script_traits::{NewLayoutInfo, ScriptMsg as ConstellationMsg};
+use script_traits::{ScriptThreadFactory, TimerEvent, TimerEventRequest, TimerSource};
use script_traits::{TouchEventType, TouchId};
-use std::any::Any;
use std::borrow::ToOwned;
use std::cell::{Cell, RefCell};
use std::collections::HashSet;
use std::option::Option;
+use std::ptr;
use std::rc::Rc;
use std::result::Result;
use std::sync::atomic::{Ordering, AtomicBool};
@@ -348,12 +348,6 @@ pub struct ScriptThread {
/// For communicating load url messages to the constellation
constellation_chan: IpcSender<ConstellationMsg>,
- /// For communicating layout messages to the constellation
- layout_to_constellation_chan: IpcSender<LayoutMsg>,
-
- /// A handle to the compositor for communicating ready state messages.
- compositor: IpcSender<ScriptToCompositorMsg>,
-
/// The port on which we receive messages from the image cache
image_cache_port: Receiver<ImageCacheResult>,
@@ -428,22 +422,16 @@ impl<'a> Drop for ScriptMemoryFailsafe<'a> {
}
impl ScriptThreadFactory for ScriptThread {
- fn create_layout_channel() -> OpaqueScriptLayoutChannel {
- let (chan, port) = channel();
- ScriptLayoutChan::new(chan, port)
- }
-
- fn clone_layout_channel(pair: &OpaqueScriptLayoutChannel)
- -> Box<Any + Send> {
- box pair.sender() as Box<Any + Send>
- }
+ type Message = layout_interface::Msg;
fn create(state: InitialScriptState,
- layout_chan: &OpaqueScriptLayoutChannel,
- load_data: LoadData) {
+ load_data: LoadData)
+ -> (Sender<layout_interface::Msg>, Receiver<layout_interface::Msg>) {
let panic_chan = state.panic_chan.clone();
let (script_chan, script_port) = channel();
- let layout_chan = LayoutChan(layout_chan.sender());
+
+ let (sender, receiver) = channel();
+ let layout_chan = LayoutChan(sender.clone());
let pipeline_id = state.id;
thread::spawn_named_with_send_on_panic(format!("ScriptThread {:?}", state.id),
thread_state::SCRIPT,
@@ -456,8 +444,8 @@ impl ScriptThreadFactory for ScriptThread {
let mem_profiler_chan = state.mem_profiler_chan.clone();
let window_size = state.window_size;
let script_thread = ScriptThread::new(state,
- script_port,
- script_chan.clone());
+ script_port,
+ script_chan.clone());
SCRIPT_THREAD_ROOT.with(|root| {
*root.borrow_mut() = Some(&script_thread as *const _);
@@ -472,13 +460,14 @@ impl ScriptThreadFactory for ScriptThread {
let reporter_name = format!("script-reporter-{}", id);
mem_profiler_chan.run_with_memory_reporting(|| {
script_thread.start();
- let _ = script_thread.compositor.send(ScriptToCompositorMsg::Exited);
let _ = script_thread.content_process_shutdown_chan.send(());
}, reporter_name, script_chan, CommonScriptMsg::CollectReports);
// This must always be the very last operation performed before the thread completes
failsafe.neuter();
}, Some(pipeline_id), panic_chan);
+
+ (sender, receiver)
}
}
@@ -531,7 +520,7 @@ impl ScriptThread {
port: Receiver<MainThreadScriptMsg>,
chan: Sender<MainThreadScriptMsg>)
-> ScriptThread {
- let runtime = unsafe { new_rt_and_cx() };
+ let runtime = unsafe { new_rt_and_cx(ptr::null_mut()) };
unsafe {
JS_SetWrapObjectCallbacks(runtime.rt(),
@@ -581,8 +570,6 @@ impl ScriptThread {
control_chan: state.control_chan,
control_port: control_port,
constellation_chan: state.constellation_chan,
- layout_to_constellation_chan: state.layout_to_constellation_chan,
- compositor: state.compositor,
time_profiler_chan: state.time_profiler_chan,
mem_profiler_chan: state.mem_profiler_chan,
panic_chan: state.panic_chan,
@@ -1099,13 +1086,13 @@ impl ScriptThread {
paint_chan,
panic_chan,
pipeline_port,
+ layout_to_constellation_chan,
layout_shutdown_chan,
content_process_shutdown_chan,
} = new_layout_info;
- let layout_pair = ScriptThread::create_layout_channel();
- let layout_chan = LayoutChan(*ScriptThread::clone_layout_channel(
- &layout_pair).downcast::<Sender<layout_interface::Msg>>().unwrap());
+ let layout_pair = channel();
+ let layout_chan = LayoutChan(layout_pair.0.clone());
let layout_creation_info = NewLayoutThreadInfo {
id: new_pipeline_id,
@@ -1113,7 +1100,7 @@ impl ScriptThread {
is_parent: false,
layout_pair: layout_pair,
pipeline_port: pipeline_port,
- constellation_chan: self.layout_to_constellation_chan.clone(),
+ constellation_chan: layout_to_constellation_chan,
panic_chan: panic_chan,
paint_chan: paint_chan,
script_chan: self.control_chan.clone(),
@@ -1307,8 +1294,8 @@ impl ScriptThread {
// TODO(tkuehn): currently there is only one window,
// so this can afford to be naive and just shut down the
- // compositor. In the future it'll need to be smarter.
- self.compositor.send(ScriptToCompositorMsg::Exit).unwrap();
+ // constellation. In the future it'll need to be smarter.
+ self.constellation_chan.send(ConstellationMsg::Exit).unwrap();
}
/// We have received notification that the response associated with a load has completed.
@@ -1465,7 +1452,6 @@ impl ScriptThread {
FileReadingTaskSource(file_sender.clone()),
self.image_cache_channel.clone(),
self.custom_message_chan.clone(),
- self.compositor.clone(),
self.image_cache_thread.clone(),
self.resource_threads.clone(),
self.bluetooth_thread.clone(),
@@ -1688,8 +1674,11 @@ impl ScriptThread {
let point = Point2D::new(rect.origin.x.to_nearest_px() as f32,
rect.origin.y.to_nearest_px() as f32);
- self.compositor.send(ScriptToCompositorMsg::ScrollFragmentPoint(
- pipeline_id, LayerId::null(), point, false)).unwrap();
+ let message = ConstellationMsg::ScrollFragmentPoint(pipeline_id,
+ LayerId::null(),
+ point,
+ false);
+ self.constellation_chan.send(message).unwrap();
}
/// Reflows non-incrementally, rebuilding the entire layout tree in the process.
@@ -1774,16 +1763,14 @@ impl ScriptThread {
let handled = self.handle_touch_event(pipeline_id, event_type, identifier, point);
match event_type {
TouchEventType::Down => {
- if handled {
+ let result = if handled {
// TODO: Wait to see if preventDefault is called on the first touchmove event.
- self.compositor
- .send(ScriptToCompositorMsg::TouchEventProcessed(
- EventResult::DefaultAllowed)).unwrap();
+ EventResult::DefaultAllowed
} else {
- self.compositor
- .send(ScriptToCompositorMsg::TouchEventProcessed(
- EventResult::DefaultPrevented)).unwrap();
- }
+ EventResult::DefaultPrevented
+ };
+ let message = ConstellationMsg::TouchEventProcessed(result);
+ self.constellation_chan.send(message).unwrap();
}
_ => {
// TODO: Calling preventDefault on a touchup event should prevent clicks.
@@ -1800,7 +1787,7 @@ impl ScriptThread {
KeyEvent(key, state, modifiers) => {
let context = get_browsing_context(&self.root_browsing_context(), pipeline_id);
let document = context.active_document();
- document.dispatch_key_event(key, state, modifiers, &self.compositor);
+ document.dispatch_key_event(key, state, modifiers, &self.constellation_chan);
}
}
}