diff options
Diffstat (limited to 'components/script/script_task.rs')
-rw-r--r-- | components/script/script_task.rs | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 4b64700b8bc..8573efa9d3f 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -31,7 +31,7 @@ use dom::htmlelement::HTMLElementTypeId; use dom::htmliframeelement::HTMLIFrameElement; use dom::keyboardevent::KeyboardEvent; use dom::mouseevent::MouseEvent; -use dom::node::{self, Node, NodeHelpers, NodeDamage, NodeTypeId}; +use dom::node::{self, Node, NodeHelpers, NodeDamage, NodeTypeId, window_from_node}; use dom::window::{Window, WindowHelpers, ScriptHelpers}; use dom::worker::{Worker, TrustedWorkerAddress}; use parse::html::{HTMLInput, parse_html}; @@ -41,9 +41,8 @@ use page::{Page, IterablePage, Frame}; use timers::TimerId; use devtools; -use devtools_traits::{DevtoolsControlChan, DevtoolsControlPort, NewGlobal, GetRootNode, DevtoolsPageInfo}; -use devtools_traits::{DevtoolScriptControlMsg, EvaluateJS, GetDocumentElement}; -use devtools_traits::{GetChildren, GetLayout, ModifyAttribute, WantsLiveNotifications}; +use devtools_traits::{DevtoolsControlChan, DevtoolsControlPort, DevtoolsPageInfo}; +use devtools_traits::{DevtoolsControlMsg, DevtoolScriptControlMsg}; use script_traits::CompositorEvent; use script_traits::CompositorEvent::{ResizeEvent, ReflowEvent, ClickEvent}; use script_traits::CompositorEvent::{MouseDownEvent, MouseUpEvent}; @@ -71,7 +70,7 @@ use util::task_state; use geom::point::Point2D; use hyper::header::{Header, Headers, HeaderFormat}; -use hyper::header::shared::util as header_util; +use hyper::header::parsing as header_parsing; use js::jsapi::{JS_SetWrapObjectCallbacks, JS_SetGCZeal, JS_DEFAULT_ZEAL_FREQ, JS_GC}; use js::jsapi::{JSContext, JSRuntime, JSObject}; use js::jsapi::{JS_SetGCParameter, JSGC_MAX_BYTES}; @@ -84,7 +83,7 @@ use libc; use std::any::Any; use std::borrow::ToOwned; use std::cell::Cell; -use std::fmt::{self, Show}; +use std::fmt::{self, Display}; use std::mem::replace; use std::num::ToPrimitive; use std::rc::Rc; @@ -109,7 +108,7 @@ pub trait Runnable { pub enum ScriptMsg { /// Acts on a fragment URL load on the specified pipeline (only dispatched /// to ScriptTask). - TriggerFragment(PipelineId, Url), + TriggerFragment(PipelineId, String), /// Begins a content-initiated load on the specified pipeline (only /// dispatched to ScriptTask). TriggerLoad(PipelineId, LoadData), @@ -610,8 +609,8 @@ impl ScriptTask { match msg { ScriptMsg::TriggerLoad(id, load_data) => self.trigger_load(id, load_data), - ScriptMsg::TriggerFragment(id, url) => - self.trigger_fragment(id, url), + ScriptMsg::TriggerFragment(id, fragment) => + self.trigger_fragment(id, fragment), ScriptMsg::FireTimer(TimerSource::FromWindow(id), timer_id) => self.handle_fire_timer_msg(id, timer_id), ScriptMsg::FireTimer(TimerSource::FromWorker, _) => @@ -633,19 +632,19 @@ impl ScriptTask { fn handle_msg_from_devtools(&self, msg: DevtoolScriptControlMsg) { match msg { - EvaluateJS(id, s, reply) => + DevtoolScriptControlMsg::EvaluateJS(id, s, reply) => devtools::handle_evaluate_js(&*self.page.borrow(), id, s, reply), - GetRootNode(id, reply) => + DevtoolScriptControlMsg::GetRootNode(id, reply) => devtools::handle_get_root_node(&*self.page.borrow(), id, reply), - GetDocumentElement(id, reply) => + DevtoolScriptControlMsg::GetDocumentElement(id, reply) => devtools::handle_get_document_element(&*self.page.borrow(), id, reply), - GetChildren(id, node_id, reply) => + DevtoolScriptControlMsg::GetChildren(id, node_id, reply) => devtools::handle_get_children(&*self.page.borrow(), id, node_id, reply), - GetLayout(id, node_id, reply) => + DevtoolScriptControlMsg::GetLayout(id, node_id, reply) => devtools::handle_get_layout(&*self.page.borrow(), id, node_id, reply), - ModifyAttribute(id, node_id, modifications) => + DevtoolScriptControlMsg::ModifyAttribute(id, node_id, modifications) => devtools::handle_modify_attribute(&*self.page.borrow(), id, node_id, modifications), - WantsLiveNotifications(pipeline_id, to_send) => + DevtoolScriptControlMsg::WantsLiveNotifications(pipeline_id, to_send) => devtools::handle_wants_live_notifications(&*self.page.borrow(), pipeline_id, to_send), } } @@ -947,8 +946,9 @@ impl ScriptTask { title: document.r().Title(), url: final_url }; - chan.send(NewGlobal(pipeline_id, self.devtools_sender.clone(), - page_info)).unwrap(); + chan.send(DevtoolsControlMsg::NewGlobal(pipeline_id, + self.devtools_sender.clone(), + page_info)).unwrap(); } } } @@ -1113,9 +1113,9 @@ impl ScriptTask { /// The entry point for content to notify that a fragment url has been requested /// for the given pipeline. - fn trigger_fragment(&self, pipeline_id: PipelineId, url: Url) { + fn trigger_fragment(&self, pipeline_id: PipelineId, fragment: String) { let page = get_page(&*self.page.borrow(), pipeline_id); - match page.find_fragment_node(url.fragment.unwrap()).root() { + match page.find_fragment_node(fragment).root() { Some(node) => { self.scroll_fragment_point(pipeline_id, node.r()); } @@ -1363,13 +1363,13 @@ struct LastModified(pub Tm); impl Header for LastModified { #[inline] - fn header_name(_: Option<LastModified>) -> &'static str { + fn header_name() -> &'static str { "Last-Modified" } // Parses an RFC 2616 compliant date/time string, fn parse_header(raw: &[Vec<u8>]) -> Option<LastModified> { - header_util::from_one_raw_str(raw).and_then(|s: String| { + header_parsing::from_one_raw_str(raw).and_then(|s: String| { let s = s.as_slice(); strptime(s, "%a, %d %b %Y %T %Z").or_else(|_| { strptime(s, "%A, %d-%b-%y %T %Z") @@ -1386,8 +1386,8 @@ impl HeaderFormat for LastModified { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { let LastModified(ref tm) = *self; match tm.tm_utcoff { - 0 => tm.rfc822().fmt(f), - _ => tm.to_utc().rfc822().fmt(f) + 0 => <_ as Display>::fmt(&tm.rfc822(), f), + _ => <_ as Display>::fmt(&tm.to_utc().rfc822(), f) } } } @@ -1432,6 +1432,20 @@ impl DocumentProgressHandler { let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(document.r()); event.r().set_trusted(true); let _ = wintarget.dispatch_event_with_target(doctarget, event.r()); + + let window_ref = window.r(); + let browser_context = window_ref.browser_context(); + let browser_context = browser_context.as_ref().unwrap(); + + browser_context.frame_element().map(|frame_element| { + let frame_element = frame_element.root(); + let frame_window = window_from_node(frame_element.r()).root(); + let event = Event::new(GlobalRef::Window(frame_window.r()), "load".to_owned(), + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable).root(); + let target: JSRef<EventTarget> = EventTargetCast::from_ref(frame_element.r()); + event.r().fire(target); + }); } } |