📄 kjs_dom.cpp
字号:
// -------------------------------------------------------------------------/* Source for DOMElementProtoTable. Use "make hashtables" to regenerate.@begin DOMElementProtoTable 17 getAttribute DOMElement::GetAttribute DontDelete|Function 1 setAttribute DOMElement::SetAttribute DontDelete|Function 2 removeAttribute DOMElement::RemoveAttribute DontDelete|Function 1 getAttributeNode DOMElement::GetAttributeNode DontDelete|Function 1 setAttributeNode DOMElement::SetAttributeNode DontDelete|Function 2 removeAttributeNode DOMElement::RemoveAttributeNode DontDelete|Function 1 getElementsByTagName DOMElement::GetElementsByTagName DontDelete|Function 1 hasAttribute DOMElement::HasAttribute DontDelete|Function 1 getAttributeNS DOMElement::GetAttributeNS DontDelete|Function 2 setAttributeNS DOMElement::SetAttributeNS DontDelete|Function 3 removeAttributeNS DOMElement::RemoveAttributeNS DontDelete|Function 2 getAttributeNodeNS DOMElement::GetAttributeNodeNS DontDelete|Function 2 setAttributeNodeNS DOMElement::SetAttributeNodeNS DontDelete|Function 1 getElementsByTagNameNS DOMElement::GetElementsByTagNameNS DontDelete|Function 2 hasAttributeNS DOMElement::HasAttributeNS DontDelete|Function 2@end*/DEFINE_PROTOTYPE("DOMElement",DOMElementProto)IMPLEMENT_PROTOFUNC(DOMElementProtoFunc)IMPLEMENT_PROTOTYPE_WITH_PARENT(DOMElementProto,DOMElementProtoFunc,DOMNodeProto)const ClassInfo KJS::DOMElement::info = { "Element", &DOMNode::info, &DOMElementTable, 0 };/* Source for DOMElementTable. Use "make hashtables" to regenerate.@begin DOMElementTable 3 tagName DOMElement::TagName DontDelete|ReadOnly style DOMElement::Style DontDelete|ReadOnly@end*/KJS::DOMElement::DOMElement(ExecState *exec, const DOM::Element &e) : DOMNode(DOMElementProto::self(exec), e) { }KJS::DOMElement::DOMElement(const Object &proto, const DOM::Element &e) : DOMNode(proto, e) { }Value KJS::DOMElement::tryGet(ExecState *exec, const Identifier &propertyName) const{#ifdef KJS_VERBOSE kdDebug(6070) << "DOMElement::tryGet " << propertyName.qstring() << endl;#endif DOM::Element element = static_cast<DOM::Element>(node); const HashEntry* entry = Lookup::findEntry(&DOMElementTable, propertyName); if (entry) { switch( entry->value ) { case TagName: return getStringOrNull(element.tagName()); case Style: return getDOMCSSStyleDeclaration(exec,element.style()); default: kdWarning() << "Unhandled token in DOMElement::tryGet : " << entry->value << endl; break; } } // We have to check in DOMNode before giving access to attributes, otherwise // onload="..." would make onload return the string (attribute value) instead of // the listener object (function). if (DOMNode::hasProperty(exec, propertyName)) return DOMNode::tryGet(exec, propertyName); DOM::DOMString attr = element.getAttribute( propertyName.string() ); // Give access to attributes if ( !attr.isNull() ) return getStringOrNull( attr ); return Undefined();}Value DOMElementProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){ if (!thisObj.inherits(&KJS::DOMNode::info)) { // node should be enough here, given the cast Object err = Error::create(exec,TypeError); exec->setException(err); return err; } DOM::Node node = static_cast<DOMNode *>( thisObj.imp() )->toNode(); DOM::Element element = static_cast<DOM::Element>(node); switch(id) { case DOMElement::GetAttribute: // getString should be used here, since if the attribute isn't present at all, you should // return null and not "". return getStringOrNull(element.getAttribute(args[0].toString(exec).string())); case DOMElement::SetAttribute: element.setAttribute(args[0].toString(exec).string(),args[1].toString(exec).string()); return Undefined(); case DOMElement::RemoveAttribute: element.removeAttribute(args[0].toString(exec).string()); return Undefined(); case DOMElement::GetAttributeNode: return getDOMNode(exec,element.getAttributeNode(args[0].toString(exec).string())); case DOMElement::SetAttributeNode: return getDOMNode(exec,element.setAttributeNode((new DOMNode(exec,KJS::toNode(args[0])))->toNode())); case DOMElement::RemoveAttributeNode: return getDOMNode(exec,element.removeAttributeNode((new DOMNode(exec,KJS::toNode(args[0])))->toNode())); case DOMElement::GetElementsByTagName: return getDOMNodeList(exec,element.getElementsByTagName(args[0].toString(exec).string())); case DOMElement::HasAttribute: // DOM2 return Boolean(element.hasAttribute(args[0].toString(exec).string())); case DOMElement::GetAttributeNS: // DOM2 return String(element.getAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string())); case DOMElement::SetAttributeNS: // DOM2 element.setAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string(),args[2].toString(exec).string()); return Undefined(); case DOMElement::RemoveAttributeNS: // DOM2 element.removeAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string()); return Undefined(); case DOMElement::GetAttributeNodeNS: // DOM2 return getDOMNode(exec,element.getAttributeNodeNS(args[0].toString(exec).string(),args[1].toString(exec).string())); case DOMElement::SetAttributeNodeNS: // DOM2 return getDOMNode(exec,element.setAttributeNodeNS((new DOMNode(exec,KJS::toNode(args[0])))->toNode())); case DOMElement::GetElementsByTagNameNS: // DOM2 return getDOMNodeList(exec,element.getElementsByTagNameNS(args[0].toString(exec).string(),args[1].toString(exec).string())); case DOMElement::HasAttributeNS: // DOM2 return Boolean(element.hasAttributeNS(args[0].toString(exec).string(),args[1].toString(exec).string())); default: return Undefined(); }}// -------------------------------------------------------------------------/* Source for DOMDOMImplementationProtoTable. Use "make hashtables" to regenerate.@begin DOMDOMImplementationProtoTable 5 hasFeature DOMDOMImplementation::HasFeature DontDelete|Function 2# DOM2 createCSSStyleSheet DOMDOMImplementation::CreateCSSStyleSheet DontDelete|Function 2 createDocumentType DOMDOMImplementation::CreateDocumentType DontDelete|Function 3 createDocument DOMDOMImplementation::CreateDocument DontDelete|Function 3 createHTMLDocument DOMDOMImplementation::CreateHTMLDocument DontDelete|Function 1@end*/DEFINE_PROTOTYPE("DOMImplementation",DOMDOMImplementationProto)IMPLEMENT_PROTOFUNC(DOMDOMImplementationProtoFunc)IMPLEMENT_PROTOTYPE(DOMDOMImplementationProto,DOMDOMImplementationProtoFunc)const ClassInfo DOMDOMImplementation::info = { "DOMImplementation", 0, 0, 0 };DOMDOMImplementation::DOMDOMImplementation(ExecState *exec, const DOM::DOMImplementation &i) : DOMObject(DOMDOMImplementationProto::self(exec)), implementation(i) { }DOMDOMImplementation::~DOMDOMImplementation(){ ScriptInterpreter::forgetDOMObject(implementation.handle());}Value DOMDOMImplementationProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){ if (!thisObj.inherits(&KJS::DOMDOMImplementation::info)) { Object err = Error::create(exec,TypeError); exec->setException(err); return err; } DOM::DOMImplementation implementation = static_cast<DOMDOMImplementation *>( thisObj.imp() )->toImplementation(); switch(id) { case DOMDOMImplementation::HasFeature: return Boolean(implementation.hasFeature(args[0].toString(exec).string(),args[1].toString(exec).string())); case DOMDOMImplementation::CreateDocumentType: // DOM2 return getDOMNode(exec,implementation.createDocumentType(args[0].toString(exec).string(),args[1].toString(exec).string(),args[2].toString(exec).string())); case DOMDOMImplementation::CreateDocument: // DOM2 return getDOMNode(exec,implementation.createDocument(args[0].toString(exec).string(),args[1].toString(exec).string(),toNode(args[2]))); case DOMDOMImplementation::CreateCSSStyleSheet: // DOM2 return getDOMStyleSheet(exec,implementation.createCSSStyleSheet(args[0].toString(exec).string(),args[1].toString(exec).string())); case DOMDOMImplementation::CreateHTMLDocument: // DOM2-HTML return getDOMNode(exec, implementation.createHTMLDocument(args[0].toString(exec).string())); default: break; } return Undefined();}// -------------------------------------------------------------------------const ClassInfo DOMDocumentType::info = { "DocumentType", &DOMNode::info, &DOMDocumentTypeTable, 0 };/* Source for DOMDocumentTypeTable. Use "make hashtables" to regenerate.@begin DOMDocumentTypeTable 6 name DOMDocumentType::Name DontDelete|ReadOnly entities DOMDocumentType::Entities DontDelete|ReadOnly notations DOMDocumentType::Notations DontDelete|ReadOnly# DOM2 publicId DOMDocumentType::PublicId DontDelete|ReadOnly systemId DOMDocumentType::SystemId DontDelete|ReadOnly internalSubset DOMDocumentType::InternalSubset DontDelete|ReadOnly@end*/DOMDocumentType::DOMDocumentType(ExecState *exec, const DOM::DocumentType &dt) : DOMNode( /*### no proto yet*/exec, dt ) { }Value DOMDocumentType::tryGet(ExecState *exec, const Identifier &propertyName) const{ return DOMObjectLookupGetValue<DOMDocumentType, DOMNode>(exec, propertyName, &DOMDocumentTypeTable, this);}Value DOMDocumentType::getValueProperty(ExecState *exec, int token) const{ DOM::DocumentType type = static_cast<DOM::DocumentType>(node); switch (token) { case Name: return getStringOrNull(type.name()); case Entities: return getDOMNamedNodeMap(exec,type.entities()); case Notations: return getDOMNamedNodeMap(exec,type.notations()); case PublicId: // DOM2 return getStringOrNull(type.publicId()); case SystemId: // DOM2 return getStringOrNull(type.systemId()); case InternalSubset: // DOM2 return getStringOrNull(type.internalSubset()); default: kdWarning() << "DOMDocumentType::getValueProperty unhandled token " << token << endl; return Value(); }}// -------------------------------------------------------------------------/* Source for DOMNamedNodeMapProtoTable. Use "make hashtables" to regenerate.@begin DOMNamedNodeMapProtoTable 7 getNamedItem DOMNamedNodeMap::GetNamedItem DontDelete|Function 1 setNamedItem DOMNamedNodeMap::SetNamedItem DontDelete|Function 1 removeNamedItem DOMNamedNodeMap::RemoveNamedItem DontDelete|Function 1 item DOMNamedNodeMap::Item DontDelete|Function 1# DOM2 getNamedItemNS DOMNamedNodeMap::GetNamedItemNS DontDelete|Function 2 setNamedItemNS DOMNamedNodeMap::SetNamedItemNS DontDelete|Function 1 removeNamedItemNS DOMNamedNodeMap::RemoveNamedItemNS DontDelete|Function 2@end*/DEFINE_PROTOTYPE("NamedNodeMap", DOMNamedNodeMapProto)IMPLEMENT_PROTOFUNC(DOMNamedNodeMapProtoFunc)IMPLEMENT_PROTOTYPE(DOMNamedNodeMapProto,DOMNamedNodeMapProtoFunc)const ClassInfo DOMNamedNodeMap::info = { "NamedNodeMap", 0, 0, 0 };DOMNamedNodeMap::DOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap &m) : DOMObject(DOMNamedNodeMapProto::self(exec)), map(m) { }DOMNamedNodeMap::~DOMNamedNodeMap(){ ScriptInterpreter::forgetDOMObject(map.handle());}// We have to implement hasProperty since we don't use a hashtable for 'length'// ## this breaks "for (..in..)" though.bool DOMNamedNodeMap::hasProperty(ExecState *exec, const Identifier &p) const{ if (p == lengthPropertyName) return true; return DOMObject::hasProperty(exec, p);}Value DOMNamedNodeMap::tryGet(ExecState* exec, const Identifier &p) const{ if (p == lengthPropertyName) return Number(map.length()); // array index ? bool ok; long unsigned int idx = p.toULong(&ok); if (ok) return getDOMNode(exec,map.item(idx)); // Anything else (including functions, defined in the prototype) return DOMObject::tryGet(exec, p);}Value DOMNamedNodeMapProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){ if (!thisObj.inherits(&KJS::DOMNamedNodeMap::info)) { Object err = Error::create(exec,TypeError); exec->setException(err); return err; } DOM::NamedNodeMap map = static_cast<DOMNamedNodeMap *>(thisObj.imp())->toMap(); switch(id) { case DOMNamedNodeMap::GetNamedItem: return getDOMNode(exec, map.getNamedItem(args[0].toString(exec).string())); case DOMNamedNodeMap::SetNamedItem: return getDOMNode(exec, map.setNamedItem((new DOMNode(exec,KJS::toNode(args[0])))->toNode())); case DOMNamedNodeMap::RemoveNamedItem: return getDOMNode(exec, map.removeNamedItem(args[0].toString(exec).string())); case DOMNamedNodeMap::Item: return getDOMNode(exec, map.item(args[0].toInt32(exec))); case DOMNamedNodeMap::GetNamedItemNS: // DOM2 return getDOMNode(exec, map.getNamedItemNS(args[0].toString(exec).string(),args[1].toString(exec).string())); case DOMNamedNodeMap::SetNamedItemNS: // DOM2 return getDOMNode(exec, map.setNamedItemNS(toNode(args[0]))); case DOMNamedNodeMap::RemoveNamedItemNS: // DOM2 return getDOMNode(exec, map.removeNamedItemNS(args[0].toString(exec).string(),args[1].toString(exec).string())); default: break; } return Undefined();}// -------------------------------------------------------------------------const ClassInfo DOMProcessingInstruction::info = { "ProcessingInstruction", &DOMNode::info, &DOMProcessingInstructionTable, 0 };/* Source for DOMProcessingInstructionTable. Use "make hashtables" to regenerate.@begin DOMProcessingInstructionTable 3 target DOMProcessingInstruction::Target DontDelete|ReadOnly data DOMProcessingInstruction::Data DontDelete sheet DOMProcessingInstruction::Sheet DontDelete|ReadOnly@end*/Value DOMProcessingInstruction::tryGet(ExecState *exec, const Identifier &propertyName) const{ return DOMObjectLookupGetValue<DOMProcessingInstruction, DOMNode>(exec, propertyName, &DOMProcessingInstructionTable, this);}Value DOMProcessingInstruction::getValueProperty(ExecState *exec, int token) const{ switch (token) { case Target: return getStringOrNull(static_cast<DOM::ProcessingInstruction>(node).target()); case Data: return getStringOrNull(static_cast<DOM::ProcessingInstruction>(node).data()); case Sheet: return getDOMStyleSheet(exec,static_cast<DOM::ProcessingInstruction>(node).sheet()); default: kdWarning() << "DOMProcessingInstruction::getValueProperty unhandled token " << token << endl; return Value(); }}void DOMProcessingInstruction::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr){ // Not worth using the hashtable for this one ;) if (propertyName == "data") static_cast<DOM::ProcessingInstruction>(node).setData(value.toString(exec).string());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -