mirror of
https://github.com/servo/servo.git
synced 2025-06-09 00:53:26 +00:00
auto merge of #4854 : jdm/servo/workererr, r=jdm
...rker object. Rebased from #4537.
This commit is contained in:
commit
c360b75e16
3 changed files with 42 additions and 3 deletions
|
@ -5,6 +5,7 @@
|
|||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding;
|
||||
use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::DedicatedWorkerGlobalScopeMethods;
|
||||
use dom::bindings::codegen::Bindings::ErrorEventBinding::ErrorEventMethods;
|
||||
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
|
||||
use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived;
|
||||
use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast};
|
||||
|
@ -14,12 +15,14 @@ use dom::bindings::js::{JSRef, Temporary, RootCollection};
|
|||
use dom::bindings::refcounted::LiveDOMReferences;
|
||||
use dom::bindings::structuredclone::StructuredCloneData;
|
||||
use dom::bindings::utils::Reflectable;
|
||||
use dom::errorevent::ErrorEvent;
|
||||
use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId};
|
||||
use dom::messageevent::MessageEvent;
|
||||
use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler};
|
||||
use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler, Worker};
|
||||
use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers};
|
||||
use dom::workerglobalscope::WorkerGlobalScopeTypeId;
|
||||
use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource};
|
||||
use script_task::ScriptMsg::WorkerDispatchErrorEvent;
|
||||
use script_task::StackRootTLS;
|
||||
|
||||
use servo_net::resource_task::{ResourceTask, load_whole_resource};
|
||||
|
@ -193,6 +196,7 @@ impl<'a> DedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalSc
|
|||
|
||||
trait PrivateDedicatedWorkerGlobalScopeHelpers {
|
||||
fn handle_event(self, msg: ScriptMsg);
|
||||
fn dispatch_error_to_worker(self, JSRef<ErrorEvent>);
|
||||
}
|
||||
|
||||
impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> {
|
||||
|
@ -211,6 +215,9 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG
|
|||
let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self);
|
||||
LiveDOMReferences::cleanup(scope.get_cx(), addr);
|
||||
}
|
||||
ScriptMsg::WorkerDispatchErrorEvent(addr, msg, file_name, line_num, col_num) => {
|
||||
Worker::handle_error_message(addr, msg, file_name, line_num, col_num);
|
||||
},
|
||||
ScriptMsg::FireTimer(TimerSource::FromWorker, timer_id) => {
|
||||
let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self);
|
||||
scope.handle_fire_timer(timer_id);
|
||||
|
@ -218,6 +225,16 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG
|
|||
_ => panic!("Unexpected message"),
|
||||
}
|
||||
}
|
||||
|
||||
fn dispatch_error_to_worker(self, errorevent: JSRef<ErrorEvent>) {
|
||||
let msg = errorevent.Message();
|
||||
let file_name = errorevent.Filename();
|
||||
let line_num = errorevent.Lineno();
|
||||
let col_num = errorevent.Colno();
|
||||
let worker = self.worker.borrow().as_ref().unwrap().clone();
|
||||
self.parent_sender.send(ScriptMsg::WorkerDispatchErrorEvent(worker, msg, file_name,
|
||||
line_num, col_num));
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalScope> {
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
use dom::bindings::codegen::Bindings::WorkerBinding;
|
||||
use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods;
|
||||
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
|
||||
use dom::bindings::codegen::InheritTypes::EventTargetCast;
|
||||
use dom::bindings::codegen::InheritTypes::{EventCast, EventTargetCast};
|
||||
use dom::bindings::error::{Fallible, ErrorResult};
|
||||
use dom::bindings::error::Error::Syntax;
|
||||
use dom::bindings::global::{GlobalRef, GlobalField};
|
||||
|
@ -15,6 +15,8 @@ use dom::bindings::structuredclone::StructuredCloneData;
|
|||
use dom::bindings::trace::JSTraceable;
|
||||
use dom::bindings::utils::{Reflectable, reflect_dom_object};
|
||||
use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
|
||||
use dom::errorevent::ErrorEvent;
|
||||
use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers};
|
||||
use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId};
|
||||
use dom::messageevent::MessageEvent;
|
||||
use script_task::{ScriptChan, ScriptMsg, Runnable};
|
||||
|
@ -22,9 +24,10 @@ use script_task::{ScriptChan, ScriptMsg, Runnable};
|
|||
use util::str::DOMString;
|
||||
|
||||
use js::jsapi::JSContext;
|
||||
use js::jsval::JSVal;
|
||||
use js::jsval::{JSVal, UndefinedValue};
|
||||
use url::UrlParser;
|
||||
|
||||
use std::borrow::ToOwned;
|
||||
use std::cell::Cell;
|
||||
use std::sync::mpsc::{channel, Sender};
|
||||
|
||||
|
@ -88,6 +91,19 @@ impl Worker {
|
|||
let message = data.read(global.r());
|
||||
MessageEvent::dispatch_jsval(target, global.r(), message);
|
||||
}
|
||||
|
||||
pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString,
|
||||
filename: DOMString, lineno: u32, colno: u32) {
|
||||
let worker = address.to_temporary().root();
|
||||
let global = worker.r().global.root();
|
||||
let error = UndefinedValue();
|
||||
let target: JSRef<EventTarget> = EventTargetCast::from_ref(worker.r());
|
||||
let errorevent = ErrorEvent::new(global.r(), "error".to_owned(),
|
||||
EventBubbles::Bubbles, EventCancelable::Cancelable,
|
||||
message, filename, lineno, colno, error).root();
|
||||
let event: JSRef<Event> = EventCast::from_ref(errorevent.r());
|
||||
event.fire(target);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> WorkerMethods for JSRef<'a, Worker> {
|
||||
|
|
|
@ -32,6 +32,7 @@ use dom::keyboardevent::KeyboardEvent;
|
|||
use dom::mouseevent::MouseEvent;
|
||||
use dom::node::{self, Node, NodeHelpers, NodeDamage, NodeTypeId};
|
||||
use dom::window::{Window, WindowHelpers, ScriptHelpers};
|
||||
use dom::worker::{Worker, TrustedWorkerAddress};
|
||||
use parse::html::{HTMLInput, parse_html};
|
||||
use layout_interface::{ScriptLayoutChan, LayoutChan, ReflowGoal, ReflowQueryType};
|
||||
use layout_interface;
|
||||
|
@ -63,6 +64,7 @@ use servo_net::resource_task::LoadData as NetLoadData;
|
|||
use servo_net::storage_task::StorageTask;
|
||||
use util::geometry::to_frac_px;
|
||||
use util::smallvec::SmallVec;
|
||||
use util::str::DOMString;
|
||||
use util::task::spawn_named_with_send_on_failure;
|
||||
use util::task_state;
|
||||
|
||||
|
@ -123,6 +125,8 @@ pub enum ScriptMsg {
|
|||
/// Message sent through Worker.postMessage (only dispatched to
|
||||
/// DedicatedWorkerGlobalScope).
|
||||
DOMMessage(StructuredCloneData),
|
||||
/// Sends a message to the Worker object (dispatched to all tasks) regarding error.
|
||||
WorkerDispatchErrorEvent(TrustedWorkerAddress, DOMString, DOMString, u32, u32),
|
||||
/// Generic message that encapsulates event handling.
|
||||
RunnableMsg(Box<Runnable+Send>),
|
||||
/// A DOM object's last pinned reference was removed (dispatched to all tasks).
|
||||
|
@ -617,6 +621,8 @@ impl ScriptTask {
|
|||
self.handle_exit_window_msg(id),
|
||||
ScriptMsg::DOMMessage(..) =>
|
||||
panic!("unexpected message"),
|
||||
ScriptMsg::WorkerDispatchErrorEvent(addr, msg, file_name,line_num, col_num) =>
|
||||
Worker::handle_error_message(addr, msg, file_name, line_num, col_num),
|
||||
ScriptMsg::RunnableMsg(runnable) =>
|
||||
runnable.handler(),
|
||||
ScriptMsg::RefcountCleanup(addr) =>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue