Merge branch 'qtquick2' of scm.dev.nokia.troll.no:qt/qtdeclarative-staging into v8
[profile/ivi/qtdeclarative.git] / src / declarative / qml / qdeclarativexmlhttprequest.cpp
index 47f0fff..33875fe 100644 (file)
@@ -133,16 +133,16 @@ QDeclarativeXMLHttpRequestData::QDeclarativeXMLHttpRequestData()
 
 QDeclarativeXMLHttpRequestData::~QDeclarativeXMLHttpRequestData()
 {
-    nodeFunction.Dispose(); nodeFunction.Clear();
-    namedNodeMapPrototype.Dispose(); namedNodeMapPrototype.Clear();
-    nodeListPrototype.Dispose(); nodeListPrototype.Clear();
-    nodePrototype.Dispose(); nodePrototype.Clear();
-    elementPrototype.Dispose(); elementPrototype.Clear();
-    attrPrototype.Dispose(); attrPrototype.Clear();
-    characterDataPrototype.Dispose(); characterDataPrototype.Clear();
-    textPrototype.Dispose(); textPrototype.Clear();
-    cdataPrototype.Dispose(); cdataPrototype.Clear();
-    documentPrototype.Dispose(); documentPrototype.Clear();
+    qPersistentDispose(nodeFunction);
+    qPersistentDispose(namedNodeMapPrototype);
+    qPersistentDispose(nodeListPrototype);
+    qPersistentDispose(nodePrototype);
+    qPersistentDispose(elementPrototype);
+    qPersistentDispose(attrPrototype);
+    qPersistentDispose(characterDataPrototype);
+    qPersistentDispose(textPrototype);
+    qPersistentDispose(cdataPrototype);
+    qPersistentDispose(documentPrototype);
 }
 
 v8::Local<v8::Object> QDeclarativeXMLHttpRequestData::newNode()
@@ -150,7 +150,7 @@ v8::Local<v8::Object> QDeclarativeXMLHttpRequestData::newNode()
     if (nodeFunction.IsEmpty()) {
         v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New();
         ft->InstanceTemplate()->SetHasExternalResource(true);
-        nodeFunction = v8::Persistent<v8::Function>::New(ft->GetFunction());
+        nodeFunction = qPersistentNew<v8::Function>(ft->GetFunction());
     }
 
     return nodeFunction->NewInstance();
@@ -515,7 +515,7 @@ v8::Handle<v8::Object> Node::prototype(QV8Engine *engine)
 {
     QDeclarativeXMLHttpRequestData *d = xhrdata(engine);
     if (d->nodePrototype.IsEmpty()) {
-        d->nodePrototype = v8::Persistent<v8::Object>::New(v8::Object::New());
+        d->nodePrototype = qPersistentNew<v8::Object>(v8::Object::New());
         d->nodePrototype->SetAccessor(v8::String::New("nodeName"), nodeName,
                                       0, v8::External::Wrap(engine));
         d->nodePrototype->SetAccessor(v8::String::New("nodeValue"), nodeValue,
@@ -536,7 +536,7 @@ v8::Handle<v8::Object> Node::prototype(QV8Engine *engine)
                                       0, v8::External::Wrap(engine));
         d->nodePrototype->SetAccessor(v8::String::New("attributes"), attributes,
                                       0, v8::External::Wrap(engine));
-        // XXX freeze
+        engine->freezeObject(d->nodePrototype);
     }
     return d->nodePrototype;
 }
@@ -582,11 +582,11 @@ v8::Handle<v8::Object> Element::prototype(QV8Engine *engine)
 {
     QDeclarativeXMLHttpRequestData *d = xhrdata(engine);
     if (d->elementPrototype.IsEmpty()) {
-        d->elementPrototype = v8::Persistent<v8::Object>::New(v8::Object::New());
+        d->elementPrototype = qPersistentNew<v8::Object>(v8::Object::New());
         d->elementPrototype->SetPrototype(Node::prototype(engine));
         d->elementPrototype->SetAccessor(v8::String::New("tagName"), nodeName,
                                          0, v8::External::Wrap(engine));
-        // XXX freeze
+        engine->freezeObject(d->elementPrototype);
     }
     return d->elementPrototype;
 }
@@ -595,7 +595,7 @@ v8::Handle<v8::Object> Attr::prototype(QV8Engine *engine)
 {
     QDeclarativeXMLHttpRequestData *d = xhrdata(engine);
     if (d->attrPrototype.IsEmpty()) {
-        d->attrPrototype = v8::Persistent<v8::Object>::New(v8::Object::New());
+        d->attrPrototype = qPersistentNew<v8::Object>(v8::Object::New());
         d->attrPrototype->SetPrototype(Node::prototype(engine));
         d->attrPrototype->SetAccessor(v8::String::New("name"), name,
                                       0, v8::External::Wrap(engine));
@@ -603,7 +603,7 @@ v8::Handle<v8::Object> Attr::prototype(QV8Engine *engine)
                                       0, v8::External::Wrap(engine));
         d->attrPrototype->SetAccessor(v8::String::New("ownerElement"), ownerElement,
                                       0, v8::External::Wrap(engine));
-        // XXX freeze
+        engine->freezeObject(d->attrPrototype);
     }
     return d->attrPrototype;
 }
@@ -648,13 +648,13 @@ v8::Handle<v8::Object> CharacterData::prototype(QV8Engine *engine)
 {
     QDeclarativeXMLHttpRequestData *d = xhrdata(engine);
     if (d->characterDataPrototype.IsEmpty()) {
-        d->characterDataPrototype = v8::Persistent<v8::Object>::New(v8::Object::New());
+        d->characterDataPrototype = qPersistentNew<v8::Object>(v8::Object::New());
         d->characterDataPrototype->SetPrototype(Node::prototype(engine));
         d->characterDataPrototype->SetAccessor(v8::String::New("data"), nodeValue,
                                                0, v8::External::Wrap(engine));
         d->characterDataPrototype->SetAccessor(v8::String::New("length"), length,
                                                0, v8::External::Wrap(engine));
-        // XXX freeze
+        engine->freezeObject(d->characterDataPrototype);
     }
     return d->characterDataPrototype;
 }
@@ -681,13 +681,13 @@ v8::Handle<v8::Object> Text::prototype(QV8Engine *engine)
 {
     QDeclarativeXMLHttpRequestData *d = xhrdata(engine);
     if (d->textPrototype.IsEmpty()) {
-        d->textPrototype = v8::Persistent<v8::Object>::New(v8::Object::New());
+        d->textPrototype = qPersistentNew<v8::Object>(v8::Object::New());
         d->textPrototype->SetPrototype(CharacterData::prototype(engine));
         d->textPrototype->SetAccessor(v8::String::New("isElementContentWhitespace"), isElementContentWhitespace,
                                                0, v8::External::Wrap(engine));
         d->textPrototype->SetAccessor(v8::String::New("wholeText"), wholeText,
                                                0, v8::External::Wrap(engine));
-        // XXX freeze
+        engine->freezeObject(d->textPrototype);
     }
     return d->textPrototype;
 }
@@ -696,9 +696,9 @@ v8::Handle<v8::Object> CDATA::prototype(QV8Engine *engine)
 {
     QDeclarativeXMLHttpRequestData *d = xhrdata(engine);
     if (d->cdataPrototype.IsEmpty()) {
-        d->cdataPrototype = v8::Persistent<v8::Object>::New(v8::Object::New());
+        d->cdataPrototype = qPersistentNew<v8::Object>(v8::Object::New());
         d->cdataPrototype->SetPrototype(Text::prototype(engine));
-        // XXX freeze
+        engine->freezeObject(d->cdataPrototype);
     }
     return d->cdataPrototype;
 }
@@ -707,7 +707,7 @@ v8::Handle<v8::Object> Document::prototype(QV8Engine *engine)
 {
     QDeclarativeXMLHttpRequestData *d = xhrdata(engine);
     if (d->documentPrototype.IsEmpty()) {
-        d->documentPrototype = v8::Persistent<v8::Object>::New(v8::Object::New());
+        d->documentPrototype = qPersistentNew<v8::Object>(v8::Object::New());
         d->documentPrototype->SetPrototype(Node::prototype(engine));
         d->documentPrototype->SetAccessor(v8::String::New("xmlVersion"), xmlVersion, 
                                           0, v8::External::Wrap(engine));
@@ -717,7 +717,7 @@ v8::Handle<v8::Object> Document::prototype(QV8Engine *engine)
                                           0, v8::External::Wrap(engine));
         d->documentPrototype->SetAccessor(v8::String::New("documentElement"), documentElement, 
                                           0, v8::External::Wrap(engine));
-        // XXX freeze
+        engine->freezeObject(d->documentPrototype);
     }
     return d->documentPrototype;
 }
@@ -878,8 +878,8 @@ v8::Handle<v8::Object> NamedNodeMap::prototype(QV8Engine *engine)
         ot->SetAccessor(v8::String::New("length"), length, 0, v8::External::Wrap(engine));
         ot->SetIndexedPropertyHandler(indexed, 0, 0, 0, 0, v8::External::Wrap(engine));
         ot->SetFallbackPropertyHandler(named, 0, 0, 0, 0, v8::External::Wrap(engine));
-        d->namedNodeMapPrototype = v8::Persistent<v8::Object>::New(ot->NewInstance());
-        // XXX freeze
+        d->namedNodeMapPrototype = qPersistentNew<v8::Object>(ot->NewInstance());
+        engine->freezeObject(d->namedNodeMapPrototype);
     }
     return d->namedNodeMapPrototype;
 }
@@ -906,7 +906,6 @@ v8::Handle<v8::Value> NodeList::indexed(uint32_t index, const v8::AccessorInfo&
     if (index < r->d->children.count()) {
         return Node::create(engine, r->d->children.at(index));
     } else {
-        // XXX RangeError exception?
         return v8::Undefined();
     }
 }
@@ -927,8 +926,8 @@ v8::Handle<v8::Object> NodeList::prototype(QV8Engine *engine)
         v8::Local<v8::ObjectTemplate> ot = v8::ObjectTemplate::New();
         ot->SetAccessor(v8::String::New("length"), length, 0, v8::External::Wrap(engine));
         ot->SetIndexedPropertyHandler(indexed, 0, 0, 0, 0, v8::External::Wrap(engine));
-        d->nodeListPrototype = v8::Persistent<v8::Object>::New(ot->NewInstance());
-        // XXX freeze
+        d->nodeListPrototype = qPersistentNew<v8::Object>(ot->NewInstance());
+        engine->freezeObject(d->nodeListPrototype);
     }
     return d->nodeListPrototype;
 }
@@ -1204,10 +1203,12 @@ void QDeclarativeXMLHttpRequest::requestFromUrl(const QUrl &url)
         m_network = networkAccessManager()->get(request);
     else if (m_method == QLatin1String("HEAD"))
         m_network = networkAccessManager()->head(request);
-    else if(m_method == QLatin1String("POST"))
+    else if (m_method == QLatin1String("POST"))
         m_network = networkAccessManager()->post(request, m_data);
-    else if(m_method == QLatin1String("PUT"))
+    else if (m_method == QLatin1String("PUT"))
         m_network = networkAccessManager()->put(request, m_data);
+    else if (m_method == QLatin1String("DELETE"))
+        m_network = networkAccessManager()->deleteResource(request);
 
     QObject::connect(m_network, SIGNAL(downloadProgress(qint64,qint64)), 
                      this, SLOT(downloadProgress(qint64)));
@@ -1259,11 +1260,10 @@ v8::Handle<v8::Object> QDeclarativeXMLHttpRequest::getMe() const
 
 void QDeclarativeXMLHttpRequest::setMe(v8::Handle<v8::Object> me)
 {
-    m_me.Dispose();
-    m_me = v8::Persistent<v8::Object>();
+    qPersistentDispose(m_me);
 
     if (!me.IsEmpty()) 
-        m_me = v8::Persistent<v8::Object>::New(me);
+        m_me = qPersistentNew<v8::Object>(me);
 }
 
 void QDeclarativeXMLHttpRequest::downloadProgress(qint64 bytes)
@@ -1527,7 +1527,8 @@ static v8::Handle<v8::Value> qmlxmlhttprequest_open(const v8::Arguments &args)
     if (method != QLatin1String("GET") && 
         method != QLatin1String("PUT") &&
         method != QLatin1String("HEAD") &&
-        method != QLatin1String("POST"))
+        method != QLatin1String("POST") &&
+        method != QLatin1String("DELETE"))
         V8THROW_DOM(SYNTAX_ERR, "Unsupported HTTP method type");
 
     // Argument 1 - URL