aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/abstractworker.rs22
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py1
-rw-r--r--components/script/dom/bindings/error.rs4
-rw-r--r--components/script/dom/bindings/global.rs27
-rw-r--r--components/script/dom/bindings/iterable.rs5
-rw-r--r--components/script/dom/bindings/reflector.rs8
-rw-r--r--components/script/dom/browsingcontext.rs2
-rw-r--r--components/script/dom/serviceworker.rs30
-rw-r--r--components/script/dom/worker.rs28
9 files changed, 36 insertions, 91 deletions
diff --git a/components/script/dom/abstractworker.rs b/components/script/dom/abstractworker.rs
index 28c755d4f03..6c5abd0d020 100644
--- a/components/script/dom/abstractworker.rs
+++ b/components/script/dom/abstractworker.rs
@@ -4,7 +4,6 @@
use dom::bindings::refcounted::Trusted;
use dom::bindings::reflector::Reflectable;
-use dom::bindings::str::DOMString;
use dom::bindings::structuredclone::StructuredCloneData;
use js::jsapi::{JSRuntime, JS_RequestInterruptCallback};
use js::rust::Runtime;
@@ -30,27 +29,6 @@ impl<T: Reflectable> SimpleWorkerErrorHandler<T> {
}
}
-pub struct WorkerErrorHandler<T: Reflectable> {
- pub addr: Trusted<T>,
- pub msg: DOMString,
- pub file_name: DOMString,
- pub line_num: u32,
- pub col_num: u32,
-}
-
-impl<T: Reflectable> WorkerErrorHandler<T> {
- pub fn new(addr: Trusted<T>, msg: DOMString, file_name: DOMString, line_num: u32, col_num: u32)
- -> WorkerErrorHandler<T> {
- WorkerErrorHandler {
- addr: addr,
- msg: msg,
- file_name: file_name,
- line_num: line_num,
- col_num: col_num,
- }
- }
-}
-
#[derive(Copy, Clone)]
pub struct SharedRt {
pub rt: *mut JSRuntime
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index cb7e796c627..71331dfe503 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -5452,6 +5452,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'dom::bindings::js::OptionalRootedReference',
'dom::bindings::js::Root',
'dom::bindings::js::RootedReference',
+ 'dom::bindings::reflector::MutReflectable',
'dom::bindings::reflector::Reflectable',
'dom::bindings::utils::DOMClass',
'dom::bindings::utils::DOMJSClass',
diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs
index c111bb62a2a..88ed079d2ba 100644
--- a/components/script/dom/bindings/error.rs
+++ b/components/script/dom/bindings/error.rs
@@ -245,9 +245,7 @@ pub unsafe fn report_pending_exception(cx: *mut JSContext, dispatch_event: bool)
if dispatch_event {
let global = global_root_from_context(cx);
- if let GlobalRef::Window(window) = global.r() {
- window.report_an_error(error_info, value.handle());
- }
+ global.r().report_an_error(error_info, value.handle());
}
}
}
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs
index bfc3212a9c4..54efb11250d 100644
--- a/components/script/dom/bindings/global.rs
+++ b/components/script/dom/bindings/global.rs
@@ -10,11 +10,13 @@
use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId};
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::conversions::root_from_object;
+use dom::bindings::error::ErrorInfo;
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflectable, Reflector};
use dom::window::{self, ScriptHelpers};
use dom::workerglobalscope::WorkerGlobalScope;
use ipc_channel::ipc::IpcSender;
+use js::jsapi::HandleValue;
use js::jsapi::{CurrentGlobalOrNull, GetGlobalForObjectCrossCompartment};
use js::jsapi::{JSContext, JSObject, JS_GetClass, MutableHandleValue};
use js::{JSCLASS_IS_DOMJSCLASS, JSCLASS_IS_GLOBAL};
@@ -269,14 +271,6 @@ impl<'a> GlobalRef<'a> {
}
}
- /// Returns the receiver's reflector.
- pub fn reflector(&self) -> &Reflector {
- match *self {
- GlobalRef::Window(ref window) => window.reflector(),
- GlobalRef::Worker(ref worker) => worker.reflector(),
- }
- }
-
/// Returns a wrapper for runnables to ensure they are cancelled if the global
/// is being destroyed.
pub fn get_runnable_wrapper(&self) -> RunnableWrapper {
@@ -285,6 +279,23 @@ impl<'a> GlobalRef<'a> {
GlobalRef::Worker(ref worker) => worker.get_runnable_wrapper(),
}
}
+
+ /// https://html.spec.whatwg.org/multipage/#report-the-error
+ pub fn report_an_error(&self, error_info: ErrorInfo, value: HandleValue) {
+ match *self {
+ GlobalRef::Window(ref window) => window.report_an_error(error_info, value),
+ GlobalRef::Worker(_) => (),
+ }
+ }
+}
+
+impl<'a> Reflectable for GlobalRef<'a> {
+ fn reflector(&self) -> &Reflector {
+ match *self {
+ GlobalRef::Window(ref window) => window.reflector(),
+ GlobalRef::Worker(ref worker) => worker.reflector(),
+ }
+ }
}
impl GlobalRoot {
diff --git a/components/script/dom/bindings/iterable.rs b/components/script/dom/bindings/iterable.rs
index a3092ed73b6..84381b52655 100644
--- a/components/script/dom/bindings/iterable.rs
+++ b/components/script/dom/bindings/iterable.rs
@@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::IterableIteratorBinding::IterableKeyOrValu
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, Root};
-use dom::bindings::reflector::{Reflector, Reflectable, reflect_dom_object};
+use dom::bindings::reflector::{Reflector, Reflectable, MutReflectable, reflect_dom_object};
use dom::bindings::trace::JSTraceable;
use js::conversions::ToJSValConvertible;
use js::jsapi::{JSContext, JSObject, MutableHandleValue, MutableHandleObject, HandleValue};
@@ -63,6 +63,9 @@ impl<T: Reflectable + JSTraceable + Iterable> Reflectable for IterableIterator<T
fn reflector<'a>(&'a self) -> &'a Reflector {
&self.reflector
}
+}
+
+impl<T: Reflectable + JSTraceable + Iterable> MutReflectable for IterableIterator<T> {
fn init_reflector(&mut self, obj: *mut JSObject) {
self.reflector.set_jsobject(obj);
}
diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs
index 04466ea6926..d5280712a03 100644
--- a/components/script/dom/bindings/reflector.rs
+++ b/components/script/dom/bindings/reflector.rs
@@ -73,11 +73,15 @@ impl Reflector {
pub trait Reflectable {
/// Returns the receiver's reflector.
fn reflector(&self) -> &Reflector;
- /// Initializes the Reflector
- fn init_reflector(&mut self, obj: *mut JSObject);
/// Returns the global object of the realm that the Reflectable was created in.
fn global(&self) -> GlobalRoot where Self: Sized {
global_root_from_reflector(self)
}
}
+
+/// A trait to initialize the `Reflector` for a DOM object.
+pub trait MutReflectable: Reflectable {
+ /// Initializes the Reflector
+ fn init_reflector(&mut self, obj: *mut JSObject);
+}
diff --git a/components/script/dom/browsingcontext.rs b/components/script/dom/browsingcontext.rs
index 18fbe914cef..919b574c27a 100644
--- a/components/script/dom/browsingcontext.rs
+++ b/components/script/dom/browsingcontext.rs
@@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::conversions::{ToJSValConvertible, root_from_handleobject};
use dom::bindings::js::{JS, Root, RootedReference};
use dom::bindings::proxyhandler::{fill_property_descriptor, get_property_descriptor};
-use dom::bindings::reflector::{Reflectable, Reflector};
+use dom::bindings::reflector::{Reflectable, MutReflectable, Reflector};
use dom::bindings::str::DOMString;
use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::WindowProxyHandler;
diff --git a/components/script/dom/serviceworker.rs b/components/script/dom/serviceworker.rs
index 19af9b09ba4..2b79be43dc8 100644
--- a/components/script/dom/serviceworker.rs
+++ b/components/script/dom/serviceworker.rs
@@ -2,8 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use dom::abstractworker::WorkerScriptMsg;
-use dom::abstractworker::{SimpleWorkerErrorHandler, WorkerErrorHandler};
+use dom::abstractworker::{SimpleWorkerErrorHandler, WorkerScriptMsg};
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::codegen::Bindings::ServiceWorkerBinding::{ServiceWorkerMethods, ServiceWorkerState, Wrap};
@@ -11,12 +10,9 @@ use dom::bindings::global::GlobalRef;
use dom::bindings::inheritance::Castable;
use dom::bindings::js::Root;
use dom::bindings::refcounted::Trusted;
-use dom::bindings::reflector::{Reflectable, reflect_dom_object};
-use dom::bindings::str::{DOMString, USVString};
-use dom::errorevent::ErrorEvent;
-use dom::event::{Event, EventBubbles, EventCancelable};
+use dom::bindings::reflector::reflect_dom_object;
+use dom::bindings::str::USVString;
use dom::eventtarget::EventTarget;
-use js::jsval::UndefinedValue;
use script_thread::Runnable;
use std::cell::Cell;
use std::sync::mpsc::Sender;
@@ -66,18 +62,6 @@ impl ServiceWorker {
Url::parse(&self.script_url.borrow().clone()).unwrap()
}
- pub fn handle_error_message(address: TrustedServiceWorkerAddress, message: DOMString,
- filename: DOMString, lineno: u32, colno: u32) {
- let worker = address.root();
-
- let global = worker.r().global();
- rooted!(in(global.r().get_cx()) let error = UndefinedValue());
- let errorevent = ErrorEvent::new(global.r(), atom!("error"),
- EventBubbles::Bubbles, EventCancelable::Cancelable,
- message, filename, lineno, colno, error.handle());
- errorevent.upcast::<Event>().fire(worker.upcast());
- }
-
pub fn install_serviceworker(global: GlobalRef,
script_url: Url,
skip_waiting: bool) -> Root<ServiceWorker> {
@@ -112,11 +96,3 @@ impl Runnable for SimpleWorkerErrorHandler<ServiceWorker> {
ServiceWorker::dispatch_simple_error(this.addr);
}
}
-
-impl Runnable for WorkerErrorHandler<ServiceWorker> {
- #[allow(unrooted_must_root)]
- fn handler(self: Box<WorkerErrorHandler<ServiceWorker>>) {
- let this = *self;
- ServiceWorker::handle_error_message(this.addr, this.msg, this.file_name, this.line_num, this.col_num);
- }
-}
diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs
index c1ad7cf5a96..f171d1ee515 100644
--- a/components/script/dom/worker.rs
+++ b/components/script/dom/worker.rs
@@ -4,7 +4,7 @@
use devtools_traits::{ScriptToDevtoolsControlMsg, DevtoolsPageInfo};
use dom::abstractworker::WorkerScriptMsg;
-use dom::abstractworker::{SimpleWorkerErrorHandler, SharedRt, WorkerErrorHandler};
+use dom::abstractworker::{SimpleWorkerErrorHandler, SharedRt};
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::codegen::Bindings::WorkerBinding;
use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods;
@@ -17,8 +17,6 @@ use dom::bindings::reflector::{Reflectable, reflect_dom_object};
use dom::bindings::str::DOMString;
use dom::bindings::structuredclone::StructuredCloneData;
use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
-use dom::errorevent::ErrorEvent;
-use dom::event::{Event, EventBubbles, EventCancelable};
use dom::eventtarget::EventTarget;
use dom::messageevent::MessageEvent;
use dom::workerglobalscope::prepare_workerscope_init;
@@ -139,22 +137,6 @@ impl Worker {
let worker = address.root();
worker.upcast().fire_simple_event("error");
}
-
- pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString,
- filename: DOMString, lineno: u32, colno: u32) {
- let worker = address.root();
-
- if worker.is_terminated() {
- return;
- }
-
- let global = worker.r().global();
- rooted!(in(global.r().get_cx()) let error = UndefinedValue());
- let errorevent = ErrorEvent::new(global.r(), atom!("error"),
- EventBubbles::Bubbles, EventCancelable::Cancelable,
- message, filename, lineno, colno, error.handle());
- errorevent.upcast::<Event>().fire(worker.upcast());
- }
}
impl WorkerMethods for Worker {
@@ -220,11 +202,3 @@ impl Runnable for SimpleWorkerErrorHandler<Worker> {
Worker::dispatch_simple_error(this.addr);
}
}
-
-impl Runnable for WorkerErrorHandler<Worker> {
- #[allow(unrooted_must_root)]
- fn handler(self: Box<WorkerErrorHandler<Worker>>) {
- let this = *self;
- Worker::handle_error_message(this.addr, this.msg, this.file_name, this.line_num, this.col_num);
- }
-}