📄 kjs_events.cpp
字号:
// pass marks through to JS objects we hold during garbage collection
void DOMMouseEvent::mark()
{
ObjectImp::mark();
if (clipboard && !clipboard->marked())
clipboard->mark();
}
Value DOMEvent::tryGet(ExecState *exec, const Identifier &p) const
{
#ifdef KJS_VERBOSE
kdDebug() << "KJS::DOMEvent::tryGet " << p.qstring() << endl;
#endif
return DOMObjectLookupGetValue<DOMEvent,DOMObject>(exec, p, &DOMEventTable, this );
}
Value DOMEvent::getValueProperty(ExecState *exec, int token) const
{
switch (token) {
case Type:
return String(event.type());
case Target:
case SrcElement: /*MSIE extension - "the object that fired the event"*/
return getDOMNode(exec,event.target());
case CurrentTarget:
return getDOMNode(exec,event.currentTarget());
case EventPhase:
return Number((unsigned int)event.eventPhase());
case Bubbles:
return Boolean(event.bubbles());
case CancelBubble:
return Boolean(event.getCancelBubble());
case ReturnValue:
return Boolean(!event.defaultPrevented());
case Cancelable:
return Boolean(event.cancelable());
case TimeStamp:
return Number((long unsigned int)event.timeStamp()); // ### long long ?
case ClipboardData:
{
DOM::EventImpl *ei = event.handle();
if (ei->isClipboardEvent()) {
DOM::ClipboardEventImpl *impl = static_cast<DOM::ClipboardEventImpl *>(event.handle());
if (!clipboard) {
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -