📄 kjs_events.cpp
字号:
clipboard = new Clipboard(exec, impl->clipboard()); } return Object(clipboard); } else { return Undefined(); } } case DataTransfer: { DOM::EventImpl *ei = event.handle(); if (ei->isDragEvent()) { DOM::MouseEventImpl *impl = static_cast<DOM::MouseEventImpl *>(event.handle()); if (!clipboard) { clipboard = new Clipboard(exec, impl->clipboard()); } return Object(clipboard); } else { return Undefined(); } } default: kdWarning() << "Unhandled token in DOMEvent::getValueProperty : " << token << endl; return Value(); }}void DOMEvent::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr){ DOMObjectLookupPut<DOMEvent, DOMObject>(exec, propertyName, value, attr, &DOMEventTable, this);}void DOMEvent::putValue(ExecState *exec, int token, const Value& value, int){ switch (token) { case ReturnValue: event.setDefaultPrevented(!value.toBoolean(exec)); break; case CancelBubble: event.setCancelBubble(value.toBoolean(exec)); break; default: break; }}Value DOMEventProtoFunc::tryCall(ExecState *exec, Object & thisObj, const List &args){ if (!thisObj.inherits(&KJS::DOMEvent::info)) { Object err = Error::create(exec,TypeError); exec->setException(err); return err; } DOM::Event event = static_cast<DOMEvent *>( thisObj.imp() )->toEvent(); switch (id) { case DOMEvent::StopPropagation: event.stopPropagation(); case DOMEvent::PreventDefault: event.preventDefault(); return Undefined(); case DOMEvent::InitEvent: event.initEvent(args[0].toString(exec).string(),args[1].toBoolean(exec),args[2].toBoolean(exec)); return Undefined(); }; return Undefined();}Value KJS::getDOMEvent(ExecState *exec, DOM::Event e){ DOM::EventImpl *ei = e.handle(); if (!ei) return Null(); ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter()); KJS::Interpreter::lock(); DOMObject *ret = interp->getDOMObject(ei); if (!ret) { if (ei->isKeyboardEvent()) ret = new DOMKeyboardEvent(exec, e); else if (ei->isMouseEvent()) ret = new DOMMouseEvent(exec, e); else if (ei->isUIEvent()) ret = new DOMUIEvent(exec, e); else if (ei->isMutationEvent()) ret = new DOMMutationEvent(exec, e); else ret = new DOMEvent(exec, e); interp->putDOMObject(ei, ret); } KJS::Interpreter::unlock(); return Value(ret);}DOM::Event KJS::toEvent(const Value& val){ Object obj = Object::dynamicCast(val); if (obj.isNull() || !obj.inherits(&DOMEvent::info)) return DOM::Event(); const DOMEvent *dobj = static_cast<const DOMEvent*>(obj.imp()); return dobj->toEvent();}// -------------------------------------------------------------------------const ClassInfo EventExceptionConstructor::info = { "EventExceptionConstructor", 0, &EventExceptionConstructorTable, 0 };/*@begin EventExceptionConstructorTable 1 UNSPECIFIED_EVENT_TYPE_ERR DOM::EventException::UNSPECIFIED_EVENT_TYPE_ERR DontDelete|ReadOnly@end*/Value EventExceptionConstructor::tryGet(ExecState *exec, const Identifier &p) const{ return DOMObjectLookupGetValue<EventExceptionConstructor, DOMObject>(exec,p,&EventExceptionConstructorTable,this);}Value EventExceptionConstructor::getValueProperty(ExecState *, int token) const{ // We use the token as the value to return directly return Number(token);}Value KJS::getEventExceptionConstructor(ExecState *exec){ return cacheGlobalObject<EventExceptionConstructor>(exec, "[[eventException.constructor]]");}// -------------------------------------------------------------------------const ClassInfo DOMUIEvent::info = { "UIEvent", &DOMEvent::info, &DOMUIEventTable, 0 };/*@begin DOMUIEventTable 8 view DOMUIEvent::View DontDelete|ReadOnly detail DOMUIEvent::Detail DontDelete|ReadOnly keyCode DOMUIEvent::KeyCode DontDelete|ReadOnly charCode DOMUIEvent::CharCode DontDelete|ReadOnly layerX DOMUIEvent::LayerX DontDelete|ReadOnly layerY DOMUIEvent::LayerY DontDelete|ReadOnly pageX DOMUIEvent::PageX DontDelete|ReadOnly pageY DOMUIEvent::PageY DontDelete|ReadOnly which DOMUIEvent::Which DontDelete|ReadOnly@end@begin DOMUIEventProtoTable 1 initUIEvent DOMUIEvent::InitUIEvent DontDelete|Function 5@end*/DEFINE_PROTOTYPE("DOMUIEvent",DOMUIEventProto)IMPLEMENT_PROTOFUNC(DOMUIEventProtoFunc)IMPLEMENT_PROTOTYPE_WITH_PARENT(DOMUIEventProto,DOMUIEventProtoFunc,DOMEventProto)DOMUIEvent::~DOMUIEvent(){}Value DOMUIEvent::tryGet(ExecState *exec, const Identifier &p) const{ return DOMObjectLookupGetValue<DOMUIEvent,DOMEvent>(exec,p,&DOMUIEventTable,this);}Value DOMUIEvent::getValueProperty(ExecState *exec, int token) const{ switch (token) { case View: return getDOMAbstractView(exec,static_cast<DOM::UIEvent>(event).view()); case Detail: return Number(static_cast<DOM::UIEvent>(event).detail()); case KeyCode: return Number(static_cast<DOM::UIEvent>(event).keyCode()); case CharCode: return Number(static_cast<DOM::UIEvent>(event).charCode()); case LayerX: return Number(static_cast<DOM::UIEvent>(event).layerX()); case LayerY: return Number(static_cast<DOM::UIEvent>(event).layerY()); case PageX: return Number(static_cast<DOM::UIEvent>(event).pageX()); case PageY: return Number(static_cast<DOM::UIEvent>(event).pageY()); case Which: return Number(static_cast<DOM::UIEvent>(event).which()); default: kdWarning() << "Unhandled token in DOMUIEvent::getValueProperty : " << token << endl; return Undefined(); }}Value DOMUIEventProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){ if (!thisObj.inherits(&KJS::DOMUIEvent::info)) { Object err = Error::create(exec,TypeError); exec->setException(err); return err; } DOM::UIEvent uiEvent = static_cast<DOMUIEvent *>(thisObj.imp())->toUIEvent(); switch (id) { case DOMUIEvent::InitUIEvent: { DOM::AbstractView v = toAbstractView(args[3]); static_cast<DOM::UIEvent>(uiEvent).initUIEvent(args[0].toString(exec).string(), args[1].toBoolean(exec), args[2].toBoolean(exec), v, args[4].toInt32(exec)); } return Undefined(); } return Undefined();}// -------------------------------------------------------------------------const ClassInfo DOMMouseEvent::info = { "MouseEvent", &DOMUIEvent::info, &DOMMouseEventTable, 0 };/*@begin DOMMouseEventTable 16 screenX DOMMouseEvent::ScreenX DontDelete|ReadOnly screenY DOMMouseEvent::ScreenY DontDelete|ReadOnly clientX DOMMouseEvent::ClientX DontDelete|ReadOnly x DOMMouseEvent::X DontDelete|ReadOnly clientY DOMMouseEvent::ClientY DontDelete|ReadOnly y DOMMouseEvent::Y DontDelete|ReadOnly offsetX DOMMouseEvent::OffsetX DontDelete|ReadOnly offsetY DOMMouseEvent::OffsetY DontDelete|ReadOnly ctrlKey DOMMouseEvent::CtrlKey DontDelete|ReadOnly shiftKey DOMMouseEvent::ShiftKey DontDelete|ReadOnly altKey DOMMouseEvent::AltKey DontDelete|ReadOnly metaKey DOMMouseEvent::MetaKey DontDelete|ReadOnly button DOMMouseEvent::Button DontDelete|ReadOnly relatedTarget DOMMouseEvent::RelatedTarget DontDelete|ReadOnly fromElement DOMMouseEvent::FromElement DontDelete|ReadOnly toElement DOMMouseEvent::ToElement DontDelete|ReadOnly@end@begin DOMMouseEventProtoTable 1 initMouseEvent DOMMouseEvent::InitMouseEvent DontDelete|Function 15@end*/DEFINE_PROTOTYPE("DOMMouseEvent",DOMMouseEventProto)IMPLEMENT_PROTOFUNC(DOMMouseEventProtoFunc)IMPLEMENT_PROTOTYPE_WITH_PARENT(DOMMouseEventProto,DOMMouseEventProtoFunc,DOMUIEventProto)DOMMouseEvent::~DOMMouseEvent(){}Value DOMMouseEvent::tryGet(ExecState *exec, const Identifier &p) const{#ifdef KJS_VERBOSE kdDebug(6070) << "DOMMouseEvent::tryGet " << p.qstring() << endl;#endif return DOMObjectLookupGetValue<DOMMouseEvent,DOMUIEvent>(exec,p,&DOMMouseEventTable,this);}Value DOMMouseEvent::getValueProperty(ExecState *exec, int token) const{ switch (token) { case ScreenX: return Number(static_cast<DOM::MouseEvent>(event).screenX()); case ScreenY: return Number(static_cast<DOM::MouseEvent>(event).screenY()); case ClientX: case X: return Number(static_cast<DOM::MouseEvent>(event).clientX()); case ClientY: case Y: return Number(static_cast<DOM::MouseEvent>(event).clientY()); case OffsetX: case OffsetY: // MSIE extension { DOM::Node node = event.target(); node.handle()->getDocument()->updateRendering(); khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L; int x = static_cast<DOM::MouseEvent>(event).clientX(); int y = static_cast<DOM::MouseEvent>(event).clientY(); if ( rend ) { int xPos, yPos; if ( rend->absolutePosition( xPos, yPos ) ) { kdDebug() << "DOMMouseEvent::getValueProperty rend=" << rend << " xPos=" << xPos << " yPos=" << yPos << endl; x -= xPos; y -= yPos; } } return Number( token == OffsetX ? x : y ); } case CtrlKey: return Boolean(static_cast<DOM::MouseEvent>(event).ctrlKey()); case ShiftKey: return Boolean(static_cast<DOM::MouseEvent>(event).shiftKey()); case AltKey: return Boolean(static_cast<DOM::MouseEvent>(event).altKey()); case MetaKey: return Boolean(static_cast<DOM::MouseEvent>(event).metaKey()); case Button: { // Tricky. The DOM (and khtml) use 0 for LMB, 1 for MMB and 2 for RMB // but MSIE uses 1=LMB, 2=RMB, 4=MMB, as a bitfield int domButton = static_cast<DOM::MouseEvent>(event).button(); int button = domButton==0 ? 1 : domButton==1 ? 4 : domButton==2 ? 2 : 0; return Number( (unsigned int)button ); } case ToElement: // MSIE extension - "the object toward which the user is moving the mouse pointer" if (event.handle()->id() == DOM::EventImpl::MOUSEOUT_EVENT) return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).relatedTarget()); return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).target()); case FromElement: // MSIE extension - "object from which activation // or the mouse pointer is exiting during the event" (huh?) if (event.handle()->id() == DOM::EventImpl::MOUSEOUT_EVENT) return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).target()); /* fall through */ case RelatedTarget: return getDOMNode(exec,static_cast<DOM::MouseEvent>(event).relatedTarget()); default: kdWarning() << "Unhandled token in DOMMouseEvent::getValueProperty : " << token << endl; return Value(); }}Value DOMMouseEventProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){ if (!thisObj.inherits(&KJS::DOMMouseEvent::info)) { Object err = Error::create(exec,TypeError); exec->setException(err); return err; } DOM::MouseEvent mouseEvent = static_cast<DOMMouseEvent *>(thisObj.imp())->toMouseEvent(); switch (id) { case DOMMouseEvent::InitMouseEvent: mouseEvent.initMouseEvent(args[0].toString(exec).string(), // typeArg args[1].toBoolean(exec), // canBubbleArg args[2].toBoolean(exec), // cancelableArg toAbstractView(args[3]), // viewArg args[4].toInt32(exec), // detailArg args[5].toInt32(exec), // screenXArg args[6].toInt32(exec), // screenYArg args[7].toInt32(exec), // clientXArg args[8].toInt32(exec), // clientYArg args[9].toBoolean(exec), // ctrlKeyArg args[10].toBoolean(exec), // altKeyArg args[11].toBoolean(exec), // shiftKeyArg args[12].toBoolean(exec), // metaKeyArg args[13].toInt32(exec), // buttonArg toNode(args[14])); // relatedTargetArg return Undefined(); } return Undefined();}// -------------------------------------------------------------------------const ClassInfo DOMKeyboardEvent::info = { "KeyboardEvent", &DOMUIEvent::info, &DOMKeyboardEventTable, 0 };/*@begin DOMKeyboardEventTable 5 keyIdentifier DOMKeyboardEvent::KeyIdentifier DontDelete|ReadOnly keyLocation DOMKeyboardEvent::KeyLocation DontDelete|ReadOnly
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -