Beispiel #1
0
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;
}