📄 kjs_dom.cpp
字号:
break;
}
}
return Value();
}
void DOMNode::tryPut(ExecState *exec, const Identifier& propertyName, const Value& value, int attr)
{
#ifdef KJS_VERBOSE
kdDebug(6070) << "DOMNode::tryPut " << propertyName.qstring() << endl;
#endif
DOMObjectLookupPut<DOMNode,DOMObject>(exec, propertyName, value, attr,
&DOMNodeTable, this );
}
void DOMNode::putValue(ExecState *exec, int token, const Value& value, int /*attr*/)
{
switch (token) {
case NodeValue:
node.setNodeValue(value.toString(exec).string());
break;
case Prefix:
node.setPrefix(value.toString(exec).string());
break;
case OnAbort:
setListener(exec,DOM::EventImpl::ABORT_EVENT,value);
break;
case OnBlur:
setListener(exec,DOM::EventImpl::BLUR_EVENT,value);
break;
case OnChange:
setListener(exec,DOM::EventImpl::CHANGE_EVENT,value);
break;
case OnClick:
setListener(exec,DOM::EventImpl::KHTML_CLICK_EVENT,value);
break;
case OnContextMenu:
setListener(exec,DOM::EventImpl::CONTEXTMENU_EVENT,value);
break;
case OnDblClick:
setListener(exec,DOM::EventImpl::KHTML_DBLCLICK_EVENT,value);
break;
case OnDragDrop:
setListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT,value);
break;
case OnError:
setListener(exec,DOM::EventImpl::KHTML_ERROR_EVENT,value);
break;
case OnFocus:
setListener(exec,DOM::EventImpl::FOCUS_EVENT,value);
break;
case OnInput:
setListener(exec,DOM::EventImpl::INPUT_EVENT,value);
break;
case OnKeyDown:
setListener(exec,DOM::EventImpl::KEYDOWN_EVENT,value);
break;
case OnKeyPress:
setListener(exec,DOM::EventImpl::KEYPRESS_EVENT,value);
break;
case OnKeyUp:
setListener(exec,DOM::EventImpl::KEYUP_EVENT,value);
break;
case OnLoad:
setListener(exec,DOM::EventImpl::LOAD_EVENT,value);
break;
case OnMouseDown:
setListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT,value);
break;
case OnMouseMove:
setListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT,value);
break;
case OnMouseOut:
setListener(exec,DOM::EventImpl::MOUSEOUT_EVENT,value);
break;
case OnMouseOver:
setListener(exec,DOM::EventImpl::MOUSEOVER_EVENT,value);
break;
case OnMouseUp:
setListener(exec,DOM::EventImpl::MOUSEUP_EVENT,value);
break;
case OnBeforeCut:
setListener(exec,DOM::EventImpl::BEFORECUT_EVENT,value);
break;
case OnCut:
setListener(exec,DOM::EventImpl::CUT_EVENT,value);
break;
case OnBeforeCopy:
setListener(exec,DOM::EventImpl::BEFORECOPY_EVENT,value);
break;
case OnCopy:
setListener(exec,DOM::EventImpl::COPY_EVENT,value);
break;
case OnBeforePaste:
setListener(exec,DOM::EventImpl::BEFOREPASTE_EVENT,value);
break;
case OnPaste:
setListener(exec,DOM::EventImpl::PASTE_EVENT,value);
break;
case OnDragEnter:
setListener(exec,DOM::EventImpl::DRAGENTER_EVENT,value);
break;
case OnDragOver:
setListener(exec,DOM::EventImpl::DRAGOVER_EVENT,value);
break;
case OnDragLeave:
setListener(exec,DOM::EventImpl::DRAGLEAVE_EVENT,value);
break;
case OnDrop:
setListener(exec,DOM::EventImpl::DROP_EVENT,value);
break;
case OnDragStart:
setListener(exec,DOM::EventImpl::DRAGSTART_EVENT,value);
break;
case OnDrag:
setListener(exec,DOM::EventImpl::DRAG_EVENT,value);
break;
case OnDragEnd:
setListener(exec,DOM::EventImpl::DRAGEND_EVENT,value);
break;
case OnMove:
setListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT,value);
break;
case OnReset:
setListener(exec,DOM::EventImpl::RESET_EVENT,value);
break;
case OnResize:
setListener(exec,DOM::EventImpl::RESIZE_EVENT,value);
break;
case OnScroll:
setListener(exec,DOM::EventImpl::SCROLL_EVENT,value);
#if APPLE_CHANGES
case OnSearch:
setListener(exec,DOM::EventImpl::SEARCH_EVENT,value);
break;
#endif
case OnSelect:
setListener(exec,DOM::EventImpl::SELECT_EVENT,value);
break;
case OnSelectStart:
setListener(exec,DOM::EventImpl::SELECTSTART_EVENT,value);
break;
case OnSubmit:
setListener(exec,DOM::EventImpl::SUBMIT_EVENT,value);
break;
case OnUnload:
setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value);
break;
case ScrollTop: {
khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L;
if (rend && rend->hasOverflowClip())
rend->layer()->scrollToYOffset(value.toInt32(exec));
break;
}
case ScrollLeft: {
khtml::RenderObject *rend = node.handle() ? node.handle()->renderer() : 0L;
if (rend && rend->hasOverflowClip())
rend->layer()->scrollToXOffset(value.toInt32(exec));
break;
}
default:
kdWarning() << "DOMNode::putValue unhandled token " << token << endl;
}
}
Value DOMNode::toPrimitive(ExecState *exec, Type /*preferred*/) const
{
if (node.isNull())
return Null();
return String(toString(exec));
}
UString DOMNode::toString(ExecState *) const
{
if (node.isNull())
return "null";
UString s;
DOM::Element e = node;
if ( !e.isNull() ) {
s = UString(e.nodeName().string());
} else
s = className(); // fallback
return "[object " + s + "]";
}
void DOMNode::setListener(ExecState *exec, int eventId, Value func) const
{
node.handle()->setHTMLEventListener(eventId,Window::retrieveActive(exec)->getJSEventListener(func,true));
}
Value DOMNode::getListener(int eventId) const
{
DOM::EventListener *listener = node.handle()->getHTMLEventListener(eventId);
JSEventListener *jsListener = static_cast<JSEventListener*>(listener);
if ( jsListener && jsListener->listenerObjImp() )
return jsListener->listenerObj();
else
return Null();
}
void DOMNode::pushEventHandlerScope(ExecState *, ScopeChain &) const
{
}
Value DOMNodeProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args)
{
if (!thisObj.inherits(&DOMNode::info)) {
Object err = Error::create(exec,TypeError);
exec->setException(err);
return err;
}
DOM::Node node = static_cast<DOMNode *>( thisObj.imp() )->toNode();
switch (id) {
case DOMNode::HasAttributes:
return Boolean(node.hasAttributes());
case DOMNode::HasChildNodes:
return Boolean(node.hasChildNodes());
case DOMNode::CloneNode:
return getDOMNode(exec,node.cloneNode(args[0].toBoolean(exec)));
case DOMNode::Normalize:
node.normalize();
return Undefined();
case DOMNode::IsSupported:
return Boolean(node.isSupported(args[0].toString(exec).string(),
(args[1].type() != UndefinedType && args[1].type() != NullType) ? args[1].toString(exec).string() : DOMString()));
case DOMNode::AddEventListener: {
JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);
if (listener)
node.addEventListener(args[0].toString(exec).string(),listener,args[2].toBoolean(exec));
return Undefined();
}
case DOMNode::RemoveEventListener: {
JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);
if (listener)
node.removeEventListener(args[0].toString(exec).string(),listener,args[2].toBoolean(exec));
return Undefined();
}
case DOMNode::DispatchEvent:
return Boolean(node.dispatchEvent(toEvent(args[0])));
case DOMNode::AppendChild:
return getDOMNode(exec,node.appendChild(toNode(args[0])));
case DOMNode::RemoveChild:
return getDOMNode(exec,node.removeChild(toNode(args[0])));
case DOMNode::InsertBefore:
return getDOMNode(exec,node.insertBefore(toNode(args[0]), toNode(args[1])));
case DOMNode::ReplaceChild:
return getDOMNode(exec,node.replaceChild(toNode(args[0]), toNode(args[1])));
case DOMNode::Contains:
{
int exceptioncode=0;
DOM::Node other = toNode(args[0]);
if (!other.isNull() && node.nodeType()==DOM::Node::ELEMENT_NODE)
{
DOM::NodeBaseImpl *impl = static_cast<DOM::NodeBaseImpl *>(node.handle());
bool retval = !impl->checkNoOwner(other.handle(),exceptioncode);
return Boolean(retval && exceptioncode == 0);
}
return Undefined();
}
case DOMNode::Item:
return getDOMNode(exec, node.childNodes().item(static_cast<unsigned long>(args[0].toNumber(exec))));
}
return Undefined();
}
// -------------------------------------------------------------------------
const ClassInfo DOMNodeList::info = { "NodeList", 0, 0, 0 };
DOMNodeList::~DOMNodeList()
{
ScriptInterpreter::forgetDOMObject(list.handle());
}
Value DOMNodeList::toPrimitive(ExecState *exec, Type /*preferred*/) const
{
if (list.isNull())
return Null();
return String(toString(exec));
}
// We have to implement hasProperty since we don't use a hashtable for 'length' and 'item'
// ## this breaks "for (..in..)" though.
bool DOMNodeList::hasProperty(ExecState *exec, const Identifier &p) const
{
if (p == lengthPropertyName || p == "item")
return true;
return ObjectImp::hasProperty(exec, p);
}
Value DOMNodeList::tryGet(ExecState *exec, const Identifier &p) const
{
#ifdef KJS_VERBOSE
kdDebug(6070) << "DOMNodeList::tryGet " << p.ascii() << endl;
#endif
Value result;
if (p == lengthPropertyName)
result = Number(list.length());
else if (p == "item") {
// No need for a complete hashtable for a single func, but we still want
// to use the caching feature of lookupOrCreateFunction.
result = lookupOrCreateFunction<DOMNodeListFunc>(exec, p, this, DOMNodeListFunc::Item, 1, DontDelete|Function);
//result = new DOMNodeListFunc(exec, DOMNodeListFunc::Item, 1);
}
else {
// array index ?
bool ok;
long unsigned int idx = p.toULong(&ok);
if (ok) {
result = getDOMNode(exec,list.item(idx));
} else {
DOM::Node node = list.itemById(p.string());
if (!node.isNull()) {
result = getDOMNode(exec, node);
} else {
result = ObjectImp::get(exec, p);
}
}
}
return result;
}
// Need to support both get and call, so that list[0] and list(0) work.
Value DOMNodeList::call(ExecState *exec, Object &thisObj, const List &args)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -