void V8ArrayBufferOrArrayBufferViewOrDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, ArrayBufferOrArrayBufferViewOrDictionary& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState) { if (v8Value.IsEmpty()) return; if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value)) return; if (v8Value->IsArrayBuffer()) { TestArrayBuffer* cppValue = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value)); impl.setArrayBuffer(cppValue); return; } if (v8Value->IsArrayBufferView()) { TestArrayBufferView* cppValue = V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value)); impl.setArrayBufferView(cppValue); return; } if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) { Dictionary cppValue = Dictionary(v8Value, isolate, exceptionState); if (exceptionState.hadException()) return; impl.setDictionary(cppValue); return; } exceptionState.throwTypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView or Dictionary)'"); }
void V8Document::createTouchMethodPrologueCustom( const v8::FunctionCallbackInfo<v8::Value>& info, Document*) { v8::Local<v8::Value> v8Window = info[0]; if (isUndefinedOrNull(v8Window)) { UseCounter::countIfNotPrivateScript( info.GetIsolate(), currentExecutionContext(info.GetIsolate()), UseCounter::DocumentCreateTouchWindowNull); } else if (!toDOMWindow(info.GetIsolate(), v8Window)) { UseCounter::countIfNotPrivateScript( info.GetIsolate(), currentExecutionContext(info.GetIsolate()), UseCounter::DocumentCreateTouchWindowWrongType); } v8::Local<v8::Value> v8Target = info[1]; if (isUndefinedOrNull(v8Target)) { UseCounter::countIfNotPrivateScript( info.GetIsolate(), currentExecutionContext(info.GetIsolate()), UseCounter::DocumentCreateTouchTargetNull); } else if (!toEventTarget(info.GetIsolate(), v8Target)) { UseCounter::countIfNotPrivateScript( info.GetIsolate(), currentExecutionContext(info.GetIsolate()), UseCounter::DocumentCreateTouchTargetWrongType); } if (info.Length() < 7) { UseCounter::countIfNotPrivateScript( info.GetIsolate(), currentExecutionContext(info.GetIsolate()), UseCounter::DocumentCreateTouchLessThanSevenArguments); } }
v8::Handle<v8::Value> V8WebGLRenderingContext::getUniformCallback(const v8::Arguments& args) { INC_STATS("DOM.WebGLRenderingContext.getUniform()"); if (args.Length() != 2) { V8Proxy::setDOMException(SYNTAX_ERR); return notHandledByInterceptor(); } ExceptionCode ec = 0; WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(args.Holder()); if (args.Length() > 0 && !isUndefinedOrNull(args[0]) && !V8WebGLProgram::HasInstance(args[0])) { V8Proxy::throwTypeError(); return notHandledByInterceptor(); } WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? V8WebGLProgram::toNative(v8::Handle<v8::Object>::Cast(args[0])) : 0; if (args.Length() > 1 && !isUndefinedOrNull(args[1]) && !V8WebGLUniformLocation::HasInstance(args[1])) { V8Proxy::throwTypeError(); return notHandledByInterceptor(); } bool ok = false; WebGLUniformLocation* location = toWebGLUniformLocation(args[1], ok); WebGLGetInfo info = context->getUniform(program, location, ec); if (ec) { V8Proxy::setDOMException(ec); return v8::Undefined(); } return toV8Object(info); }
void V8XSLTProcessor::setParameterMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) { if (isUndefinedOrNull(info[1]) || isUndefinedOrNull(info[2])) return; TOSTRING_VOID(V8StringResource<>, namespaceURI, info[0]); TOSTRING_VOID(V8StringResource<>, localName, info[1]); TOSTRING_VOID(V8StringResource<>, value, info[2]); XSLTProcessor* impl = V8XSLTProcessor::toNative(info.Holder()); impl->setParameter(namespaceURI, localName, value); }
void V8XSLTProcessor::setParameterMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args) { if (isUndefinedOrNull(args[1]) || isUndefinedOrNull(args[2])) return; XSLTProcessor* imp = V8XSLTProcessor::toNative(args.Holder()); String namespaceURI = toWebCoreString(args[0]); String localName = toWebCoreString(args[1]); String value = toWebCoreString(args[2]); imp->setParameter(namespaceURI, localName, value); }
bool extractTransferables(v8::Local<v8::Value> value, int argumentIndex, MessagePortArray& ports, ArrayBufferArray& arrayBuffers, ExceptionState& exceptionState, v8::Isolate* isolate) { if (isUndefinedOrNull(value)) { ports.resize(0); arrayBuffers.resize(0); return true; } uint32_t length = 0; if (value->IsArray()) { v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(value); length = array->Length(); } else if (toV8Sequence(value, length, isolate).IsEmpty()) { exceptionState.throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex + 1)); return false; } v8::Local<v8::Object> transferrables = v8::Local<v8::Object>::Cast(value); // Validate the passed array of transferrables. for (unsigned int i = 0; i < length; ++i) { v8::Local<v8::Value> transferrable = transferrables->Get(i); // Validation of non-null objects, per HTML5 spec 10.3.3. if (isUndefinedOrNull(transferrable)) { exceptionState.throwDOMException(DataCloneError, "Value at index " + String::number(i) + " is an untransferable " + (transferrable->IsUndefined() ? "'undefined'" : "'null'") + " value."); return false; } // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. if (V8MessagePort::hasInstance(transferrable, isolate)) { RefPtr<MessagePort> port = V8MessagePort::toNative(v8::Handle<v8::Object>::Cast(transferrable)); // Check for duplicate MessagePorts. if (ports.contains(port)) { exceptionState.throwDOMException(DataCloneError, "Message port at index " + String::number(i) + " is a duplicate of an earlier port."); return false; } ports.append(port.release()); } else if (V8ArrayBuffer::hasInstance(transferrable, isolate)) { RefPtr<ArrayBuffer> arrayBuffer = V8ArrayBuffer::toNative(v8::Handle<v8::Object>::Cast(transferrable)); if (arrayBuffers.contains(arrayBuffer)) { exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at index " + String::number(i) + " is a duplicate of an earlier ArrayBuffer."); return false; } arrayBuffers.append(arrayBuffer.release()); } else { exceptionState.throwDOMException(DataCloneError, "Value at index " + String::number(i) + " does not have a transferable type."); return false; } } return true; }
v8::Handle<v8::Value> V8XSLTProcessor::setParameterMethodCustom(const v8::Arguments& args) { if (isUndefinedOrNull(args[1]) || isUndefinedOrNull(args[2])) return v8::Undefined(); XSLTProcessor* imp = V8XSLTProcessor::toNative(args.Holder()); String namespaceURI = toWebCoreString(args[0]); String localName = toWebCoreString(args[1]); String value = toWebCoreString(args[2]); imp->setParameter(namespaceURI, localName, value); return v8::Undefined(); }
bool extractTransferables(v8::Local<v8::Value> value, MessagePortArray& ports, ArrayBufferArray& arrayBuffers) { if (isUndefinedOrNull(value)) { ports.resize(0); arrayBuffers.resize(0); return true; } if (!value->IsObject()) { throwError("TransferArray argument must be an object"); return false; } uint32_t length = 0; v8::Local<v8::Object> transferrables = v8::Local<v8::Object>::Cast(value); if (value->IsArray()) { v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(value); length = array->Length(); } else { // Sequence-type object - get the length attribute v8::Local<v8::Value> sequenceLength = transferrables->Get(v8::String::New("length")); if (!sequenceLength->IsNumber()) { throwError("TransferArray argument has no length attribute"); return false; } length = sequenceLength->Uint32Value(); } // Validate the passed array of transferrables. for (unsigned int i = 0; i < length; ++i) { v8::Local<v8::Value> transferrable = transferrables->Get(i); // Validation of non-null objects, per HTML5 spec 10.3.3. if (isUndefinedOrNull(transferrable)) { throwError(DATA_CLONE_ERR); return false; } // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. if (V8MessagePort::HasInstance(transferrable)) ports.append(V8MessagePort::toNative(v8::Handle<v8::Object>::Cast(transferrable))); else if (V8ArrayBuffer::HasInstance(transferrable)) arrayBuffers.append(V8ArrayBuffer::toNative(v8::Handle<v8::Object>::Cast(transferrable))); else { throwError("TransferArray argument must contain only Transferables"); return false; } } return true; }
static PassRefPtr<WebKitFlags> getFlags(const v8::Local<v8::Value>& arg, ExceptionCode& ec) { ec = 0; if (isUndefinedOrNull(arg) || !arg->IsObject()) return 0; v8::Handle<v8::Object> object; { v8::TryCatch block; object = v8::Handle<v8::Object>::Cast(arg); if (block.HasCaught()) { ec = TYPE_MISMATCH_ERR; return 0; } } bool isCreate = extractBooleanValue(object, "create", ec); if (ec) return 0; bool isExclusive = extractBooleanValue(object, "exclusive", ec); if (ec) return 0; RefPtr<WebKitFlags> flags = WebKitFlags::create(); flags->setCreate(isCreate); flags->setExclusive(isExclusive); return flags; }
v8::Handle<v8::Value> V8MessageEvent::initMessageEventCallback(const v8::Arguments& args) { MessageEvent* event = V8MessageEvent::toNative(args.Holder()); String typeArg = toWebCoreString(args[0]); bool canBubbleArg = args[1]->BooleanValue(); bool cancelableArg = args[2]->BooleanValue(); ScriptValue dataArg = ScriptValue(args[3]); String originArg = toWebCoreString(args[4]); String lastEventIdArg = toWebCoreString(args[5]); DOMWindow* sourceArg = 0; if (args[6]->IsObject()) { v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(args[6]); v8::Handle<v8::Object> window = wrapper->FindInstanceInPrototypeChain(V8DOMWindow::GetTemplate(args.GetIsolate())); if (!window.IsEmpty()) sourceArg = V8DOMWindow::toNative(window); } OwnPtr<MessagePortArray> portArray; if (!isUndefinedOrNull(args[7])) { portArray = adoptPtr(new MessagePortArray); if (!getMessagePortArray(args[7], *portArray, args.GetIsolate())) return v8::Undefined(); } event->initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, portArray.release()); return v8::Undefined(); }
static void setNamedItemMethod(const v8::FunctionCallbackInfo<v8::Value>& info) { ExceptionState exceptionState(ExceptionState::ExecutionContext, "setNamedItem", "TestInterface2", info.Holder(), info.GetIsolate()); if (UNLIKELY(info.Length() < 2)) { setMinimumArityTypeError(exceptionState, 2, info.Length()); exceptionState.throwIfNeeded(); return; } TestInterface2* impl = V8TestInterface2::toImpl(info.Holder()); V8StringResource<> name; TestInterfaceEmpty* value; { name = info[0]; if (!name.prepare()) return; value = V8TestInterfaceEmpty::toImplWithTypeCheck(info.GetIsolate(), info[1]); if (!value && !isUndefinedOrNull(info[1])) { exceptionState.throwTypeError("parameter 2 is not of type 'TestInterfaceEmpty'."); exceptionState.throwIfNeeded(); return; } } TestInterfaceEmpty* result = impl->setNamedItem(name, value, exceptionState); if (exceptionState.hadException()) { exceptionState.throwIfNeeded(); return; } v8SetReturnValue(info, result); }
void V8StringOrArrayBufferOrArrayBufferView::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, StringOrArrayBufferOrArrayBufferView& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState) { if (v8Value.IsEmpty()) return; if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value)) return; if (V8ArrayBuffer::hasInstance(v8Value, isolate)) { TestArrayBuffer* cppValue = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value)); impl.setArrayBuffer(cppValue); return; } if (V8ArrayBufferView::hasInstance(v8Value, isolate)) { TestArrayBufferView* cppValue = V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value)); impl.setArrayBufferView(cppValue); return; } { V8StringResource<> cppValue = v8Value; if (!cppValue.prepare(exceptionState)) return; impl.setString(cppValue); return; } }
void V8TestPermissiveDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestPermissiveDictionary& impl, ExceptionState& exceptionState) { if (isUndefinedOrNull(v8Value)) return; if (!v8Value->IsObject()) { // Do nothing. return; } v8::TryCatch block; v8::Local<v8::Object> v8Object; if (!v8Call(v8Value->ToObject(isolate->GetCurrentContext()), v8Object, block)) { exceptionState.rethrowV8Exception(block.Exception()); return; } { v8::Local<v8::Value> booleanMemberValue; if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "booleanMember")).ToLocal(&booleanMemberValue)) { exceptionState.rethrowV8Exception(block.Exception()); return; } if (booleanMemberValue.IsEmpty() || booleanMemberValue->IsUndefined()) { // Do nothing. } else { bool booleanMember = toBoolean(isolate, booleanMemberValue, exceptionState); if (exceptionState.hadException()) return; impl.setBooleanMember(booleanMember); } } }
void V8BooleanOrStringOrUnrestrictedDouble::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, BooleanOrStringOrUnrestrictedDouble& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState) { if (v8Value.IsEmpty()) return; if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value)) return; if (v8Value->IsBoolean()) { impl.setBoolean(v8Value.As<v8::Boolean>()->Value()); return; } if (v8Value->IsNumber()) { double cppValue = toDouble(isolate, v8Value, exceptionState); if (exceptionState.hadException()) return; impl.setUnrestrictedDouble(cppValue); return; } { V8StringResource<> cppValue = v8Value; if (!cppValue.prepare(exceptionState)) return; impl.setString(cppValue); return; } }
void V8MessageEvent::initMessageEventMethodCustom( const v8::FunctionCallbackInfo<v8::Value>& info) { ExceptionState exceptionState(ExceptionState::ExecutionContext, "initMessageEvent", "MessageEvent", info.Holder(), info.GetIsolate()); MessageEvent* event = V8MessageEvent::toImpl(info.Holder()); TOSTRING_VOID(V8StringResource<>, typeArg, info[0]); bool canBubbleArg = false; bool cancelableArg = false; if (!v8Call(info[1]->BooleanValue(info.GetIsolate()->GetCurrentContext()), canBubbleArg) || !v8Call(info[2]->BooleanValue(info.GetIsolate()->GetCurrentContext()), cancelableArg)) return; v8::Local<v8::Value> dataArg = info[3]; TOSTRING_VOID(V8StringResource<>, originArg, info[4]); TOSTRING_VOID(V8StringResource<>, lastEventIdArg, info[5]); DOMWindow* sourceArg = toDOMWindow(info.GetIsolate(), info[6]); MessagePortArray* portArray = nullptr; const int portArrayIndex = 7; if (!isUndefinedOrNull(info[portArrayIndex])) { portArray = new MessagePortArray; *portArray = toMemberNativeArray<MessagePort>( info[portArrayIndex], portArrayIndex + 1, info.GetIsolate(), exceptionState); if (exceptionState.hadException()) return; } event->initMessageEvent( typeArg, canBubbleArg, cancelableArg, ScriptValue(ScriptState::current(info.GetIsolate()), dataArg), originArg, lastEventIdArg, sourceArg, portArray); }
IDBError MemoryObjectStore::populateIndexWithExistingRecords(MemoryIndex& index) { if (!m_keyValueStore) return { }; JSLockHolder locker(UniqueIDBDatabase::databaseThreadVM()); for (auto iterator : *m_keyValueStore) { auto jsValue = idbValueDataToJSValue(UniqueIDBDatabase::databaseThreadExecState(), iterator.value); if (jsValue.isUndefinedOrNull()) return { }; IndexKey indexKey; generateIndexKeyForValue(UniqueIDBDatabase::databaseThreadExecState(), index.info(), jsValue, indexKey); if (indexKey.isNull()) continue; IDBError error = index.putIndexKey(iterator.key, indexKey); if (!error.isNull()) return error; } return { }; }
v8::Handle<v8::Value> V8WebGLRenderingContext::getAttachedShadersCallback(const v8::Arguments& args) { INC_STATS("DOM.WebGLRenderingContext.getAttachedShaders()"); if (args.Length() < 1) { V8Proxy::setDOMException(SYNTAX_ERR); return notHandledByInterceptor(); } ExceptionCode ec = 0; WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(args.Holder()); if (args.Length() > 0 && !isUndefinedOrNull(args[0]) && !V8WebGLProgram::HasInstance(args[0])) { V8Proxy::throwTypeError(); return notHandledByInterceptor(); } WebGLProgram* program = V8WebGLProgram::HasInstance(args[0]) ? V8WebGLProgram::toNative(v8::Handle<v8::Object>::Cast(args[0])) : 0; Vector<WebGLShader*> shaders; bool succeed = context->getAttachedShaders(program, shaders, ec); if (ec) { V8Proxy::setDOMException(ec); return v8::Null(); } if (!succeed) return v8::Null(); v8::Local<v8::Array> array = v8::Array::New(shaders.size()); for (size_t ii = 0; ii < shaders.size(); ++ii) array->Set(v8::Integer::New(ii), toV8(shaders[ii])); return array; }
static void constructor(const v8::FunctionCallbackInfo<v8::Value>& info) { ExceptionState exceptionState(ExceptionState::ConstructionContext, "TestInterfaceEventInitConstructor", info.Holder(), info.GetIsolate()); if (UNLIKELY(info.Length() < 2)) { setMinimumArityTypeError(exceptionState, 2, info.Length()); exceptionState.throwIfNeeded(); return; } V8StringResource<> type; TestInterfaceEventInit testInterfaceEventInit; { type = info[0]; if (!type.prepare()) return; if (!isUndefinedOrNull(info[1]) && !info[1]->IsObject()) { exceptionState.throwTypeError("parameter 2 ('testInterfaceEventInit') is not an object."); exceptionState.throwIfNeeded(); return; } V8TestInterfaceEventInit::toImpl(info.GetIsolate(), info[1], testInterfaceEventInit, exceptionState); if (exceptionState.throwIfNeeded()) return; } RefPtrWillBeRawPtr<TestInterfaceEventInitConstructor> impl = TestInterfaceEventInitConstructor::create(type, testInterfaceEventInit); v8::Local<v8::Object> wrapper = info.Holder(); wrapper = impl->associateWithWrapper(info.GetIsolate(), &V8TestInterfaceEventInitConstructor::wrapperTypeInfo, wrapper); v8SetReturnValue(info, wrapper); }
IDBError MemoryObjectStore::updateIndexesForPutRecord(const IDBKeyData& key, const ThreadSafeDataBuffer& value) { JSLockHolder locker(UniqueIDBDatabase::databaseThreadVM()); auto jsValue = idbValueDataToJSValue(UniqueIDBDatabase::databaseThreadExecState(), value); if (jsValue.isUndefinedOrNull()) return { }; IDBError error; Vector<std::pair<MemoryIndex*, IndexKey>> changedIndexRecords; for (auto* index : m_indexesByName.values()) { IndexKey indexKey; generateIndexKeyForValue(UniqueIDBDatabase::databaseThreadExecState(), index->info(), jsValue, indexKey); if (indexKey.isNull()) continue; error = index->putIndexKey(key, indexKey); if (!error.isNull()) break; changedIndexRecords.append(std::make_pair(index, indexKey)); } // If any of the index puts failed, revert all of the ones that went through. if (!error.isNull()) { for (auto& record : changedIndexRecords) record.first->removeRecord(key, record.second); } return error; }
v8::Handle<v8::Value> V8MessageEvent::initMessageEventCallback(const v8::Arguments& args) { INC_STATS("DOM.MessageEvent.initMessageEvent"); MessageEvent* event = V8MessageEvent::toNative(args.Holder()); String typeArg = v8ValueToWebCoreString(args[0]); bool canBubbleArg = args[1]->BooleanValue(); bool cancelableArg = args[2]->BooleanValue(); RefPtr<SerializedScriptValue> dataArg = SerializedScriptValue::create(args[3]); String originArg = v8ValueToWebCoreString(args[4]); String lastEventIdArg = v8ValueToWebCoreString(args[5]); DOMWindow* sourceArg = 0; if (args[6]->IsObject()) { v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(args[6]); v8::Handle<v8::Object> window = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), wrapper); if (!window.IsEmpty()) sourceArg = V8DOMWindow::toNative(window); } OwnPtr<MessagePortArray> portArray; if (!isUndefinedOrNull(args[7])) { portArray = new MessagePortArray(); if (!getMessagePortArray(args[7], *portArray)) return v8::Undefined(); } event->initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg.release(), originArg, lastEventIdArg, sourceArg, portArray.release()); return v8::Undefined(); }
void V8DeviceMotionEvent::initDeviceMotionEventMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) { ExceptionState exceptionState(ExceptionState::ExecutionContext, "initDeviceMotionEvent", "DeviceMotionEvent", info.Holder(), info.GetIsolate()); DeviceMotionEvent* impl = V8DeviceMotionEvent::toImpl(info.Holder()); v8::Isolate* isolate = info.GetIsolate(); V8StringResource<> type(info[0]); if (!type.prepare()) return; v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); bool bubbles = false; V8_CALL(bubbles, info[1], BooleanValue(context), return); bool cancelable = false; V8_CALL(cancelable, info[2], BooleanValue(context), return); DeviceMotionData::Acceleration* acceleration = readAccelerationArgument(info[3], isolate); DeviceMotionData::Acceleration* accelerationIncludingGravity = readAccelerationArgument(info[4], isolate); DeviceMotionData::RotationRate* rotationRate = readRotationRateArgument(info[5], isolate); bool intervalProvided = !isUndefinedOrNull(info[6]); double interval = 0; if (intervalProvided) { interval = toRestrictedDouble(isolate, info[6], exceptionState); if (exceptionState.throwIfNeeded()) return; } DeviceMotionData* deviceMotionData = DeviceMotionData::create(acceleration, accelerationIncludingGravity, rotationRate, intervalProvided, interval); impl->initDeviceMotionEvent(type, bubbles, cancelable, deviceMotionData); }
bool ArrayValue::length(size_t& length) const { if (isUndefinedOrNull()) return false; length = m_array->Length(); return true; }
void V8MessageEvent::initMessageEventMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) { MessageEvent* event = V8MessageEvent::toNative(info.Holder()); TOSTRING_VOID(V8StringResource<>, typeArg, info[0]); TONATIVE_VOID(bool, canBubbleArg, info[1]->BooleanValue()); TONATIVE_VOID(bool, cancelableArg, info[2]->BooleanValue()); v8::Handle<v8::Value> dataArg = info[3]; TOSTRING_VOID(V8StringResource<>, originArg, info[4]); TOSTRING_VOID(V8StringResource<>, lastEventIdArg, info[5]); LocalDOMWindow* sourceArg = toDOMWindow(info[6], info.GetIsolate()); OwnPtr<MessagePortArray> portArray; const int portArrayIndex = 7; if (!isUndefinedOrNull(info[portArrayIndex])) { portArray = adoptPtr(new MessagePortArray); bool success = false; *portArray = toRefPtrNativeArray<MessagePort, V8MessagePort>(info[portArrayIndex], portArrayIndex + 1, info.GetIsolate(), &success); if (!success) return; } event->initMessageEvent(typeArg, canBubbleArg, cancelableArg, originArg, lastEventIdArg, sourceArg, portArray.release()); if (!dataArg.IsEmpty()) { V8HiddenValue::setHiddenValue(info.GetIsolate(), info.Holder(), V8HiddenValue::data(info.GetIsolate()), dataArg); if (DOMWrapperWorld::current(info.GetIsolate()).isIsolatedWorld()) event->setSerializedData(SerializedScriptValue::createAndSwallowExceptions(dataArg, info.GetIsolate())); } }
void V8TestInterfaceEventInit::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterfaceEventInit& impl, ExceptionState& exceptionState) { if (isUndefinedOrNull(v8Value)) { return; } if (!v8Value->IsObject()) { exceptionState.throwTypeError("cannot convert to dictionary."); return; } V8EventInit::toImpl(isolate, v8Value, impl, exceptionState); if (exceptionState.hadException()) return; v8::TryCatch block(isolate); v8::Local<v8::Object> v8Object; if (!v8Call(v8Value->ToObject(isolate->GetCurrentContext()), v8Object, block)) { exceptionState.rethrowV8Exception(block.Exception()); return; } v8::Local<v8::Value> stringMemberValue; if (!v8Object->Get(isolate->GetCurrentContext(), v8String(isolate, "stringMember")).ToLocal(&stringMemberValue)) { exceptionState.rethrowV8Exception(block.Exception()); return; } if (stringMemberValue.IsEmpty() || stringMemberValue->IsUndefined()) { // Do nothing. } else { V8StringResource<> stringMember = stringMemberValue; if (!stringMember.prepare(exceptionState)) return; impl.setStringMember(stringMember); } }
static void constructor4(const v8::FunctionCallbackInfo<v8::Value>& info) { ExceptionState exceptionState(ExceptionState::ConstructionContext, "TestInterfaceConstructor2", info.Holder(), info.GetIsolate()); TestInterfaceEmpty* testInterfaceEmptyArg; int longArg; V8StringResource<> defaultUndefinedOptionalStringArg; V8StringResource<> defaultNullStringOptionalStringArg; Dictionary defaultUndefinedOptionalDictionaryArg; V8StringResource<> optionalStringArg; { int numArgsPassed = info.Length(); while (numArgsPassed > 0) { if (!info[numArgsPassed - 1]->IsUndefined()) break; --numArgsPassed; } testInterfaceEmptyArg = V8TestInterfaceEmpty::toImplWithTypeCheck(info.GetIsolate(), info[0]); if (!testInterfaceEmptyArg) { exceptionState.throwTypeError("parameter 1 is not of type 'TestInterfaceEmpty'."); exceptionState.throwIfNeeded(); return; } longArg = toInt32(info.GetIsolate(), info[1], NormalConversion, exceptionState); if (exceptionState.throwIfNeeded()) return; defaultUndefinedOptionalStringArg = info[2]; if (!defaultUndefinedOptionalStringArg.prepare()) return; if (!info[3]->IsUndefined()) { defaultNullStringOptionalStringArg = info[3]; if (!defaultNullStringOptionalStringArg.prepare()) return; } else { defaultNullStringOptionalStringArg = nullptr; } if (!isUndefinedOrNull(info[4]) && !info[4]->IsObject()) { exceptionState.throwTypeError("parameter 5 ('defaultUndefinedOptionalDictionaryArg') is not an object."); exceptionState.throwIfNeeded(); return; } defaultUndefinedOptionalDictionaryArg = Dictionary(info[4], info.GetIsolate(), exceptionState); if (exceptionState.throwIfNeeded()) return; if (UNLIKELY(numArgsPassed <= 5)) { RefPtr<TestInterfaceConstructor2> impl = TestInterfaceConstructor2::create(testInterfaceEmptyArg, longArg, defaultUndefinedOptionalStringArg, defaultNullStringOptionalStringArg, defaultUndefinedOptionalDictionaryArg); v8::Local<v8::Object> wrapper = info.Holder(); wrapper = impl->associateWithWrapper(info.GetIsolate(), &V8TestInterfaceConstructor2::wrapperTypeInfo, wrapper); v8SetReturnValue(info, wrapper); return; } optionalStringArg = info[5]; if (!optionalStringArg.prepare()) return; } RefPtr<TestInterfaceConstructor2> impl = TestInterfaceConstructor2::create(testInterfaceEmptyArg, longArg, defaultUndefinedOptionalStringArg, defaultNullStringOptionalStringArg, defaultUndefinedOptionalDictionaryArg, optionalStringArg); v8::Local<v8::Object> wrapper = info.Holder(); wrapper = impl->associateWithWrapper(info.GetIsolate(), &V8TestInterfaceConstructor2::wrapperTypeInfo, wrapper); v8SetReturnValue(info, wrapper); }
bool extractTransferables(v8::Local<v8::Value> value, MessagePortArray& ports, ArrayBufferArray& arrayBuffers, v8::Isolate* isolate) { if (isUndefinedOrNull(value)) { ports.resize(0); arrayBuffers.resize(0); return true; } uint32_t length = 0; if (value->IsArray()) { v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(value); length = array->Length(); } else { if (toV8Sequence(value, length).IsEmpty()) return false; } v8::Local<v8::Object> transferrables = v8::Local<v8::Object>::Cast(value); // Validate the passed array of transferrables. for (unsigned int i = 0; i < length; ++i) { v8::Local<v8::Value> transferrable = transferrables->Get(i); // Validation of non-null objects, per HTML5 spec 10.3.3. if (isUndefinedOrNull(transferrable)) { setDOMException(INVALID_STATE_ERR, isolate); return false; } // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. if (V8MessagePort::HasInstance(transferrable)) { RefPtr<MessagePort> port = V8MessagePort::toNative(v8::Handle<v8::Object>::Cast(transferrable)); // Check for duplicate MessagePorts. if (ports.contains(port)) { setDOMException(INVALID_STATE_ERR, isolate); return false; } ports.append(port.release()); } else if (V8ArrayBuffer::HasInstance(transferrable)) arrayBuffers.append(V8ArrayBuffer::toNative(v8::Handle<v8::Object>::Cast(transferrable))); else { throwTypeError(); return false; } } return true; }
bool Dictionary::set(const String& key, const v8::Handle<v8::Value>& value) { if (isUndefinedOrNull()) return false; v8::Local<v8::Object> options = m_options->ToObject(); ASSERT(!options.IsEmpty()); return options->Set(v8String(m_isolate, key), value); }
v8::Handle<v8::Value> V8DeviceOrientationEvent::initDeviceOrientationEventCallback(const v8::Arguments& args) { DeviceOrientationEvent* imp = V8DeviceOrientationEvent::toNative(args.Holder()); STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, type, args[0]); bool bubbles = args[1]->BooleanValue(); bool cancelable = args[2]->BooleanValue(); // If alpha, beta or gamma are null or undefined, mark them as not provided. // Otherwise, use the standard JavaScript conversion. bool alphaProvided = !isUndefinedOrNull(args[3]); double alpha = args[3]->NumberValue(); bool betaProvided = !isUndefinedOrNull(args[4]); double beta = args[4]->NumberValue(); bool gammaProvided = !isUndefinedOrNull(args[5]); double gamma = args[5]->NumberValue(); RefPtr<DeviceOrientation> orientation = DeviceOrientation::create(alphaProvided, alpha, betaProvided, beta, gammaProvided, gamma); imp->initDeviceOrientationEvent(type, bubbles, cancelable, orientation.get()); return v8::Handle<v8::Value>(); }
bool getMessagePortArray(v8::Local<v8::Value> value, MessagePortArray& portArray) { if (isUndefinedOrNull(value)) { portArray.resize(0); return true; } if (!value->IsObject()) { throwError("MessagePortArray argument must be an object"); return false; } uint32_t length = 0; v8::Local<v8::Object> ports = v8::Local<v8::Object>::Cast(value); if (value->IsArray()) { v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(value); length = array->Length(); } else { // Sequence-type object - get the length attribute v8::Local<v8::Value> sequenceLength = ports->Get(v8::String::New("length")); if (!sequenceLength->IsNumber()) { throwError("MessagePortArray argument has no length attribute"); return false; } length = sequenceLength->Uint32Value(); } portArray.resize(length); for (unsigned int i = 0; i < length; ++i) { v8::Local<v8::Value> port = ports->Get(v8::Integer::New(i)); // Validation of non-null objects, per HTML5 spec 8.3.3. if (isUndefinedOrNull(port)) { throwError(INVALID_STATE_ERR); return false; } // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. if (!V8MessagePort::HasInstance(port)) { throwError("MessagePortArray argument must contain only MessagePorts"); return false; } portArray[i] = V8DOMWrapper::convertToNativeObject<MessagePort>(V8ClassIndex::MESSAGEPORT, v8::Handle<v8::Object>::Cast(port)); } return true; }
void V8DeviceOrientationEvent::initDeviceOrientationEventMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) { DeviceOrientationEvent* impl = V8DeviceOrientationEvent::toNative(info.Holder()); TOSTRING_VOID(V8StringResource<>, type, info[0]); bool bubbles = info[1]->BooleanValue(); bool cancelable = info[2]->BooleanValue(); // If alpha, beta, gamma or absolute are null or undefined, mark them as not provided. // Otherwise, use the standard JavaScript conversion. bool alphaProvided = !isUndefinedOrNull(info[3]); double alpha = info[3]->NumberValue(); bool betaProvided = !isUndefinedOrNull(info[4]); double beta = info[4]->NumberValue(); bool gammaProvided = !isUndefinedOrNull(info[5]); double gamma = info[5]->NumberValue(); bool absoluteProvided = !isUndefinedOrNull(info[6]); bool absolute = info[6]->BooleanValue(); RefPtrWillBeRawPtr<DeviceOrientationData> orientation = DeviceOrientationData::create(alphaProvided, alpha, betaProvided, beta, gammaProvided, gamma, absoluteProvided, absolute); impl->initDeviceOrientationEvent(type, bubbles, cancelable, orientation.get()); }