diff options
author | Ms2ger <Ms2ger@gmail.com> | 2016-08-27 16:17:37 +0200 |
---|---|---|
committer | Ms2ger <Ms2ger@gmail.com> | 2016-09-02 11:44:44 +0200 |
commit | ae38c53de7443db395fc06be2df0802531576794 (patch) | |
tree | 31b2cc46ef98f120a8ff3137d84e33816d01f6cc /components/script/dom/bindings/error.rs | |
parent | 92c3961743daddefc24846aad734ed5bce715978 (diff) | |
download | servo-ae38c53de7443db395fc06be2df0802531576794.tar.gz servo-ae38c53de7443db395fc06be2df0802531576794.zip |
Dispatch error events at the window object.
Diffstat (limited to 'components/script/dom/bindings/error.rs')
-rw-r--r-- | components/script/dom/bindings/error.rs | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 6c26ae8502c..752f0d75b49 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionMethods; use dom::bindings::codegen::PrototypeList::proto_id_to_name; use dom::bindings::conversions::root_from_object; use dom::bindings::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible}; -use dom::bindings::global::GlobalRef; +use dom::bindings::global::{GlobalRef, global_root_from_context}; use dom::bindings::str::USVString; use dom::domexception::{DOMErrorName, DOMException}; use js::error::{throw_range_error, throw_type_error}; @@ -132,11 +132,16 @@ pub unsafe fn throw_dom_exception(cx: *mut JSContext, global: GlobalRef, result: JS_SetPendingException(cx, thrown.handle()); } -struct ErrorInfo { - filename: String, - message: String, - lineno: c_uint, - column: c_uint, +/// A struct encapsulating information about a runtime script error. +pub struct ErrorInfo { + /// The error message. + pub message: String, + /// The file name. + pub filename: String, + /// The line number. + pub lineno: c_uint, + /// The column number. + pub column: c_uint, } impl ErrorInfo { @@ -192,7 +197,10 @@ impl ErrorInfo { } /// Report a pending exception, thereby clearing it. -pub unsafe fn report_pending_exception(cx: *mut JSContext) { +/// +/// The `dispatch_event` argument is temporary and non-standard; passing false +/// prevents dispatching the `error` event. +pub unsafe fn report_pending_exception(cx: *mut JSContext, dispatch_event: bool) { if JS_IsExceptionPending(cx) { rooted!(in(cx) let mut value = UndefinedValue()); if !JS_GetPendingException(cx, value.handle_mut()) { @@ -202,22 +210,31 @@ pub unsafe fn report_pending_exception(cx: *mut JSContext) { } JS_ClearPendingException(cx); - if !value.is_object() { - match USVString::from_jsval(cx, value.handle(), ()) { - Ok(ConversionResult::Success(USVString(string))) => error!("Uncaught exception: {}", string), - _ => error!("Uncaught exception: failed to stringify primitive"), + let error_info = if value.is_object() { + rooted!(in(cx) let object = value.to_object()); + let error_info = ErrorInfo::from_native_error(cx, object.handle()) + .or_else(|| ErrorInfo::from_dom_exception(object.handle())); + match error_info { + Some(error_info) => error_info, + None => { + error!("Uncaught exception: failed to extract information"); + return; + } } - return; - } - - rooted!(in(cx) let object = value.to_object()); - let error_info = ErrorInfo::from_native_error(cx, object.handle()) - .or_else(|| ErrorInfo::from_dom_exception(object.handle())); - let error_info = match error_info { - Some(error_info) => error_info, - None => { - error!("Uncaught exception: failed to extract information"); - return; + } else { + match USVString::from_jsval(cx, value.handle(), ()) { + Ok(ConversionResult::Success(USVString(string))) => { + ErrorInfo { + message: format!("uncaught exception: {}", string), + filename: String::new(), + lineno: 0, + column: 0, + } + }, + _ => { + error!("Uncaught exception: failed to stringify primitive"); + return; + }, } }; @@ -226,6 +243,13 @@ pub unsafe fn report_pending_exception(cx: *mut JSContext) { error_info.lineno, error_info.column, error_info.message); + + 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()); + } + } } } |