📄 kjs_dom.cpp
字号:
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());
else
DOMNode::tryPut(exec, propertyName,value,attr);
}
// -------------------------------------------------------------------------
const ClassInfo DOMNotation::info = { "Notation", &DOMNode::info, &DOMNotationTable, 0 };
/* Source for DOMNotationTable. Use "make hashtables" to regenerate.
@begin DOMNotationTable 2
publicId DOMNotation::PublicId DontDelete|ReadOnly
systemId DOMNotation::SystemId DontDelete|ReadOnly
@end
*/
Value DOMNotation::tryGet(ExecState *exec, const Identifier &propertyName) const
{
return DOMObjectLookupGetValue<DOMNotation, DOMNode>(exec, propertyName, &DOMNotationTable, this);
}
Value DOMNotation::getValueProperty(ExecState *, int token) const
{
switch (token) {
case PublicId:
return getStringOrNull(static_cast<DOM::Notation>(node).publicId());
case SystemId:
return getStringOrNull(static_cast<DOM::Notation>(node).systemId());
default:
kdWarning() << "DOMNotation::getValueProperty unhandled token " << token << endl;
return Value();
}
}
// -------------------------------------------------------------------------
const ClassInfo DOMEntity::info = { "Entity", &DOMNode::info, 0, 0 };
/* Source for DOMEntityTable. Use "make hashtables" to regenerate.
@begin DOMEntityTable 2
publicId DOMEntity::PublicId DontDelete|ReadOnly
systemId DOMEntity::SystemId DontDelete|ReadOnly
notationName DOMEntity::NotationName DontDelete|ReadOnly
@end
*/
Value DOMEntity::tryGet(ExecState *exec, const Identifier &propertyName) const
{
return DOMObjectLookupGetValue<DOMEntity, DOMNode>(exec, propertyName, &DOMEntityTable, this);
}
Value DOMEntity::getValueProperty(ExecState *, int token) const
{
switch (token) {
case PublicId:
return getStringOrNull(static_cast<DOM::Entity>(node).publicId());
case SystemId:
return getStringOrNull(static_cast<DOM::Entity>(node).systemId());
case NotationName:
return getStringOrNull(static_cast<DOM::Entity>(node).notationName());
default:
kdWarning() << "DOMEntity::getValueProperty unhandled token " << token << endl;
return Value();
}
}
// -------------------------------------------------------------------------
Value KJS::getDOMDocumentNode(ExecState *exec, const DOM::Document &n)
{
DOMDocument *ret = 0;
ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter());
if ((ret = static_cast<DOMDocument *>(interp->getDOMObject(n.handle()))))
return Value(ret);
if (n.isHTMLDocument())
ret = new HTMLDocument(exec, static_cast<DOM::HTMLDocument>(n));
else
ret = new DOMDocument(exec, n);
Value val(ret);
// Make sure the document is kept around by the window object, and works right with the
// back/forward cache.
if (n.view()) {
static Identifier documentIdentifier("document");
Window::retrieveWindow(n.view()->part())->putDirect(documentIdentifier, ret, DontDelete|ReadOnly);
}
interp->putDOMObject(n.handle(), ret);
return val;
}
bool KJS::checkNodeSecurity(ExecState *exec, const DOM::Node& n)
{
if (!n.handle())
return false;
// Check to see if the currently executing interpreter is allowed to access the specified node
KHTMLPart *part = n.handle()->getDocument()->part();
Window* win = part ? Window::retrieveWindow(part) : 0L;
if ( !win || !win->isSafeScript(exec) )
return false;
return true;
}
Value KJS::getDOMNode(ExecState *exec, const DOM::Node &n)
{
DOMObject *ret = 0;
if (n.isNull())
return Null();
ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter());
DOM::NodeImpl *doc = n.ownerDocument().handle();
if ((ret = interp->getDOMObjectForDocument(static_cast<DOM::DocumentImpl *>(doc), n.handle())))
return Value(ret);
switch (n.nodeType()) {
case DOM::Node::ELEMENT_NODE:
if (static_cast<DOM::Element>(n).isHTMLElement())
ret = new HTMLElement(exec, static_cast<DOM::HTMLElement>(n));
else
ret = new DOMElement(exec, static_cast<DOM::Element>(n));
break;
case DOM::Node::ATTRIBUTE_NODE:
ret = new DOMAttr(exec, static_cast<DOM::Attr>(n));
break;
case DOM::Node::TEXT_NODE:
case DOM::Node::CDATA_SECTION_NODE:
ret = new DOMText(exec, static_cast<DOM::Text>(n));
break;
case DOM::Node::ENTITY_REFERENCE_NODE:
ret = new DOMNode(exec, n);
break;
case DOM::Node::ENTITY_NODE:
ret = new DOMEntity(exec, static_cast<DOM::Entity>(n));
break;
case DOM::Node::PROCESSING_INSTRUCTION_NODE:
ret = new DOMProcessingInstruction(exec, static_cast<DOM::ProcessingInstruction>(n));
break;
case DOM::Node::COMMENT_NODE:
ret = new DOMCharacterData(exec, static_cast<DOM::CharacterData>(n));
break;
case DOM::Node::DOCUMENT_NODE:
// we don't want to cache the document itself in the per-document dictionary
return getDOMDocumentNode(exec, static_cast<DOM::Document>(n));
case DOM::Node::DOCUMENT_TYPE_NODE:
ret = new DOMDocumentType(exec, static_cast<DOM::DocumentType>(n));
break;
case DOM::Node::DOCUMENT_FRAGMENT_NODE:
ret = new DOMNode(exec, n);
break;
case DOM::Node::NOTATION_NODE:
ret = new DOMNotation(exec, static_cast<DOM::Notation>(n));
break;
default:
ret = new DOMNode(exec, n);
}
interp->putDOMObjectForDocument(static_cast<DOM::DocumentImpl *>(doc), n.handle(), ret);
return Value(ret);
}
Value KJS::getDOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap &m)
{
return Value(cacheDOMObject<DOM::NamedNodeMap, KJS::DOMNamedNodeMap>(exec, m));
}
Value KJS::getRuntimeObject(ExecState *exec, const DOM::Node &node)
{
#if !NOKIA_CHANGES
DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node);
if (!node.isNull()) {
if (node.handle()->id() == ID_APPLET) {
DOM::HTMLAppletElementImpl *appletElement = static_cast<DOM::HTMLAppletElementImpl *>(element.handle());
if (appletElement->getAppletInstance()) {
// The instance is owned by the applet element.
RuntimeObjectImp *appletImp = new RuntimeObjectImp(appletElement->getAppletInstance(), false);
return Value(appletImp);
}
}
else if (node.handle()->id() == ID_EMBED) {
DOM::HTMLEmbedElementImpl *embedElement = static_cast<DOM::HTMLEmbedElementImpl *>(element.handle());
if (embedElement->getEmbedInstance()) {
RuntimeObjectImp *runtimeImp = new RuntimeObjectImp(embedElement->getEmbedInstance(), false);
return Value(runtimeImp);
}
}
else if (node.handle()->id() == ID_OBJECT) {
DOM::HTMLObjectElementImpl *objectElement = static_cast<DOM::HTMLObjectElementImpl *>(element.handle());
if (objectElement->getObjectInstance()) {
RuntimeObjectImp *runtimeImp = new RuntimeObjectImp(objectElement->getObjectInstance(), false);
return Value(runtimeImp);
}
}
}
#endif
// If we don't have a runtime object return the a Value that reports isNull() == true.
return Value();
}
Value KJS::getDOMNodeList(ExecState *exec, const DOM::NodeList &l)
{
return Value(cacheDOMObject<DOM::NodeList, KJS::DOMNodeList>(exec, l));
}
Value KJS::getDOMDOMImplementation(ExecState *exec, const DOM::DOMImplementation &i)
{
return Value(cacheDOMObject<DOM::DOMImplementation, KJS::DOMDOMImplementation>(exec, i));
}
// -------------------------------------------------------------------------
const ClassInfo NodeConstructor::info = { "NodeConstructor", 0, &NodeConstructorTable, 0 };
/* Source for NodeConstructorTable. Use "make hashtables" to regenerate.
@begin NodeConstructorTable 11
ELEMENT_NODE DOM::Node::ELEMENT_NODE DontDelete|ReadOnly
ATTRIBUTE_NODE DOM::Node::ATTRIBUTE_NODE DontDelete|ReadOnly
TEXT_NODE DOM::Node::TEXT_NODE DontDelete|ReadOnly
CDATA_SECTION_NODE DOM::Node::CDATA_SECTION_NODE DontDelete|ReadOnly
ENTITY_REFERENCE_NODE DOM::Node::ENTITY_REFERENCE_NODE DontDelete|ReadOnly
ENTITY_NODE DOM::Node::ENTITY_NODE DontDelete|ReadOnly
PROCESSING_INSTRUCTION_NODE DOM::Node::PROCESSING_INSTRUCTION_NODE DontDelete|ReadOnly
COMMENT_NODE DOM::Node::COMMENT_NODE DontDelete|ReadOnly
DOCUMENT_NODE DOM::Node::DOCUMENT_NODE DontDelete|ReadOnly
DOCUMENT_TYPE_NODE DOM::Node::DOCUMENT_TYPE_NODE DontDelete|ReadOnly
DOCUMENT_FRAGMENT_NODE DOM::Node::DOCUMENT_FRAGMENT_NODE DontDelete|ReadOnly
NOTATION_NODE DOM::Node::NOTATION_NODE DontDelete|ReadOnly
@end
*/
Value NodeConstructor::tryGet(ExecState *exec, const Identifier &propertyName) const
{
return DOMObjectLookupGetValue<NodeConstructor, DOMObject>(exec, propertyName, &NodeConstructorTable, this);
}
Value NodeConstructor::getValueProperty(ExecState *, int token) const
{
// We use the token as the value to return directly
return Number((unsigned int)token);
#if 0
switch (token) {
case ELEMENT_NODE:
return Number((unsigned int)DOM::Node::ELEMENT_NODE);
case ATTRIBUTE_NODE:
return Number((unsigned int)DOM::Node::ATTRIBUTE_NODE);
case TEXT_NODE:
return Number((unsigned int)DOM::Node::TEXT_NODE);
case CDATA_SECTION_NODE:
return Number((unsigned int)DOM::Node::CDATA_SECTION_NODE);
case ENTITY_REFERENCE_NODE:
return Number((unsigned int)DOM::Node::ENTITY_REFERENCE_NODE);
case ENTITY_NODE:
return Number((unsigned int)DOM::Node::ENTITY_NODE);
case PROCESSING_INSTRUCTION_NODE:
return Number((unsigned int)DOM::Node::PROCESSING_INSTRUCTION_NODE);
case COMMENT_NODE:
return Number((unsigned int)DOM::Node::COMMENT_NODE);
case DOCUMENT_NODE:
return Number((unsigned int)DOM::Node::DOCUMENT_NODE);
case DOCUMENT_TYPE_NODE:
return Number((unsigned int)DOM::Node::DOCUMENT_TYPE_NODE);
case DOCUMENT_FRAGMENT_NODE:
return Number((unsigned int)DOM::Node::DOCUMENT_FRAGMENT_NODE);
case NOTATION_NODE:
return Number((unsigned int)DOM::Node::NOTATION_NODE);
default:
kdWarning() << "NodeConstructor::getValueProperty unhandled token " << token << endl;
return Value();
}
#endif
}
Object KJS::getNodeConstructor(ExecState *exec)
{
return Object(cacheGlobalObject<NodeConstructor>(exec, "[[node.constructor]]"));
}
// -------------------------------------------------------------------------
const ClassInfo DOMExceptionConstructor::info = { "DOMExceptionConstructor", 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -