00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kjs_range.h"
00023 #include "kjs_range.lut.h"
00024 #include <kdebug.h>
00025
00026 using namespace KJS;
00027
00028
00029
00030 const ClassInfo DOMRange::info = { "Range", 0, &DOMRangeTable, 0 };
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 DEFINE_PROTOTYPE("DOMRange",DOMRangeProto)
00063 IMPLEMENT_PROTOFUNC_DOM(DOMRangeProtoFunc)
00064 IMPLEMENT_PROTOTYPE(DOMRangeProto,DOMRangeProtoFunc)
00065
00066 DOMRange::DOMRange(ExecState *exec, DOM::Range r)
00067 : DOMObject(DOMRangeProto::self(exec)), range(r) {}
00068
00069 DOMRange::~DOMRange()
00070 {
00071 ScriptInterpreter::forgetDOMObject(range.handle());
00072 }
00073
00074 Value DOMRange::tryGet(ExecState *exec, const Identifier &p) const
00075 {
00076 return DOMObjectLookupGetValue<DOMRange,DOMObject>(exec,p,&DOMRangeTable,this);
00077 }
00078
00079 Value DOMRange::getValueProperty(ExecState *exec, int token) const
00080 {
00081 switch (token) {
00082 case StartContainer:
00083 return getDOMNode(exec,range.startContainer());
00084 case StartOffset:
00085 return Number(range.startOffset());
00086 case EndContainer:
00087 return getDOMNode(exec,range.endContainer());
00088 case EndOffset:
00089 return Number(range.endOffset());
00090 case Collapsed:
00091 return Boolean(range.collapsed());
00092 case CommonAncestorContainer: {
00093 DOM::Range range2 = range;
00094 return getDOMNode(exec,range2.commonAncestorContainer());
00095 }
00096 default:
00097 kdDebug(6070) << "WARNING: Unhandled token in DOMRange::getValueProperty : " << token << endl;
00098 return Value();
00099 }
00100 }
00101
00102 Value DOMRangeProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args)
00103 {
00104 KJS_CHECK_THIS( KJS::DOMRange, thisObj );
00105 DOM::Range range = static_cast<DOMRange *>(thisObj.imp())->toRange();
00106 Value result;
00107
00108 switch (id) {
00109 case DOMRange::SetStart:
00110 range.setStart(toNode(args[0]),args[1].toInteger(exec));
00111 result = Undefined();
00112 break;
00113 case DOMRange::SetEnd:
00114 range.setEnd(toNode(args[0]),args[1].toInteger(exec));
00115 result = Undefined();
00116 break;
00117 case DOMRange::SetStartBefore:
00118 range.setStartBefore(toNode(args[0]));
00119 result = Undefined();
00120 break;
00121 case DOMRange::SetStartAfter:
00122 range.setStartAfter(toNode(args[0]));
00123 result = Undefined();
00124 break;
00125 case DOMRange::SetEndBefore:
00126 range.setEndBefore(toNode(args[0]));
00127 result = Undefined();
00128 break;
00129 case DOMRange::SetEndAfter:
00130 range.setEndAfter(toNode(args[0]));
00131 result = Undefined();
00132 break;
00133 case DOMRange::Collapse:
00134 range.collapse(args[0].toBoolean(exec));
00135 result = Undefined();
00136 break;
00137 case DOMRange::SelectNode:
00138 range.selectNode(toNode(args[0]));
00139 result = Undefined();
00140 break;
00141 case DOMRange::SelectNodeContents:
00142 range.selectNodeContents(toNode(args[0]));
00143 result = Undefined();
00144 break;
00145 case DOMRange::CompareBoundaryPoints:
00146 result = Number(range.compareBoundaryPoints(static_cast<DOM::Range::CompareHow>(args[0].toInteger(exec)),toRange(args[1])));
00147 break;
00148 case DOMRange::DeleteContents:
00149 range.deleteContents();
00150 result = Undefined();
00151 break;
00152 case DOMRange::ExtractContents:
00153 result = getDOMNode(exec,range.extractContents());
00154 break;
00155 case DOMRange::CloneContents:
00156 result = getDOMNode(exec,range.cloneContents());
00157 break;
00158 case DOMRange::InsertNode:
00159 range.insertNode(toNode(args[0]));
00160 result = Undefined();
00161 break;
00162 case DOMRange::SurroundContents:
00163 range.surroundContents(toNode(args[0]));
00164 result = Undefined();
00165 break;
00166 case DOMRange::CloneRange:
00167 result = getDOMRange(exec,range.cloneRange());
00168 break;
00169 case DOMRange::ToString:
00170 result = String(range.toString());
00171 break;
00172 case DOMRange::Detach:
00173 range.detach();
00174 result = Undefined();
00175 break;
00176 case DOMRange::CreateContextualFragment:
00177 Value value = args[0];
00178 DOM::DOMString str = value.isA(NullType) ? DOM::DOMString() : value.toString(exec).string();
00179 result = getDOMNode(exec, range.createContextualFragment(str));
00180 break;
00181 };
00182
00183 return result;
00184 }
00185
00186 Value KJS::getDOMRange(ExecState *exec, DOM::Range r)
00187 {
00188 return cacheDOMObject<DOM::Range, KJS::DOMRange>(exec, r);
00189 }
00190
00191
00192
00193 const ClassInfo RangeConstructor::info = { "RangeConstructor", 0, &RangeConstructorTable, 0 };
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 RangeConstructor::RangeConstructor(ExecState *exec)
00204 : DOMObject(exec->interpreter()->builtinObjectPrototype()) { }
00205
00206 Value RangeConstructor::tryGet(ExecState *exec, const Identifier &p) const
00207 {
00208 return DOMObjectLookupGetValue<RangeConstructor,DOMObject>(exec,p,&RangeConstructorTable,this);
00209 }
00210
00211 Value RangeConstructor::getValueProperty(ExecState *, int token) const
00212 {
00213 return Number(token);
00214 }
00215
00216 Value KJS::getRangeConstructor(ExecState *exec)
00217 {
00218 return cacheGlobalObject<RangeConstructor>(exec, "[[range.constructor]]");
00219 }
00220
00221
00222 DOM::Range KJS::toRange(const Value& val)
00223 {
00224 Object obj = Object::dynamicCast(val);
00225 if (!obj.isValid() || !obj.inherits(&DOMRange::info))
00226 return DOM::Range();
00227
00228 const DOMRange *dobj = static_cast<const DOMRange*>(obj.imp());
00229 return dobj->toRange();
00230 }