nsresult DOMFileImplFile::GetLastModifiedDate(JSContext* aCx, JS::MutableHandle<JS::Value> aLastModifiedDate) { NS_ASSERTION(mIsFile, "Should only be called on files"); PRTime msecs; if (IsDateUnknown()) { nsresult rv = mFile->GetLastModifiedTime(&msecs); NS_ENSURE_SUCCESS(rv, rv); mLastModificationDate = msecs; } else { msecs = mLastModificationDate; } JSObject* date = JS_NewDateObjectMsec(aCx, msecs); if (date) { aLastModifiedDate.setObject(*date); } else { date = JS_NewDateObjectMsec(aCx, JS_Now() / PR_USEC_PER_MSEC); aLastModifiedDate.setObject(*date); } return NS_OK; }
nsresult MetadataHelper::GetSuccessResult(JSContext* aCx, JS::Value* aVal) { JS::Rooted<JSObject*> obj(aCx, JS_NewObject(aCx, nullptr, nullptr, nullptr)); NS_ENSURE_TRUE(obj, NS_ERROR_OUT_OF_MEMORY); if (mParams->SizeRequested()) { JS::Value val = JS_NumberValue(mParams->Size()); if (!JS_DefineProperty(aCx, obj, "size", val, nullptr, nullptr, JSPROP_ENUMERATE)) { return NS_ERROR_FAILURE; } } if (mParams->LastModifiedRequested()) { double msec = mParams->LastModified(); JSObject *date = JS_NewDateObjectMsec(aCx, msec); NS_ENSURE_TRUE(date, NS_ERROR_OUT_OF_MEMORY); if (!JS_DefineProperty(aCx, obj, "lastModified", OBJECT_TO_JSVAL(date), nullptr, nullptr, JSPROP_ENUMERATE)) { return NS_ERROR_FAILURE; } } *aVal = OBJECT_TO_JSVAL(obj); return NS_OK; }
nsresult DOMFileImplBase::GetLastModifiedDate(JSContext* aCx, JS::MutableHandle<JS::Value> aDate) { JS::Rooted<JSObject*> date(aCx, JS_NewDateObjectMsec(aCx, JS_Now() / PR_USEC_PER_MSEC)); if (!date) { return NS_ERROR_OUT_OF_MEMORY; } aDate.setObject(*date); return NS_OK; }
NS_IMETHODIMP calDateTime::GetJsDate(JSContext* aCx, JS::Value* aResult) { double msec = double(mNativeTime / 1000); ensureTimezone(); JSObject* obj; bool b; if (NS_SUCCEEDED(mTimezone->GetIsFloating(&b)) && b) { obj = JS_NewDateObject(aCx, mYear, mMonth, mDay, mHour, mMinute, mSecond); } else { obj = JS_NewDateObjectMsec(aCx, msec); } *aResult = JS::ObjectOrNullValue(obj); return NS_OK; }
// static nsresult Key::DecodeJSVal(const unsigned char*& aPos, const unsigned char* aEnd, JSContext* aCx, PRUint8 aTypeOffset, jsval* aVal) { if (*aPos - aTypeOffset >= eArray) { JSObject* array = JS_NewArrayObject(aCx, 0, nsnull); if (!array) { NS_WARNING("Failed to make array!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } aTypeOffset += eMaxType; if (aTypeOffset == eMaxType * MaxArrayCollapse) { ++aPos; aTypeOffset = 0; } jsuint index = 0; while (aPos < aEnd && *aPos - aTypeOffset != eTerminator) { jsval val; nsresult rv = DecodeJSVal(aPos, aEnd, aCx, aTypeOffset, &val); NS_ENSURE_SUCCESS(rv, rv); aTypeOffset = 0; if (!JS_SetElement(aCx, array, index++, &val)) { NS_WARNING("Failed to set array element!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } } NS_ASSERTION(aPos >= aEnd || (*aPos % eMaxType) == eTerminator, "Should have found end-of-array marker"); ++aPos; *aVal = OBJECT_TO_JSVAL(array); } else if (*aPos - aTypeOffset == eString) { nsString key; DecodeString(aPos, aEnd, key); if (!xpc_qsStringToJsval(aCx, key, aVal)) { return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } } else if (*aPos - aTypeOffset == eDate) { jsdouble msec = static_cast<jsdouble>(DecodeNumber(aPos, aEnd)); JSObject* date = JS_NewDateObjectMsec(aCx, msec); if (!date) { NS_WARNING("Failed to make date!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } *aVal = OBJECT_TO_JSVAL(date); } else if (*aPos - aTypeOffset == eFloat) { *aVal = DOUBLE_TO_JSVAL(DecodeNumber(aPos, aEnd)); } else { NS_NOTREACHED("Unknown key type!"); } return NS_OK; }
NS_IMETHODIMP SmsMessage::GetTimestamp(JSContext* cx, jsval* aDate) { *aDate = OBJECT_TO_JSVAL(JS_NewDateObjectMsec(cx, mData.timestamp())); return NS_OK; }
// static nsresult Key::DecodeJSValInternal(const unsigned char*& aPos, const unsigned char* aEnd, JSContext* aCx, uint8_t aTypeOffset, JS::MutableHandle<JS::Value> aVal, uint16_t aRecursionDepth) { NS_ENSURE_TRUE(aRecursionDepth < MaxRecursionDepth, NS_ERROR_DOM_INDEXEDDB_DATA_ERR); if (*aPos - aTypeOffset >= eArray) { JS::Rooted<JSObject*> array(aCx, JS_NewArrayObject(aCx, 0, nullptr)); if (!array) { NS_WARNING("Failed to make array!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } aTypeOffset += eMaxType; if (aTypeOffset == eMaxType * MaxArrayCollapse) { ++aPos; aTypeOffset = 0; } uint32_t index = 0; JS::Rooted<JS::Value> val(aCx); while (aPos < aEnd && *aPos - aTypeOffset != eTerminator) { nsresult rv = DecodeJSValInternal(aPos, aEnd, aCx, aTypeOffset, &val, aRecursionDepth + 1); NS_ENSURE_SUCCESS(rv, rv); aTypeOffset = 0; if (!JS_SetElement(aCx, array, index++, &val)) { NS_WARNING("Failed to set array element!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } } NS_ASSERTION(aPos >= aEnd || (*aPos % eMaxType) == eTerminator, "Should have found end-of-array marker"); ++aPos; aVal.setObject(*array); } else if (*aPos - aTypeOffset == eString) { nsString key; DecodeString(aPos, aEnd, key); if (!xpc::StringToJsval(aCx, key, aVal)) { return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } } else if (*aPos - aTypeOffset == eDate) { double msec = static_cast<double>(DecodeNumber(aPos, aEnd)); JSObject* date = JS_NewDateObjectMsec(aCx, msec); if (!date) { NS_WARNING("Failed to make date!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } aVal.setObject(*date); } else if (*aPos - aTypeOffset == eFloat) { aVal.setDouble(DecodeNumber(aPos, aEnd)); } else { NS_NOTREACHED("Unknown key type!"); } return NS_OK; }
void SmsRequest::NotifyThreadList(const InfallibleTArray<ThreadListItem>& aItems) { MOZ_ASSERT(!mParent); MOZ_ASSERT(GetOwner()); nsresult rv; nsIScriptContext* sc = GetContextForEventHandlers(&rv); NS_ENSURE_SUCCESS_VOID(rv); NS_ENSURE_TRUE_VOID(sc); JSContext* cx = sc->GetNativeContext(); MOZ_ASSERT(cx); nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(GetOwner()); JSObject* ownerObj = sgo->GetGlobalJSObject(); NS_ENSURE_TRUE_VOID(ownerObj); nsCxPusher pusher; NS_ENSURE_TRUE_VOID(pusher.Push(cx, false)); JSAutoRequest ar(cx); JSAutoCompartment ac(cx, ownerObj); JSObject* array = JS_NewArrayObject(cx, aItems.Length(), nullptr); NS_ENSURE_TRUE_VOID(array); bool ok; for (uint32_t i = 0; i < aItems.Length(); i++) { const ThreadListItem& source = aItems[i]; nsString temp = source.senderOrReceiver(); jsval senderOrReceiver; ok = xpc::StringToJsval(cx, temp, &senderOrReceiver); NS_ENSURE_TRUE_VOID(ok); JSObject* timestampObj = JS_NewDateObjectMsec(cx, source.timestamp()); NS_ENSURE_TRUE_VOID(timestampObj); jsval timestamp = OBJECT_TO_JSVAL(timestampObj); temp = source.body(); jsval body; ok = xpc::StringToJsval(cx, temp, &body); NS_ENSURE_TRUE_VOID(ok); jsval unreadCount = JS_NumberValue(double(source.unreadCount())); JSObject* elementObj = JS_NewObject(cx, nullptr, nullptr, nullptr); NS_ENSURE_TRUE_VOID(elementObj); ok = JS_SetProperty(cx, elementObj, "senderOrReceiver", &senderOrReceiver); NS_ENSURE_TRUE_VOID(ok); ok = JS_SetProperty(cx, elementObj, "timestamp", ×tamp); NS_ENSURE_TRUE_VOID(ok); ok = JS_SetProperty(cx, elementObj, "body", &body); NS_ENSURE_TRUE_VOID(ok); ok = JS_SetProperty(cx, elementObj, "unreadCount", &unreadCount); NS_ENSURE_TRUE_VOID(ok); jsval element = OBJECT_TO_JSVAL(elementObj); ok = JS_SetElement(cx, array, i, &element); NS_ENSURE_TRUE_VOID(ok); } NotifyThreadList(OBJECT_TO_JSVAL(array), cx); }