static JSValue idbKeyToJSValue(ExecState* exec, JSDOMGlobalObject* globalObject, IDBKey* key) { if (!key) { // This should be undefined, not null. // Spec: http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#idl-def-IDBKeyRange return jsUndefined(); } switch (key->type()) { case IDBKey::ArrayType: { const IDBKey::KeyArray& inArray = key->array(); size_t size = inArray.size(); JSArray* outArray = constructEmptyArray(exec, 0, globalObject, size); for (size_t i = 0; i < size; ++i) { IDBKey* arrayKey = inArray.at(i).get(); outArray->putDirectIndex(exec, i, idbKeyToJSValue(exec, globalObject, arrayKey)); } return JSValue(outArray); } case IDBKey::StringType: return jsStringWithCache(exec, key->string()); case IDBKey::DateType: return jsDateOrNull(exec, key->date()); case IDBKey::NumberType: return jsNumber(key->number()); case IDBKey::MinType: case IDBKey::InvalidType: ASSERT_NOT_REACHED(); return jsUndefined(); } ASSERT_NOT_REACHED(); return jsUndefined(); }
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, IDBKey* key) { if (!key) return jsNull(); switch (key->type()) { case IDBKey::ArrayType: { const IDBKey::KeyArray& inArray = key->array(); size_t size = inArray.size(); JSArray* outArray = constructEmptyArray(exec, globalObject, size); JSGlobalData& globalData = exec->globalData(); for (size_t i = 0; i < size; ++i) { IDBKey* arrayKey = inArray.at(i).get(); outArray->initializeIndex(globalData, i, toJS(exec, globalObject, arrayKey)); } return JSValue(outArray); } case IDBKey::StringType: return jsStringWithCache(exec, key->string()); case IDBKey::DateType: return jsDateOrNull(exec, key->date()); case IDBKey::NumberType: return jsNumber(key->number()); case IDBKey::MinType: case IDBKey::InvalidType: ASSERT_NOT_REACHED(); return jsUndefined(); } ASSERT_NOT_REACHED(); return jsUndefined(); }
JSValue jsFileLastModifiedDate(ExecState* exec, JSValue slotBase, const Identifier&) { JSFile* castedThis = static_cast<JSFile*>(asObject(slotBase)); UNUSED_PARAM(exec); File* imp = static_cast<File*>(castedThis->impl()); JSValue result = jsDateOrNull(exec, imp->lastModifiedDate()); return result; }
JSValue jsMetadataModificationTime(ExecState* exec, JSValue slotBase, const Identifier&) { JSMetadata* castedThis = static_cast<JSMetadata*>(asObject(slotBase)); UNUSED_PARAM(exec); Metadata* imp = static_cast<Metadata*>(castedThis->impl()); JSValue result = jsDateOrNull(exec, imp->modificationTime()); return result; }
JSValue idbKeyDataToJSValue(JSC::ExecState& exec, const IDBKeyData& keyData) { if (keyData.isNull()) return jsUndefined(); Locker<JSLock> locker(exec.vm().apiLock()); switch (keyData.type()) { case KeyType::Array: { const Vector<IDBKeyData>& inArray = keyData.array(); size_t size = inArray.size(); JSArray* outArray = constructEmptyArray(&exec, 0, exec.lexicalGlobalObject(), size); for (size_t i = 0; i < size; ++i) { auto& arrayKey = inArray.at(i); outArray->putDirectIndex(&exec, i, idbKeyDataToJSValue(exec, arrayKey)); } return JSValue(outArray); } case KeyType::String: return jsStringWithCache(&exec, keyData.string()); case KeyType::Date: return jsDateOrNull(&exec, keyData.date()); case KeyType::Number: return jsNumber(keyData.number()); case KeyType::Min: case KeyType::Max: case KeyType::Invalid: ASSERT_NOT_REACHED(); return jsUndefined(); } ASSERT_NOT_REACHED(); return jsUndefined(); }