void IGUIObject::ScriptEvent(const CStr& Action) { auto it = m_ScriptHandlers.find(Action); if (it == m_ScriptHandlers.end()) return; JSContext* cx = m_pGUI->GetScriptInterface()->GetContext(); JSAutoRequest rq(cx); // Set up the 'mouse' parameter JS::RootedValue mouse(cx); m_pGUI->GetScriptInterface()->Eval("({})", &mouse); m_pGUI->GetScriptInterface()->SetProperty(mouse, "x", m_pGUI->m_MousePos.x, false); m_pGUI->GetScriptInterface()->SetProperty(mouse, "y", m_pGUI->m_MousePos.y, false); m_pGUI->GetScriptInterface()->SetProperty(mouse, "buttons", m_pGUI->m_MouseButtons, false); JS::AutoValueVector paramData(cx); paramData.append(mouse); JS::RootedObject obj(cx, GetJSObject()); JS::RootedValue handlerVal(cx, JS::ObjectValue(*it->second)); JS::RootedValue result(cx); bool ok = JS_CallFunctionValue(cx, obj, handlerVal, paramData, &result); if (!ok) { // We have no way to propagate the script exception, so just ignore it // and hope the caller checks JS_IsExceptionPending } }
/* readonly attribute nsISimpleEnumerator enumerator; */ NS_IMETHODIMP nsXPCWrappedJS::GetEnumerator(nsISimpleEnumerator * *aEnumerate) { XPCCallContext ccx(NATIVE_CALLER); if (!ccx.IsValid()) return NS_ERROR_UNEXPECTED; return nsXPCWrappedJSClass::BuildPropertyEnumerator(ccx, GetJSObject(), aEnumerate); }
NS_IMETHODIMP nsXPCWrappedJS::GetJSObject(JSObject** aJSObj) { NS_PRECONDITION(aJSObj, "bad param"); NS_PRECONDITION(IsValid(), "bad wrapper"); if (!(*aJSObj = GetJSObject())) return NS_ERROR_OUT_OF_MEMORY; return NS_OK; }
/* nsIVariant getProperty (in AString name); */ NS_IMETHODIMP nsXPCWrappedJS::GetProperty(const nsAString & name, nsIVariant **_retval) { XPCCallContext ccx(NATIVE_CALLER); if (!ccx.IsValid()) return NS_ERROR_UNEXPECTED; return nsXPCWrappedJSClass:: GetNamedPropertyAsVariant(ccx, GetJSObject(), name, _retval); }
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_END void DOMBindingBase::_trace(JSTracer* aTrc) { JSObject* obj = GetJSObject(); if (obj) { JS_CALL_OBJECT_TRACER(aTrc, obj, "cached wrapper"); } }
XPCDispTypeInfo * XPCDispatchTearOff::GetCOMTypeInfo() { // If one was already created return it if(mCOMTypeInfo) return mCOMTypeInfo; // Build a new one, save the pointer and return it XPCCallContext ccx(NATIVE_CALLER); if(!ccx.IsValid()) return nsnull; JSObject* obj = GetJSObject(); if(!obj) return nsnull; mCOMTypeInfo = XPCDispTypeInfo::New(ccx, obj); NS_IF_ADDREF(mCOMTypeInfo); return mCOMTypeInfo; }
/* nsIVariant getProperty (in AString name); */ NS_IMETHODIMP nsXPCWrappedJS::GetProperty(const nsAString & name, nsIVariant **_retval) { XPCCallContext ccx(NATIVE_CALLER); if (!ccx.IsValid()) return NS_ERROR_UNEXPECTED; nsStringBuffer* buf; jsval jsstr = XPCStringConvert::ReadableToJSVal(ccx, name, &buf); if (JSVAL_IS_NULL(jsstr)) return NS_ERROR_OUT_OF_MEMORY; if (buf) buf->AddRef(); return nsXPCWrappedJSClass:: GetNamedPropertyAsVariant(ccx, GetJSObject(), jsstr, _retval); }
void IGUIObject::ScriptEvent(const CStr& Action, JS::HandleValue Argument) { auto it = m_ScriptHandlers.find(Action); if (it == m_ScriptHandlers.end()) return; JSContext* cx = m_pGUI->GetScriptInterface()->GetContext(); JSAutoRequest rq(cx); JS::AutoValueVector paramData(cx); paramData.append(Argument.get()); JS::RootedObject obj(cx, GetJSObject()); JS::RootedValue handlerVal(cx, JS::ObjectValue(*it->second)); JS::RootedValue result(cx); bool ok = JS_CallFunctionValue(cx, obj, handlerVal, paramData, &result); if (!ok) { JS_ReportError(cx, "Errors executing script action \"%s\"", Action.c_str()); } }