Report exceptions to JS when the DOM implementation fails.

As a bonus, adds some debugging statements.
This commit is contained in:
Ms2ger 2013-10-23 08:19:26 +02:00
parent c5db2ab516
commit 29a7405b4e
4 changed files with 24 additions and 6 deletions

View file

@ -3107,11 +3107,10 @@ class CGPerSignatureCall(CGThing):
self.idlNode.identifier.name)) self.idlNode.identifier.name))
def getErrorReport(self): def getErrorReport(self):
#return CGGeneric('return ThrowMethodFailedWithDetails<%s>(cx, rv, "%s", "%s");' return CGGeneric(
# % (toStringBool(not self.descriptor.workers), 'return throw_method_failed_with_details(cx, result_fallible, "%s", "%s");' %
# self.descriptor.interface.identifier.name, (self.descriptor.interface.identifier.name,
# self.idlNode.identifier.name)) self.idlNode.identifier.name))
return CGGeneric('return 0'); #XXXjdm
def define(self): def define(self):
return (self.cgRoot.define() + "\n" + self.wrap_return_value()) return (self.cgRoot.define() + "\n" + self.wrap_return_value())

View file

@ -18,6 +18,7 @@ use std::unstable::raw::Box;
use js::glue::*; use js::glue::*;
use js::glue::{DefineFunctionWithReserved, GetObjectJSClass, RUST_OBJECT_TO_JSVAL}; use js::glue::{DefineFunctionWithReserved, GetObjectJSClass, RUST_OBJECT_TO_JSVAL};
use js::glue::{js_IsObjectProxyClass, js_IsFunctionProxyClass, IsProxyHandlerFamily}; use js::glue::{js_IsObjectProxyClass, js_IsFunctionProxyClass, IsProxyHandlerFamily};
use js::glue::{ReportError};
use js::jsapi::{JS_AlreadyHasOwnProperty, JS_NewObject, JS_NewFunction}; use js::jsapi::{JS_AlreadyHasOwnProperty, JS_NewObject, JS_NewFunction};
use js::jsapi::{JS_DefineProperties, JS_WrapValue, JS_ForwardGetPropertyTo}; use js::jsapi::{JS_DefineProperties, JS_WrapValue, JS_ForwardGetPropertyTo};
use js::jsapi::{JS_GetClass, JS_LinkConstructorAndPrototype, JS_GetStringCharsAndLength}; use js::jsapi::{JS_GetClass, JS_LinkConstructorAndPrototype, JS_GetStringCharsAndLength};
@ -30,6 +31,7 @@ use js::jsapi::{JSContext, JSObject, JSBool, jsid, JSClass, JSNative, JSTracer};
use js::jsapi::{JSFunctionSpec, JSPropertySpec, JSVal, JSPropertyDescriptor}; use js::jsapi::{JSFunctionSpec, JSPropertySpec, JSVal, JSPropertyDescriptor};
use js::jsapi::{JSPropertyOp, JSStrictPropertyOp, JS_NewGlobalObject, JS_InitStandardClasses}; use js::jsapi::{JSPropertyOp, JSStrictPropertyOp, JS_NewGlobalObject, JS_InitStandardClasses};
use js::jsapi::{JSString, JS_CallTracer, JSTRACE_OBJECT}; use js::jsapi::{JSString, JS_CallTracer, JSTRACE_OBJECT};
use js::jsapi::{JS_IsExceptionPending};
use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType; use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType;
use js::{JSPROP_ENUMERATE, JSVAL_NULL, JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS}; use js::{JSPROP_ENUMERATE, JSVAL_NULL, JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS};
use js::{JSPROP_PERMANENT, JSID_VOID, JSPROP_NATIVE_ACCESSORS, JSPROP_GETTER}; use js::{JSPROP_PERMANENT, JSID_VOID, JSPROP_NATIVE_ACCESSORS, JSPROP_GETTER};
@ -251,6 +253,7 @@ pub fn jsval_to_str(cx: *JSContext, v: JSVal,
} else { } else {
let jsstr = unsafe { JS_ValueToString(cx, v) }; let jsstr = unsafe { JS_ValueToString(cx, v) };
if jsstr.is_null() { if jsstr.is_null() {
debug!("JS_ValueToString failed");
Err(()) Err(())
} else { } else {
Ok(jsstring_to_str(cx, jsstr)) Ok(jsstring_to_str(cx, jsstr))
@ -265,6 +268,7 @@ pub fn jsval_to_domstring(cx: *JSContext, v: JSVal) -> Result<Option<DOMString>,
} else { } else {
let jsstr = unsafe { JS_ValueToString(cx, v) }; let jsstr = unsafe { JS_ValueToString(cx, v) };
if jsstr.is_null() { if jsstr.is_null() {
debug!("JS_ValueToString failed");
Err(()) Err(())
} else { } else {
Ok(Some(jsstring_to_str(cx, jsstr))) Ok(Some(jsstring_to_str(cx, jsstr)))
@ -917,6 +921,20 @@ pub fn cx_for_dom_object<T: Reflectable>(obj: &mut T) -> *JSContext {
cx_for_dom_reflector(obj.reflector().get_jsobject()) cx_for_dom_reflector(obj.reflector().get_jsobject())
} }
#[fixed_stack_segment]
pub fn throw_method_failed_with_details<T>(cx: *JSContext,
result: Result<T, Error>,
interface: &'static str,
member: &'static str) -> JSBool {
assert!(result.is_err());
assert!(unsafe { JS_IsExceptionPending(cx) } == 0);
let message = format!("Method failed: {}.{}", interface, member);
do message.with_c_str |string| {
unsafe { ReportError(cx, string) };
}
return 0;
}
/// Check if an element name is valid. See http://www.w3.org/TR/xml/#NT-Name /// Check if an element name is valid. See http://www.w3.org/TR/xml/#NT-Name
/// for details. /// for details.
#[deriving(Eq)] #[deriving(Eq)]

View file

@ -194,6 +194,7 @@ impl Document {
pub fn CreateElement(&self, abstract_self: AbstractDocument, local_name: DOMString) -> Fallible<AbstractNode<ScriptView>> { pub fn CreateElement(&self, abstract_self: AbstractDocument, local_name: DOMString) -> Fallible<AbstractNode<ScriptView>> {
if xml_name_type(local_name) == InvalidXMLName { if xml_name_type(local_name) == InvalidXMLName {
debug!("Not a valid element name");
return Err(InvalidCharacter); return Err(InvalidCharacter);
} }
let local_name = local_name.to_ascii_lower(); let local_name = local_name.to_ascii_lower();

@ -1 +1 @@
Subproject commit 566c2af971abaa5e8c51b59fa400a7e07835b257 Subproject commit e3c4f8bfbea4f5523493c394576e76660fdf175d