v8::Handle<v8::Value> V8TrackEvent::trackAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { TrackEvent* trackEvent = V8TrackEvent::toNative(info.Holder()); TrackBase* track = trackEvent->track(); if (!track) return v8Null(info.GetIsolate()); switch (track->type()) { case TrackBase::BaseTrack: // This should never happen. ASSERT_NOT_REACHED(); break; case TrackBase::TextTrack: return toV8(static_cast<TextTrack*>(track), info.Holder(), info.GetIsolate()); break; case TrackBase::AudioTrack: case TrackBase::VideoTrack: // This should not happen until VideoTrack and AudioTrack are implemented. ASSERT_NOT_REACHED(); break; } return v8Null(info.GetIsolate()); }
v8::Handle<v8::Value> V8DeviceMotionEvent::intervalAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.DeviceMotionEvent.interval._get"); v8::Handle<v8::Object> holder = info.Holder(); DeviceMotionEvent* imp = V8DeviceMotionEvent::toNative(holder); if (!imp->deviceMotionData()->canProvideInterval()) return v8Null(info.GetIsolate()); return v8::Number::New(imp->deviceMotionData()->interval()); }
v8::Handle<v8::Value> V8DeviceMotionEvent::rotationRateAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.DeviceMotionEvent.rotationRate._get"); v8::Handle<v8::Object> holder = info.Holder(); DeviceMotionEvent* imp = V8DeviceMotionEvent::toNative(holder); if (!imp->deviceMotionData()->rotationRate()) return v8Null(info.GetIsolate()); return createRotationRateObject(imp->deviceMotionData()->rotationRate(), info.GetIsolate()); }
v8::Handle<v8::Value> V8DeviceOrientationEvent::absoluteAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.DeviceOrientationEvent.absolute._get"); v8::Handle<v8::Object> holder = info.Holder(); DeviceOrientationEvent* imp = V8DeviceOrientationEvent::toNative(holder); if (!imp->orientation()->canProvideAbsolute()) return v8Null(info.GetIsolate()); return v8::Boolean::New(imp->orientation()->absolute()); }
v8::Handle<v8::Value> V8MessageEvent::dataAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.MessageEvent.data"); MessageEvent* event = V8MessageEvent::toNative(info.Holder()); v8::Handle<v8::Value> result; switch (event->dataType()) { case MessageEvent::DataTypeScriptValue: { ScriptValue scriptValue = event->dataAsScriptValue(); if (scriptValue.hasNoValue()) result = v8Null(info.GetIsolate()); else result = v8::Local<v8::Value>::New(scriptValue.v8Value()); break; } case MessageEvent::DataTypeSerializedScriptValue: if (SerializedScriptValue* serializedValue = event->dataAsSerializedScriptValue()) result = serializedValue->deserialize(event->ports(), info.GetIsolate()); else result = v8Null(info.GetIsolate()); break; case MessageEvent::DataTypeString: { String stringValue = event->dataAsString(); result = v8String(stringValue, info.GetIsolate()); break; } case MessageEvent::DataTypeBlob: result = toV8(event->dataAsBlob(), info.Holder(), info.GetIsolate()); break; case MessageEvent::DataTypeArrayBuffer: result = toV8(event->dataAsArrayBuffer(), info.Holder(), info.GetIsolate()); break; } // Overwrite the data attribute so it returns the cached result in future invocations. // This custom handler (dataAccessGetter) will not be called again. v8::PropertyAttribute dataAttr = static_cast<v8::PropertyAttribute>(v8::DontDelete | v8::ReadOnly); info.Holder()->ForceSet(name, result, dataAttr); return result; }
v8::Handle<v8::Value> V8HTMLFormControlsCollection::namedItemMethodCustom(const v8::Arguments& args) { HTMLFormControlsCollection* imp = V8HTMLFormControlsCollection::toNative(args.Holder()); v8::Handle<v8::Value> result = getNamedItems(imp, toWebCoreString(args[0]), args); if (result.IsEmpty()) return v8Null(args.GetIsolate()); return result; }
static v8::Handle<v8::Value> cachedReadonlyValueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { v8::Handle<v8::String> propertyName = v8::String::NewSymbol("cachedReadonlyValue"); v8::Handle<v8::Value> value = info.Holder()->GetHiddenValue(propertyName); if (!value.IsEmpty()) return value; TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); RefPtr<SerializedScriptValue> serialized = imp->cachedReadonlyValue(); value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Null(info.GetIsolate())); info.Holder()->SetHiddenValue(propertyName, value); return value; }
v8::Handle<v8::Value> V8Node::removeChildMethodCustom(const v8::Arguments& args) { v8::Handle<v8::Object> holder = args.Holder(); Node* imp = V8Node::toNative(holder); ExceptionCode ec = 0; Node* oldChild = V8Node::HasInstance(args[0], args.GetIsolate(), worldType(args.GetIsolate())) ? V8Node::toNative(v8::Handle<v8::Object>::Cast(args[0])) : 0; bool success = imp->removeChild(oldChild, ec); if (ec) return setDOMException(ec, args.GetIsolate()); if (success) return args[0]; return v8Null(args.GetIsolate()); }
// This function is customized to take advantage of the optional 4th argument: AttachBehavior v8::Handle<v8::Value> V8Node::insertBeforeMethodCustom(const v8::Arguments& args) { v8::Handle<v8::Object> holder = args.Holder(); Node* imp = V8Node::toNative(holder); ExceptionCode ec = 0; Node* newChild = V8Node::HasInstance(args[0], args.GetIsolate(), worldType(args.GetIsolate())) ? V8Node::toNative(v8::Handle<v8::Object>::Cast(args[0])) : 0; Node* refChild = V8Node::HasInstance(args[1], args.GetIsolate(), worldType(args.GetIsolate())) ? V8Node::toNative(v8::Handle<v8::Object>::Cast(args[1])) : 0; bool success = imp->insertBefore(newChild, refChild, ec, AttachLazily); if (ec) return setDOMException(ec, args.GetIsolate()); if (success) return args[0]; return v8Null(args.GetIsolate()); }
v8::Handle<v8::Value> V8PopStateEvent::stateAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.PopStateEvent.state"); v8::Handle<v8::Value> result = info.Holder()->GetHiddenValue(V8HiddenPropertyName::state()); if (!result.IsEmpty()) return result; PopStateEvent* event = V8PopStateEvent::toNative(info.Holder()); if (!event->state().hasNoValue()) return cacheState(info.Holder(), event->state().v8Value()); History* history = event->history(); if (!history || !event->serializedState()) return cacheState(info.Holder(), v8Null(info.GetIsolate())); // There's no cached value from a previous invocation, nor a state value was provided by the // event, but there is a history object, so first we need to see if the state object has been // deserialized through the history object already. // The current history state object might've changed in the meantime, so we need to take care // of using the correct one, and always share the same deserialization with history.state. bool isSameState = history->isSameAsCurrentState(event->serializedState()); if (isSameState) { v8::Handle<v8::Object> v8History = toV8(history, info.Holder(), info.GetIsolate()).As<v8::Object>(); if (!history->stateChanged()) { result = v8History->GetHiddenValue(V8HiddenPropertyName::state()); if (!result.IsEmpty()) return cacheState(info.Holder(), result); } result = event->serializedState()->deserialize(0, info.GetIsolate()); v8History->SetHiddenValue(V8HiddenPropertyName::state(), result); } else result = event->serializedState()->deserialize(0, info.GetIsolate()); return cacheState(info.Holder(), result); }
static v8::Handle<v8::Value> onmessageAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { MessagePort* imp = V8MessagePort::toNative(info.Holder()); return imp->onmessage() ? v8::Handle<v8::Value>(static_cast<V8AbstractEventListener*>(imp->onmessage())->getListenerObject(imp->scriptExecutionContext())) : v8::Handle<v8::Value>(v8Null(info.GetIsolate())); }
void V8History::stateAttrGetterCustom(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info) { History* history = V8History::toNative(info.Holder()); v8::Handle<v8::Value> value = info.Holder()->GetHiddenValue(V8HiddenPropertyName::state()); if (!value.IsEmpty() && !history->stateChanged()) { v8SetReturnValue(info, value); return; } RefPtr<SerializedScriptValue> serialized = history->state(); value = serialized ? serialized->deserialize(info.GetIsolate()) : v8::Handle<v8::Value>(v8Null(info.GetIsolate())); info.Holder()->SetHiddenValue(V8HiddenPropertyName::state(), value); v8SetReturnValue(info, value); }
static v8::Handle<v8::Value> onwebkitresourcetimingbufferfullAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { Performance* imp = V8Performance::toNative(info.Holder()); return imp->onwebkitresourcetimingbufferfull() ? v8::Handle<v8::Value>(static_cast<V8AbstractEventListener*>(imp->onwebkitresourcetimingbufferfull())->getListenerObject(imp->scriptExecutionContext())) : v8::Handle<v8::Value>(v8Null(info.GetIsolate())); }
v8::Handle<v8::Value> V8History::stateAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { History* history = V8History::toNative(info.Holder()); v8::Handle<v8::Value> value = info.Holder()->GetHiddenValue(V8HiddenPropertyName::state()); if (!value.IsEmpty() && !history->stateChanged()) return value; SerializedScriptValue* serialized = history->state(); value = serialized ? serialized->deserialize(0, info.GetIsolate()) : v8::Handle<v8::Value>(v8Null(info.GetIsolate())); info.Holder()->SetHiddenValue(V8HiddenPropertyName::state(), value); return value; }
static v8::Handle<v8::Value> valueAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder()); return imp->value() ? imp->value()->deserialize() : v8::Handle<v8::Value>(v8Null(info.GetIsolate())); }