📄 kjs_binding.cpp
字号:
#ifdef KJS_VERBOSE
kdDebug(6070) << "ScriptInterpreter::ScriptInterpreter " << this << " for part=" << m_part << endl;
#endif
}
ScriptInterpreter::~ScriptInterpreter()
{
#ifdef KJS_VERBOSE
kdDebug(6070) << "ScriptInterpreter::~ScriptInterpreter " << this << " for part=" << m_part << endl;
#endif
}
void ScriptInterpreter::forgetDOMObject( void* objectHandle )
{
deleteDOMObject( objectHandle );
}
DOMObject* ScriptInterpreter::getDOMObjectForDocument( DOM::DocumentImpl* documentHandle, void *objectHandle )
{
QPtrDict<DOMObject> *documentDict = (QPtrDict<DOMObject> *)domObjectsPerDocument()[documentHandle];
if (documentDict) {
return (*documentDict)[objectHandle];
}
return NULL;
}
void ScriptInterpreter::putDOMObjectForDocument( DOM::DocumentImpl* documentHandle, void *objectHandle, DOMObject *obj )
{
QPtrDict<DOMObject> *documentDict = (QPtrDict<DOMObject> *)domObjectsPerDocument()[documentHandle];
if (!documentDict) {
documentDict = new QPtrDict<DOMObject>();
domObjectsPerDocument().insert(documentHandle, documentDict);
}
documentDict->insert( objectHandle, obj );
}
bool ScriptInterpreter::deleteDOMObjectsForDocument( DOM::DocumentImpl* documentHandle )
{
return domObjectsPerDocument().remove( documentHandle );
}
void ScriptInterpreter::mark()
{
QPtrDictIterator<QPtrDict<DOMObject> > dictIterator(domObjectsPerDocument());
QPtrDict<DOMObject> *objectDict;
while ((objectDict = dictIterator.current())) {
QPtrDictIterator<DOMObject> objectIterator(*objectDict);
DOMObject *obj;
while ((obj = objectIterator.current())) {
if (!obj->marked()) {
obj->mark();
}
++objectIterator;
}
++dictIterator;
}
}
void ScriptInterpreter::forgetDOMObjectsForDocument( DOM::DocumentImpl* documentHandle )
{
deleteDOMObjectsForDocument( documentHandle );
}
void ScriptInterpreter::updateDOMObjectDocument(void *objectHandle, DOM::DocumentImpl *oldDoc, DOM::DocumentImpl *newDoc)
{
DOMObject* cachedObject = getDOMObjectForDocument(oldDoc, objectHandle);
if (cachedObject) {
putDOMObjectForDocument(newDoc, objectHandle, cachedObject);
}
}
bool ScriptInterpreter::wasRunByUserGesture() const
{
if ( m_evt )
{
int id = m_evt->handle()->id();
bool eventOk = ( // mouse events
id == DOM::EventImpl::CLICK_EVENT || id == DOM::EventImpl::MOUSEDOWN_EVENT ||
id == DOM::EventImpl::MOUSEUP_EVENT || id == DOM::EventImpl::KHTML_DBLCLICK_EVENT ||
id == DOM::EventImpl::KHTML_CLICK_EVENT ||
// keyboard events
id == DOM::EventImpl::KEYDOWN_EVENT || id == DOM::EventImpl::KEYPRESS_EVENT ||
id == DOM::EventImpl::KEYUP_EVENT ||
// other accepted events
id == DOM::EventImpl::SELECT_EVENT || id == DOM::EventImpl::CHANGE_EVENT ||
id == DOM::EventImpl::FOCUS_EVENT || id == DOM::EventImpl::BLUR_EVENT ||
id == DOM::EventImpl::SUBMIT_EVENT );
kdDebug(6070) << "Window.open, smart policy: id=" << id << " eventOk=" << eventOk << endl;
if (eventOk)
return true;
} else // no event
{
if ( m_inlineCode && !m_timerCallback )
{
// This is the <a href="javascript:window.open('...')> case -> we let it through
return true;
kdDebug(6070) << "Window.open, smart policy, no event, inline code -> ok" << endl;
}
else // This is the <script>window.open(...)</script> case or a timer callback -> block it
kdDebug(6070) << "Window.open, smart policy, no event, <script> tag -> refused" << endl;
}
return false;
}
#if APPLE_CHANGES && !NOKIA_CHANGES
bool ScriptInterpreter::isGlobalObject(const Value &v)
{
if (v.type() == ObjectType) {
Object o = v.toObject (globalExec());
if (o.classInfo() == &Window::info)
return true;
}
return false;
}
bool ScriptInterpreter::isSafeScript (const Interpreter *_target)
{
const KJS::ScriptInterpreter *target = static_cast<const ScriptInterpreter *>(_target);
return KJS::Window::isSafeScript (this, target);
}
Interpreter *ScriptInterpreter::interpreterForGlobalObject (const ValueImp *imp)
{
const KJS::Window *win = static_cast<const KJS::Window *>(imp);
return win->interpreter();
}
void *ScriptInterpreter::createLanguageInstanceForValue (ExecState *exec, Bindings::Instance::BindingLanguage language, const Object &value, const Bindings::RootObject *origin, const Bindings::RootObject *current)
{
void *result = 0;
if (language == Bindings::Instance::ObjectiveCLanguage)
result = createObjcInstanceForValue (exec, value, origin, current);
if (!result)
result = Interpreter::createLanguageInstanceForValue (exec, language, value, origin, current);
return result;
}
#endif
//////
UString::UString(const QString &d)
{
unsigned int len = d.length();
rep = UString::Rep::createCopying((UChar*)d.unicode(), len);
}
UString::UString(const DOMString &d)
{
if (d.isNull()) {
#if NOKIA_CHANGES
attachNull();
#else
attach(&Rep::null);
#endif
return;
}
unsigned int len = d.length();
rep = UString::Rep::createCopying((UChar*)d.unicode(), len);
}
DOMString UString::string() const
{
if (isNull())
return DOMString();
if (isEmpty())
return DOMString("");
return DOMString((QChar*) data(), size());
}
QString UString::qstring() const
{
if (isNull())
return QString();
if (isEmpty())
return QString("");
return QString((QChar*) data(), size());
}
QConstString UString::qconststring() const
{
return QConstString((QChar*) data(), size());
}
DOMString Identifier::string() const
{
if (isNull())
return DOMString();
if (isEmpty())
return DOMString("");
return DOMString((QChar*) data(), size());
}
QString Identifier::qstring() const
{
if (isNull())
return QString();
if (isEmpty())
return QString("");
return QString((QChar*) data(), size());
}
DOM::Node KJS::toNode(const Value& val)
{
Object obj = Object::dynamicCast(val);
if (obj.isNull() || !obj.inherits(&DOMNode::info))
return DOM::Node();
const DOMNode *dobj = static_cast<const DOMNode*>(obj.imp());
return dobj->toNode();
}
Value KJS::getStringOrNull(DOMString s)
{
if (s.isNull())
return Null();
else
return String(s);
}
QVariant KJS::ValueToVariant(ExecState* exec, const Value &val) {
QVariant res;
switch (val.type()) {
case BooleanType:
res = QVariant(val.toBoolean(exec), 0);
break;
case NumberType:
res = QVariant(val.toNumber(exec));
break;
case StringType:
res = QVariant(val.toString(exec).qstring());
break;
default:
// everything else will be 'invalid'
break;
}
return res;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -