JSValue *DOMEvent::getValueProperty(ExecState *exec, int token) const { Event &event = *m_impl; switch (token) { case Type: return jsString(event.type()); case Target: case SrcElement: /*MSIE extension - "the object that fired the event"*/ return toJS(exec, event.target()); case CurrentTarget: return toJS(exec, event.currentTarget()); case EventPhase: return jsNumber(event.eventPhase()); case Bubbles: return jsBoolean(event.bubbles()); case CancelBubble: return jsBoolean(event.getCancelBubble()); case ReturnValue: return jsBoolean(!event.defaultPrevented()); case Cancelable: return jsBoolean(event.cancelable()); case TimeStamp: return jsNumber(event.timeStamp()); case ClipboardData: { if (event.isClipboardEvent()) { ClipboardEvent *impl = static_cast<ClipboardEvent *>(&event); if (!clipboard) clipboard = new Clipboard(exec, impl->clipboard()); return clipboard; } else return jsUndefined(); } case DataTransfer: { if (event.isDragEvent()) { MouseEvent *impl = static_cast<MouseEvent *>(&event); if (!clipboard) clipboard = new Clipboard(exec, impl->clipboard()); return clipboard; } else return jsUndefined(); } default: return 0; } }
static bool getDragDataImpl(NPObject* npobj, int* eventId, WebDragData* data) { if (!npobj) return false; if (npobj->_class != npScriptObjectClass) return false; v8::HandleScope handleScope; v8::Handle<v8::Context> context = v8::Context::GetEntered(); if (context.IsEmpty()) return false; // Get the current WebCore event. v8::Handle<v8::Value> currentEvent(getEvent(context)); Event* event = V8Event::toNative(v8::Handle<v8::Object>::Cast(currentEvent)); if (!event) return false; // Check that the given npobj is that event. V8NPObject* object = reinterpret_cast<V8NPObject*>(npobj); Event* given = V8Event::toNative(object->v8Object); if (given != event) return false; // Check the execution frames are same origin. V8Proxy* current = V8Proxy::retrieve(V8Proxy::retrieveFrameForCurrentContext()); Frame* frame = V8Proxy::retrieveFrame(context); if (!current || !V8BindingSecurity::canAccessFrame(V8BindingState::Only(), frame, false)) return false; const EventNames& names(eventNames()); const AtomicString& eventType(event->type()); enum DragTargetMouseEventId { DragEnterId = 1, DragOverId = 2, DragLeaveId = 3, DropId = 4 }; // The event type should be a drag event. if (eventType == names.dragenterEvent) *eventId = DragEnterId; else if (eventType == names.dragoverEvent) *eventId = DragOverId; else if (eventType == names.dragleaveEvent) *eventId = DragLeaveId; else if (eventType == names.dropEvent) *eventId = DropId; else return false; // Drag events are mouse events and should have a clipboard. MouseEvent* me = static_cast<MouseEvent*>(event); Clipboard* clipboard = me->clipboard(); if (!clipboard) return false; // And that clipboard should be accessible by WebKit policy. ClipboardChromium* chrome = static_cast<ClipboardChromium*>(clipboard); HashSet<String> accessible(chrome->types()); if (accessible.isEmpty()) return false; RefPtr<ChromiumDataObject> dataObject(chrome->dataObject()); if (dataObject && data) *data = WebDragData(dataObject); return dataObject; }