mirror of
https://github.com/servo/servo.git
synced 2025-06-16 12:24:29 +00:00
Report exceptions to JS when the DOM implementation fails.
As a bonus, adds some debugging statements.
This commit is contained in:
parent
c5db2ab516
commit
29a7405b4e
4 changed files with 24 additions and 6 deletions
|
@ -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())
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue