diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 5546597bf634841761e4c87be51ff43365941880..2f1d53347677cb7cac84a928a8124d3d39259ec9 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1128,8 +1128,13 @@ Function::~Function() { } -void Function::addArgument(const Value *argument) +void Function::addArgument(const Value *argument, const QString &name) { + if (!name.isEmpty()) { + while (_argumentNames.size() < _arguments.size()) + _argumentNames.push_back(QString()); + _argumentNames.push_back(name); + } _arguments.push_back(argument); } @@ -1153,9 +1158,19 @@ const Value *Function::argument(int index) const return _arguments.at(index); } -const Value *Function::invoke(const Activation *activation) const +QString Function::argumentName(int index) const +{ + if (index < _argumentNames.size()) { + const QString name = _argumentNames.at(index); + if (!name.isEmpty()) + return _argumentNames.at(index); + } + return FunctionValue::argumentName(index); +} + +const Value *Function::invoke(const Activation *) const { - return activation->thisObject(); // ### FIXME it should return undefined + return _returnValue; } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index e34f306227d7abefa1ace48b0eedd89aa792883b..ab9a53b665245bdef6052ac34911714518931440 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -522,17 +522,19 @@ public: Function(ValueOwner *valueOwner); virtual ~Function(); - void addArgument(const Value *argument); + void addArgument(const Value *argument, const QString &name = QString()); void setReturnValue(const Value *returnValue); // FunctionValue interface virtual const Value *returnValue() const; virtual int argumentCount() const; virtual const Value *argument(int index) const; + virtual QString argumentName(int index) const; virtual const Value *invoke(const Activation *activation) const; private: ValueList _arguments; + QStringList _argumentNames; const Value *_returnValue; }; diff --git a/src/libs/qmljs/qmljsvalueowner.cpp b/src/libs/qmljs/qmljsvalueowner.cpp index 68c84bec1dda7b6acee382bcd10a5e29d336ad67..8a5b5ced37c3b7aeaa712073a4f523f9c05d34c4 100644 --- a/src/libs/qmljs/qmljsvalueowner.cpp +++ b/src/libs/qmljs/qmljsvalueowner.cpp @@ -481,21 +481,23 @@ QString ValueOwner::typeId(const Value *value) return _typeId(value); } -void ValueOwner::addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount) +Function *ValueOwner::addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount) { Function *function = newFunction(); function->setReturnValue(result); for (int i = 0; i < argumentCount; ++i) function->addArgument(undefinedValue()); // ### introduce unknownValue object->setMember(name, function); + return function; } -void ValueOwner::addFunction(ObjectValue *object, const QString &name, int argumentCount) +Function *ValueOwner::addFunction(ObjectValue *object, const QString &name, int argumentCount) { Function *function = newFunction(); for (int i = 0; i < argumentCount; ++i) function->addArgument(undefinedValue()); // ### introduce unknownValue object->setMember(name, function); + return function; } void ValueOwner::initializePrototypes() @@ -750,6 +752,70 @@ void ValueOwner::initializePrototypes() _globalObject->setMember("Date", dateCtor()); _globalObject->setMember("RegExp", regexpCtor()); + Function *f = 0; + + // XMLHttpRequest + ObjectValue *xmlHttpRequest = newObject(); + xmlHttpRequest->setMember("onreadystatechange", functionPrototype()); + xmlHttpRequest->setMember("UNSENT", numberValue()); + xmlHttpRequest->setMember("OPENED", numberValue()); + xmlHttpRequest->setMember("HEADERS_RECEIVED", numberValue()); + xmlHttpRequest->setMember("LOADING", numberValue()); + xmlHttpRequest->setMember("DONE", numberValue()); + xmlHttpRequest->setMember("readyState", numberValue()); + f = addFunction(xmlHttpRequest, "open"); + f->addArgument(stringValue(), "method"); + f->addArgument(stringValue(), "url"); + f->addArgument(booleanValue(), "async"); + f->addArgument(stringValue(), "user"); + f->addArgument(stringValue(), "password"); + f = addFunction(xmlHttpRequest, "setRequestHeader"); + f->addArgument(stringValue(), "header"); + f->addArgument(stringValue(), "value"); + f = addFunction(xmlHttpRequest, "send"); + f->addArgument(undefinedValue(), "data"); + f = addFunction(xmlHttpRequest, "abort"); + xmlHttpRequest->setMember("status", numberValue()); + xmlHttpRequest->setMember("statusText", stringValue()); + f = addFunction(xmlHttpRequest, "getResponseHeader"); + f->addArgument(stringValue(), "header"); + f = addFunction(xmlHttpRequest, "getAllResponseHeaders"); + xmlHttpRequest->setMember("responseText", stringValue()); + xmlHttpRequest->setMember("responseXML", undefinedValue()); + + f = addFunction(_globalObject, "XMLHttpRequest", xmlHttpRequest); + f->setMember("prototype", xmlHttpRequest); + xmlHttpRequest->setMember("constructor", f); + + // Database API + ObjectValue *db = newObject(); + f = addFunction(db, "transaction"); + f->addArgument(functionPrototype(), "callback"); + f = addFunction(db, "readTransaction"); + f->addArgument(functionPrototype(), "callback"); + f->setMember("version", stringValue()); + f = addFunction(db, "changeVersion"); + f->addArgument(stringValue(), "oldVersion"); + f->addArgument(stringValue(), "newVersion"); + f->addArgument(functionPrototype(), "callback"); + + f = addFunction(_globalObject, "openDatabaseSync", db); + f->addArgument(stringValue(), "name"); + f->addArgument(stringValue(), "version"); + f->addArgument(stringValue(), "displayName"); + f->addArgument(numberValue(), "estimatedSize"); + f->addArgument(functionPrototype(), "callback"); + + // JSON + ObjectValue *json = newObject(); + f = addFunction(json, "parse", objectPrototype()); + f->addArgument(stringValue(), "text"); + f->addArgument(functionPrototype(), "reviver"); + f = addFunction(json, "stringify", stringValue()); + f->addArgument(undefinedValue(), "value"); + f->addArgument(undefinedValue(), "replacer"); + f->addArgument(undefinedValue(), "space"); + _globalObject->setMember("JSON", json); // global Qt object, in alphabetic order _qtObject = newObject(/*prototype */ 0); diff --git a/src/libs/qmljs/qmljsvalueowner.h b/src/libs/qmljs/qmljsvalueowner.h index 13c71c3936464df2d7b9a8091e56b90a7bb5844b..148e4347b1d13b3de31859905cc58febf001e18f 100644 --- a/src/libs/qmljs/qmljsvalueowner.h +++ b/src/libs/qmljs/qmljsvalueowner.h @@ -139,8 +139,8 @@ public: private: void initializePrototypes(); - void addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount); - void addFunction(ObjectValue *object, const QString &name, int argumentCount); + Function *addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount = 0); + Function *addFunction(ObjectValue *object, const QString &name, int argumentCount = 0); private: ObjectValue *_objectPrototype;