bool ScriptInterface::SetPrototype(JS::HandleValue objVal, JS::HandleValue protoVal) { JSAutoRequest rq(m->m_cx); if (!objVal.isObject() || !protoVal.isObject()) return false; JS::RootedObject obj(m->m_cx, &objVal.toObject()); JS::RootedObject proto(m->m_cx, &protoVal.toObject()); return JS_SetPrototype(m->m_cx, obj, proto); }
template<typename T> static bool FromJSVal_vector(JSContext* cx, JS::HandleValue v, std::vector<T>& out) { JSAutoRequest rq(cx); JS::RootedObject obj(cx); if (!v.isObject()) FAIL("Argument must be an array"); obj = &v.toObject(); if (!(JS_IsArrayObject(cx, obj) || JS_IsTypedArrayObject(obj))) FAIL("Argument must be an array"); u32 length; if (!JS_GetArrayLength(cx, obj, &length)) FAIL("Failed to get array length"); out.reserve(length); for (u32 i = 0; i < length; ++i) { JS::RootedValue el(cx); if (!JS_GetElement(cx, obj, i, &el)) FAIL("Failed to read array element"); T el2; if (!ScriptInterface::FromJSVal<T>(cx, el, el2)) return false; out.push_back(el2); } return true; }
template<> bool ScriptInterface::FromJSVal<Entity>(JSContext* cx, JS::HandleValue v, Entity& out) { JSAutoRequest rq(cx); if (!v.isObject()) FAIL("Argument must be an object"); JS::RootedObject obj(cx, &v.toObject()); JS::RootedValue templateName(cx); JS::RootedValue id(cx); JS::RootedValue player(cx); JS::RootedValue position(cx); JS::RootedValue rotation(cx); // TODO: Report type errors if (!JS_GetProperty(cx, obj, "player", &player) || !FromJSVal(cx, player, out.playerID)) FAIL("Failed to read Entity.player property"); if (!JS_GetProperty(cx, obj, "templateName", &templateName) || !FromJSVal(cx, templateName, out.templateName)) FAIL("Failed to read Entity.templateName property"); if (!JS_GetProperty(cx, obj, "id", &id) || !FromJSVal(cx, id, out.entityID)) FAIL("Failed to read Entity.id property"); if (!JS_GetProperty(cx, obj, "position", &position) || !FromJSVal(cx, position, out.position)) FAIL("Failed to read Entity.position property"); if (!JS_GetProperty(cx, obj, "rotation", &rotation) || !FromJSVal(cx, rotation, out.rotation)) FAIL("Failed to read Entity.rotation property"); return true; }
NS_IMETHODIMP nsAndroidBridge::HandleGeckoMessage(JS::HandleValue val, JSContext *cx) { if (val.isObject()) { JS::RootedObject object(cx, &val.toObject()); AndroidBridge::Bridge()->HandleGeckoMessage(cx, object); return NS_OK; } // Now handle legacy JSON messages. if (!val.isString()) { return NS_ERROR_INVALID_ARG; } JS::RootedString jsonStr(cx, val.toString()); JS::RootedValue jsonVal(cx); if (!JS_ParseJSON(cx, jsonStr, &jsonVal) || !jsonVal.isObject()) { return NS_ERROR_INVALID_ARG; } // Spit out a warning before sending the message. nsContentUtils::ReportToConsoleNonLocalized( NS_LITERAL_STRING("Use of JSON is deprecated. " "Please pass Javascript objects directly to handleGeckoMessage."), nsIScriptError::warningFlag, NS_LITERAL_CSTRING("nsIAndroidBridge"), nullptr); JS::RootedObject object(cx, &jsonVal.toObject()); AndroidBridge::Bridge()->HandleGeckoMessage(cx, object); return NS_OK; }
bool jsval_to_animationInfo(JSContext* cx, JS::HandleValue vp, cocostudio::timeline::AnimationInfo* ret) { JS::RootedObject tmp(cx); JS::RootedValue jsName(cx); JS::RootedValue jsStartId(cx); JS::RootedValue jsEndId(cx); std::string name; double startIndex, endIndex; bool ok = vp.isObject() && JS_ValueToObject(cx, vp, &tmp) && JS_GetProperty(cx, tmp, "name", &jsName) && JS_GetProperty(cx, tmp, "startIndex", &jsStartId) && JS_GetProperty(cx, tmp, "endIndex", &jsEndId) && JS::ToNumber(cx, jsStartId, &startIndex) && JS::ToNumber(cx, jsEndId, &endIndex) && jsval_to_std_string(cx, jsName, &name) && !std::isnan(startIndex) && !std::isnan(endIndex); JSB_PRECONDITION3(ok, cx, false, "Error processing arguments"); ret->name = name; ret->startIndex = (int)startIndex; ret->endIndex = (int)endIndex; return true; }
NS_IMETHODIMP calDateTime::SetJsDate(JSContext* aCx, JS::HandleValue aDate) { if (!aDate.isObject()) { mIsValid = false; return NS_OK; } JS::Rooted<JSObject*> dobj(aCx, &aDate.toObject()); dobj = js::CheckedUnwrap(dobj); if (!dobj) { mIsValid = false; return NS_OK; } JSAutoCompartment ac(aCx, dobj); if (!JS_ObjectIsDate(aCx, dobj) || !js_DateIsValid(dobj)) { mIsValid = false; return NS_OK; } PRTime utcTime = PRTime(js_DateGetMsecSinceEpoch(dobj)) * 1000; mIsValid = NS_SUCCEEDED(SetNativeTime(utcTime)); return NS_OK; }
bool ScriptInterface::GetProperty_(JS::HandleValue obj, const char* name, JS::MutableHandleValue out) { JSAutoRequest rq(m->m_cx); if (!obj.isObject()) return false; JS::RootedObject object(m->m_cx, &obj.toObject()); if (!JS_GetProperty(m->m_cx, object, name, out)) return false; return true; }
void CStdDeserializer::ScriptObjectAppend(const char* name, JS::HandleValue objVal) { JSContext* cx = m_ScriptInterface.GetContext(); JSAutoRequest rq(cx); if (!objVal.isObject()) throw PSERROR_Deserialize_ScriptError(); JS::RootedObject obj(cx, &objVal.toObject()); ReadScriptVal(name, obj); }
bool ScriptInterface::GetPropertyInt_(JS::HandleValue obj, int name, JS::MutableHandleValue out) { JSAutoRequest rq(m->m_cx); JS::RootedId nameId(m->m_cx, INT_TO_JSID(name)); if (!obj.isObject()) return false; JS::RootedObject object(m->m_cx, &obj.toObject()); if (!JS_GetPropertyById(m->m_cx, object, nameId, out)) return false; return true; }
bool ScriptInterface::HasProperty(JS::HandleValue obj, const char* name) { // TODO: proper errorhandling JSAutoRequest rq(m->m_cx); if (!obj.isObject()) return false; JS::RootedObject object(m->m_cx, &obj.toObject()); bool found; if (!JS_HasProperty(m->m_cx, object, name, &found)) return false; return found; }
bool ScriptInterface::FreezeObject(JS::HandleValue objVal, bool deep) { JSAutoRequest rq(m->m_cx); if (!objVal.isObject()) return false; JS::RootedObject obj(m->m_cx, &objVal.toObject()); if (deep) return JS_DeepFreezeObject(m->m_cx, obj); else return JS_FreezeObject(m->m_cx, obj); }
void ScriptInterface::CallConstructor(JS::HandleValue ctor, JS::HandleValueArray argv, JS::MutableHandleValue out) { JSAutoRequest rq(m->m_cx); if (!ctor.isObject()) { LOGERROR("CallConstructor: ctor is not an object"); out.setNull(); return; } JS::RootedObject ctorObj(m->m_cx, &ctor.toObject()); out.setObjectOrNull(JS_New(m->m_cx, ctorObj, argv)); }
nsresult TranslateChoices( JS::HandleValue aChoices, const nsTArray<PermissionRequest>& aPermissionRequests, nsTArray<PermissionChoice>& aTranslatedChoices) { if (aChoices.isNullOrUndefined()) { // No choice is specified. } else if (aChoices.isObject()) { // Iterate through all permission types. for (uint32_t i = 0; i < aPermissionRequests.Length(); ++i) { nsCString type = aPermissionRequests[i].type(); JS::Rooted<JSObject*> obj(RootingCx(), &aChoices.toObject()); // People really shouldn't be passing WindowProxy or Location // objects for the choices here. obj = js::CheckedUnwrapStatic(obj); if (!obj) { return NS_ERROR_FAILURE; } AutoJSAPI jsapi; jsapi.Init(); JSContext* cx = jsapi.cx(); JSAutoRealm ar(cx, obj); JS::Rooted<JS::Value> val(cx); if (!JS_GetProperty(cx, obj, type.BeginReading(), &val) || !val.isString()) { // no setting for the permission type, clear exception and skip it jsapi.ClearException(); } else { nsAutoJSString choice; if (!choice.init(cx, val)) { jsapi.ClearException(); return NS_ERROR_FAILURE; } aTranslatedChoices.AppendElement(PermissionChoice(type, choice)); } } } else { MOZ_ASSERT(false, "SelectedChoices should be undefined or an JS object"); return NS_ERROR_FAILURE; } return NS_OK; }
bool ScriptInterface::SetPropertyInt_(JS::HandleValue obj, int name, JS::HandleValue value, bool constant, bool enumerate) { JSAutoRequest rq(m->m_cx); uint attrs = 0; if (constant) attrs |= JSPROP_READONLY | JSPROP_PERMANENT; if (enumerate) attrs |= JSPROP_ENUMERATE; if (!obj.isObject()) return false; JS::RootedObject object(m->m_cx, &obj.toObject()); if (! JS_DefinePropertyById(m->m_cx, object, INT_TO_JSID(name), value, NULL, NULL, attrs)) return false; return true; }
template<> bool ScriptInterface::FromJSVal<CFixedVector2D>(JSContext* cx, JS::HandleValue v, CFixedVector2D& out) { JSAutoRequest rq(cx); if (!v.isObject()) return false; // TODO: report type error JS::RootedObject obj(cx, &v.toObject()); JS::RootedValue p(cx); if (!JS_GetProperty(cx, obj, "x", &p)) return false; // TODO: report type errors if (!FromJSVal(cx, p, out.X)) return false; if (!JS_GetProperty(cx, obj, "y", &p)) return false; if (!FromJSVal(cx, p, out.Y)) return false; return true; }
bool ScriptInterface::SetProperty_(JS::HandleValue obj, const wchar_t* name, JS::HandleValue value, bool constant, bool enumerate) { JSAutoRequest rq(m->m_cx); uint attrs = 0; if (constant) attrs |= JSPROP_READONLY | JSPROP_PERMANENT; if (enumerate) attrs |= JSPROP_ENUMERATE; if (!obj.isObject()) return false; JS::RootedObject object(m->m_cx, &obj.toObject()); utf16string name16(name, name + wcslen(name)); if (! JS_DefineUCProperty(m->m_cx, object, reinterpret_cast<const jschar*>(name16.c_str()), name16.length(), value, NULL, NULL, attrs)) return false; return true; }
NS_IMETHODIMP MediaPermissionRequest::Allow(JS::HandleValue aChoices) { // check if JS object if (!aChoices.isObject()) { MOZ_ASSERT(false, "Not a correct format of PermissionChoice"); return NS_ERROR_INVALID_ARG; } // iterate through audio-capture and video-capture AutoSafeJSContext cx; JS::Rooted<JSObject*> obj(cx, &aChoices.toObject()); JSAutoCompartment ac(cx, obj); JS::Rooted<JS::Value> v(cx); // get selected audio device name nsString audioDevice; if (mAudio) { if (!JS_GetProperty(cx, obj, AUDIO_PERMISSION_NAME, &v) || !v.isString()) { return NS_ERROR_FAILURE; } nsAutoJSString deviceName; if (!deviceName.init(cx, v)) { MOZ_ASSERT(false, "Couldn't initialize string from aChoices"); return NS_ERROR_FAILURE; } audioDevice = deviceName; } // get selected video device name nsString videoDevice; if (mVideo) { if (!JS_GetProperty(cx, obj, VIDEO_PERMISSION_NAME, &v) || !v.isString()) { return NS_ERROR_FAILURE; } nsAutoJSString deviceName; if (!deviceName.init(cx, v)) { MOZ_ASSERT(false, "Couldn't initialize string from aChoices"); return NS_ERROR_FAILURE; } videoDevice = deviceName; } return DoAllow(audioDevice, videoDevice); }
void JSAudioNodeThreaded::set(JS::HandleValue val) { if (!val.isObject()) return; JS::RootedObject global(m_Cx, JSAudioContext::GetContext()->m_JsGlobalObj); JS::RootedObject thisObj(m_Cx, this->getJSObject()); JS::RootedObject props(m_Cx, val.toObjectOrNull()); JS::Rooted<JS::IdVector> ida(m_Cx, JS::IdVector(m_Cx)); JS_Enumerate(m_Cx, props, &ida); for (size_t i = 0; i < ida.length(); i++) { // Retrieve the current key & value JS::RootedId id(m_Cx, ida[i]); JSAutoByteString key(m_Cx, JSID_TO_STRING(id)); JS::RootedValue val(m_Cx); if (!JS_GetPropertyById(m_Cx, props, id, &val)) { break; } // Set the property JS::RootedObject hashObj(m_Cx, m_HashObj); JS_SetProperty(m_Cx, hashObj, key.ptr(), val); // Call the setter callback JSTransferableFunction *fun = m_Node->getFunction(JSAudioNodeCustomBase::SETTER_FN); if (fun->isSet()) { JS::RootedValue rval(m_Cx); JS::RootedString jskey(m_Cx, JS_NewStringCopyZ(m_Cx, key.ptr())); JS::AutoValueArray<3> params(m_Cx); params[0].setString(jskey); params[1].set(val); params[2].setObjectOrNull(global); fun->call(thisObj, params, &rval); } } }
template<> bool ScriptInterface::FromJSVal<CColor>(JSContext* cx, JS::HandleValue v, CColor& out) { if (!v.isObject()) FAIL("JS::HandleValue not an object"); JSAutoRequest rq(cx); JS::RootedObject obj(cx, &v.toObject()); JS::RootedValue r(cx); JS::RootedValue g(cx); JS::RootedValue b(cx); JS::RootedValue a(cx); if (!JS_GetProperty(cx, obj, "r", &r) || !FromJSVal(cx, r, out.r)) FAIL("Failed to get property CColor.r"); if (!JS_GetProperty(cx, obj, "g", &g) || !FromJSVal(cx, g, out.g)) FAIL("Failed to get property CColor.g"); if (!JS_GetProperty(cx, obj, "b", &b) || !FromJSVal(cx, b, out.b)) FAIL("Failed to get property CColor.b"); if (!JS_GetProperty(cx, obj, "a", &a) || !FromJSVal(cx, a, out.a)) FAIL("Failed to get property CColor.a"); return true; }
bool jsval_to_Physics3DWorld_HitResult(JSContext *cx, JS::HandleValue v, cocos2d::Physics3DWorld::HitResult* ret) { JS::RootedObject tmp(cx); JS::RootedValue jshitPosition(cx); JS::RootedValue jshitNormal(cx); JS::RootedValue jshitObject(cx); bool ok = v.isObject() && JS_ValueToObject(cx, v, &tmp) && JS_GetProperty(cx, tmp, "hitPosition", &jshitPosition) && JS_GetProperty(cx, tmp, "hitNormal", &jshitNormal) && JS_GetProperty(cx, tmp, "hitObj", &jshitObject) && jsval_to_vector3(cx, jshitPosition, &(ret->hitPosition)) && jsval_to_vector3(cx, jshitNormal, &(ret->hitNormal)); JSB_PRECONDITION2(ok, cx, false, "jsval_to_Physics3DWorld_HitResult : Error processing arguments"); tmp.set(jshitObject.toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(tmp); ret->hitObj = (cocos2d::Physics3DObject *)(proxy ? proxy->ptr : nullptr); return true; }