⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kjs_traversal.cpp

📁 khtml在gtk上的移植版本
💻 CPP
字号:
// -*- c-basic-offset: 2 -*-/* *  This file is part of the KDE libraries *  Copyright (C) 2001 Peter Kelly (pmk@post.com) * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Lesser General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Lesser General Public License for more details. * *  You should have received a copy of the GNU Lesser General Public *  License along with this library; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "kjs_traversal.h"#include "kjs_traversal.lut.h"#include "kjs_proxy.h"#include <dom/dom_node.h>#include <xml/dom_nodeimpl.h>#include <xml/dom_docimpl.h>#include <khtmlview.h>#include <kdebug.h>using namespace KJS;// -------------------------------------------------------------------------const ClassInfo DOMNodeIterator::info = { "NodeIterator", 0, &DOMNodeIteratorTable, 0 };/*@begin DOMNodeIteratorTable 5  root				DOMNodeIterator::Root			DontDelete|ReadOnly  whatToShow			DOMNodeIterator::WhatToShow		DontDelete|ReadOnly  filter			DOMNodeIterator::Filter			DontDelete|ReadOnly  expandEntityReferences	DOMNodeIterator::ExpandEntityReferences	DontDelete|ReadOnly  referenceNode	DOMNodeIterator::ReferenceNode	DontDelete|ReadOnly  pointerBeforeReferenceNode DOMNodeIterator::PointerBeforeReferenceNode	DontDelete|ReadOnly@end@begin DOMNodeIteratorProtoTable 3  nextNode	DOMNodeIterator::NextNode	DontDelete|Function 0  previousNode	DOMNodeIterator::PreviousNode	DontDelete|Function 0  detach	DOMNodeIterator::Detach		DontDelete|Function 0@end*/DEFINE_PROTOTYPE("DOMNodeIterator",DOMNodeIteratorProto)IMPLEMENT_PROTOFUNC(DOMNodeIteratorProtoFunc)IMPLEMENT_PROTOTYPE(DOMNodeIteratorProto,DOMNodeIteratorProtoFunc)DOMNodeIterator::DOMNodeIterator(ExecState *exec, DOM::NodeIterator ni)  : DOMObject(DOMNodeIteratorProto::self(exec)), nodeIterator(ni) {}DOMNodeIterator::~DOMNodeIterator(){  ScriptInterpreter::forgetDOMObject(nodeIterator.handle());}Value DOMNodeIterator::tryGet(ExecState *exec, const Identifier &p) const{  return DOMObjectLookupGetValue<DOMNodeIterator,DOMObject>(exec,p,&DOMNodeIteratorTable,this);}Value DOMNodeIterator::getValueProperty(ExecState *exec, int token) const{  DOM::NodeIterator ni(nodeIterator);  switch (token) {  case Root:    return getDOMNode(exec,ni.root());  case WhatToShow:    return Number(ni.whatToShow());  case Filter:    return getDOMNodeFilter(exec,ni.filter());  case ExpandEntityReferences:    return Boolean(ni.expandEntityReferences());  case ReferenceNode:    return getDOMNode(exec,ni.referenceNode());  case PointerBeforeReferenceNode:    return Boolean(ni.pointerBeforeReferenceNode()); default:   kdWarning() << "Unhandled token in DOMNodeIterator::getValueProperty : " << token << endl;   return Value();  }}Value DOMNodeIteratorProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &){  if (!thisObj.inherits(&KJS::DOMNodeIterator::info)) {    Object err = Error::create(exec,TypeError);    exec->setException(err);    return err;  }  DOM::NodeIterator nodeIterator = static_cast<DOMNodeIterator *>(thisObj.imp())->toNodeIterator();  switch (id) {  case DOMNodeIterator::PreviousNode:    return getDOMNode(exec,nodeIterator.previousNode());  case DOMNodeIterator::NextNode:    return getDOMNode(exec,nodeIterator.nextNode());  case DOMNodeIterator::Detach:    nodeIterator.detach();    return Undefined();  }  return Undefined();}Value KJS::getDOMNodeIterator(ExecState *exec, DOM::NodeIterator ni){  return cacheDOMObject<DOM::NodeIterator, DOMNodeIterator>(exec, ni);}// -------------------------------------------------------------------------const ClassInfo NodeFilterConstructor::info = { "NodeFilterConstructor", 0, &NodeFilterConstructorTable, 0 };/*@begin NodeFilterConstructorTable 17  FILTER_ACCEPT		DOM::NodeFilter::FILTER_ACCEPT	DontDelete|ReadOnly  FILTER_REJECT		DOM::NodeFilter::FILTER_REJECT	DontDelete|ReadOnly  FILTER_SKIP		DOM::NodeFilter::FILTER_SKIP	DontDelete|ReadOnly  SHOW_ALL		DOM::NodeFilter::SHOW_ALL	DontDelete|ReadOnly  SHOW_ELEMENT		DOM::NodeFilter::SHOW_ELEMENT	DontDelete|ReadOnly  SHOW_ATTRIBUTE	DOM::NodeFilter::SHOW_ATTRIBUTE	DontDelete|ReadOnly  SHOW_TEXT		DOM::NodeFilter::SHOW_TEXT	DontDelete|ReadOnly  SHOW_CDATA_SECTION	DOM::NodeFilter::SHOW_CDATA_SECTION	DontDelete|ReadOnly  SHOW_ENTITY_REFERENCE	DOM::NodeFilter::SHOW_ENTITY_REFERENCE	DontDelete|ReadOnly  SHOW_ENTITY		DOM::NodeFilter::SHOW_ENTITY	DontDelete|ReadOnly  SHOW_PROCESSING_INSTRUCTION	DOM::NodeFilter::SHOW_PROCESSING_INSTRUCTION	DontDelete|ReadOnly  SHOW_COMMENT		DOM::NodeFilter::SHOW_COMMENT	DontDelete|ReadOnly  SHOW_DOCUMENT		DOM::NodeFilter::SHOW_DOCUMENT	DontDelete|ReadOnly  SHOW_DOCUMENT_TYPE	DOM::NodeFilter::SHOW_DOCUMENT_TYPE	DontDelete|ReadOnly  SHOW_DOCUMENT_FRAGMENT	DOM::NodeFilter::SHOW_DOCUMENT_FRAGMENT	DontDelete|ReadOnly  SHOW_NOTATION		DOM::NodeFilter::SHOW_NOTATION	DontDelete|ReadOnly@end*/Value NodeFilterConstructor::tryGet(ExecState *exec, const Identifier &p) const{  return DOMObjectLookupGetValue<NodeFilterConstructor,DOMObject>(exec,p,&NodeFilterConstructorTable,this);}Value NodeFilterConstructor::getValueProperty(ExecState *, int token) const{  // We use the token as the value to return directly  return Number(token);}Value KJS::getNodeFilterConstructor(ExecState *exec){  return cacheGlobalObject<NodeFilterConstructor>(exec, "[[nodeFilter.constructor]]");}// -------------------------------------------------------------------------const ClassInfo DOMNodeFilter::info = { "NodeFilter", 0, 0, 0 };/*@begin DOMNodeFilterProtoTable 1  acceptNode	DOMNodeFilter::AcceptNode	DontDelete|Function 0@end*/DEFINE_PROTOTYPE("DOMNodeFilter",DOMNodeFilterProto)IMPLEMENT_PROTOFUNC(DOMNodeFilterProtoFunc)IMPLEMENT_PROTOTYPE(DOMNodeFilterProto,DOMNodeFilterProtoFunc)DOMNodeFilter::DOMNodeFilter(ExecState *exec, DOM::NodeFilter nf)  : DOMObject(DOMNodeFilterProto::self(exec)), nodeFilter(nf) {}DOMNodeFilter::~DOMNodeFilter(){  ScriptInterpreter::forgetDOMObject(nodeFilter.handle());}Value DOMNodeFilterProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args){  if (!thisObj.inherits(&KJS::DOMNodeFilter::info)) {    Object err = Error::create(exec,TypeError);    exec->setException(err);    return err;  }  DOM::NodeFilter nodeFilter = static_cast<DOMNodeFilter *>(thisObj.imp())->toNodeFilter();  switch (id) {    case DOMNodeFilter::AcceptNode:      return Number(nodeFilter.acceptNode(toNode(args[0])));  }  return Undefined();}Value KJS::getDOMNodeFilter(ExecState *exec, DOM::NodeFilter nf){    return cacheDOMObject<DOM::NodeFilter, DOMNodeFilter>(exec, nf);}// -------------------------------------------------------------------------const ClassInfo DOMTreeWalker::info = { "TreeWalker", 0, &DOMTreeWalkerTable, 0 };/*@begin DOMTreeWalkerTable 5  root			DOMTreeWalker::Root		DontDelete|ReadOnly  whatToShow		DOMTreeWalker::WhatToShow	DontDelete|ReadOnly  filter		DOMTreeWalker::Filter		DontDelete|ReadOnly  expandEntityReferences DOMTreeWalker::ExpandEntityReferences	DontDelete|ReadOnly  currentNode		DOMTreeWalker::CurrentNode	DontDelete@end@begin DOMTreeWalkerProtoTable 7  parentNode	DOMTreeWalker::ParentNode	DontDelete|Function 0  firstChild	DOMTreeWalker::FirstChild	DontDelete|Function 0  lastChild	DOMTreeWalker::LastChild	DontDelete|Function 0  previousSibling DOMTreeWalker::PreviousSibling	DontDelete|Function 0  nextSibling	DOMTreeWalker::NextSibling	DontDelete|Function 0  previousNode	DOMTreeWalker::PreviousNode	DontDelete|Function 0  nextNode	DOMTreeWalker::NextNode		DontDelete|Function 0@end*/DEFINE_PROTOTYPE("DOMTreeWalker",DOMTreeWalkerProto)IMPLEMENT_PROTOFUNC(DOMTreeWalkerProtoFunc)IMPLEMENT_PROTOTYPE(DOMTreeWalkerProto,DOMTreeWalkerProtoFunc)DOMTreeWalker::DOMTreeWalker(ExecState *exec, DOM::TreeWalker tw)  : DOMObject(DOMTreeWalkerProto::self(exec)), treeWalker(tw) {}DOMTreeWalker::~DOMTreeWalker(){  ScriptInterpreter::forgetDOMObject(treeWalker.handle());}Value DOMTreeWalker::tryGet(ExecState *exec, const Identifier &p) const{  return DOMObjectLookupGetValue<DOMTreeWalker,DOMObject>(exec,p,&DOMTreeWalkerTable,this);}Value DOMTreeWalker::getValueProperty(ExecState *exec, int token) const{  DOM::TreeWalker tw(treeWalker);  switch (token) {  case Root:    return getDOMNode(exec,tw.root());  case WhatToShow:    return Number(tw.whatToShow());  case Filter:    return getDOMNodeFilter(exec,tw.filter());  case ExpandEntityReferences:    return Boolean(tw.expandEntityReferences());  case CurrentNode:    return getDOMNode(exec,tw.currentNode());  default:    kdWarning() << "Unhandled token in DOMTreeWalker::getValueProperty : " << token << endl;    return Value();  }}void DOMTreeWalker::tryPut(ExecState *exec, const Identifier &propertyName,                           const Value& value, int attr){  if (propertyName == "currentNode") {    treeWalker.setCurrentNode(toNode(value));  }  else    ObjectImp::put(exec, propertyName, value, attr);}Value DOMTreeWalkerProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &){  if (!thisObj.inherits(&KJS::DOMTreeWalker::info)) {    Object err = Error::create(exec,TypeError);    exec->setException(err);    return err;  }  DOM::TreeWalker treeWalker = static_cast<DOMTreeWalker *>(thisObj.imp())->toTreeWalker();  switch (id) {    case DOMTreeWalker::ParentNode:      return getDOMNode(exec,treeWalker.parentNode());    case DOMTreeWalker::FirstChild:      return getDOMNode(exec,treeWalker.firstChild());    case DOMTreeWalker::LastChild:      return getDOMNode(exec,treeWalker.lastChild());    case DOMTreeWalker::PreviousSibling:      return getDOMNode(exec,treeWalker.previousSibling());    case DOMTreeWalker::NextSibling:      return getDOMNode(exec,treeWalker.nextSibling());    case DOMTreeWalker::PreviousNode:      return getDOMNode(exec,treeWalker.previousNode());    case DOMTreeWalker::NextNode:      return getDOMNode(exec,treeWalker.nextNode());  }  return Undefined();}Value KJS::getDOMTreeWalker(ExecState *exec, DOM::TreeWalker tw){  return cacheDOMObject<DOM::TreeWalker, DOMTreeWalker>(exec, tw);}DOM::NodeFilter KJS::toNodeFilter(const Value& val){  Object obj = Object::dynamicCast(val);  if (obj.isNull() || !obj.inherits(&DOMNodeFilter::info))    return DOM::NodeFilter();  const DOMNodeFilter *dobj = static_cast<const DOMNodeFilter*>(obj.imp());  return dobj->toNodeFilter();}// -------------------------------------------------------------------------JSNodeFilterCondition::JSNodeFilterCondition(Object & _filter) : filter( _filter ){}short JSNodeFilterCondition::acceptNode(const DOM::Node &node) const{    KHTMLPart *part = static_cast<DOM::DocumentImpl *>(node.handle()->docPtr()->document())->part();    KJSProxy *proxy = KJSProxy::proxy(part);    if (proxy && filter.implementsCall()) {        ExecState *exec = proxy->interpreter()->globalExec();        List args;        args.append(getDOMNode(exec,node));        Object obj = const_cast<ProtectedObject &>(filter);        Value result = obj.call(exec, obj, args);        return result.toInt32(exec);    }    return DOM::NodeFilter::FILTER_REJECT;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -