From eca7559542584a5675d22d619a7710e0f17cfba0 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 09:08:34 +1000
Subject: Fix dragging items within a PathView The test to determine whether
 the mouse had moved greater than startDragDistance() compared the starting
 point on the path to the current mouse position.  Fix to compare nearest path
 position.

Task-number: QTBUG-14220
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativepathview.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index 31943b2..81c84f5 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -1112,16 +1112,16 @@ void QDeclarativePathViewPrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
     if (!interactive || !lastPosTime.isValid())
         return;
 
+    qreal newPc;
+    QPointF pathPoint = pointNear(event->pos(), &newPc);
     if (!stealMouse) {
-        QPointF delta = event->pos() - startPoint;
+        QPointF delta = pathPoint - startPoint;
         if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance())
             stealMouse = true;
     }
 
     if (stealMouse) {
         moveReason = QDeclarativePathViewPrivate::Mouse;
-        qreal newPc;
-        pointNear(event->pos(), &newPc);
         qreal diff = (newPc - startPc)*modelCount*mappedRange;
         if (diff) {
             setOffset(offset + diff);
-- 
cgit v0.12


From 8480eb288990c44c9ab337f42898bc4ef6dc62f4 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Fri, 8 Oct 2010 11:06:34 +1000
Subject: Don't allow multiple values to be assigned to a singular property

Task-number: QTBUG-14005
---
 src/declarative/qml/qdeclarativecompiler.cpp                       | 3 +++
 .../declarative/qdeclarativebehaviors/data/reassignedAnimation.qml | 7 ++++++-
 .../qdeclarativelanguage/data/singularProperty.2.errors.txt        | 1 +
 .../declarative/qdeclarativelanguage/data/singularProperty.2.qml   | 7 +++++++
 .../qdeclarativelanguage/data/singularProperty.errors.txt          | 1 +
 .../declarative/qdeclarativelanguage/data/singularProperty.qml     | 6 ++++++
 .../declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp  | 2 ++
 7 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml

diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index dc28e22..7a29f24 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -1932,6 +1932,9 @@ bool QDeclarativeCompiler::buildPropertyAssignment(QDeclarativeParser::Property
 {
     obj->addValueProperty(prop);
 
+    if (prop->values.count() > 1)
+        COMPILE_EXCEPTION(prop->values.at(0), tr( "Cannot assign multiple values to a singular property") );
+
     for (int ii = 0; ii < prop->values.count(); ++ii) {
         Value *v = prop->values.at(ii);
         if (v->object) {
diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml b/tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml
index 9fca5c3..56ac216 100644
--- a/tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml
+++ b/tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml
@@ -7,9 +7,9 @@ Rectangle {
         objectName: "MyRect"
         width: 100; height: 100; color: "green"
         Behavior on x {
+            id: myBehavior
             objectName: "MyBehavior"
             NumberAnimation {id: na1; duration: 200 }
-            NumberAnimation {id: na2; duration: 1000 }
         }
     }
     MouseArea {
@@ -24,4 +24,9 @@ Rectangle {
             x: 200
         }
     }
+
+    NumberAnimation {id: na2; duration: 1000 }
+    Component.onCompleted: {
+        myBehavior.animation = na2;
+    }
 }
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt
new file mode 100644
index 0000000..beae562
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt
@@ -0,0 +1 @@
+5:10:Cannot assign multiple values to a singular property
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml
new file mode 100644
index 0000000..2fd7fd2
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+QtObject {
+    property QtObject a
+    a: [ QtObject {}, QtObject {} ]
+}
+
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt
new file mode 100644
index 0000000..beae562
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt
@@ -0,0 +1 @@
+5:10:Cannot assign multiple values to a singular property
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml
new file mode 100644
index 0000000..da56cb8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml
@@ -0,0 +1,6 @@
+import QtQuick 1.0
+
+QtObject {
+    property variant a
+    a: [ QtObject {}, QtObject {} ]
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
index 9a8c944..bb1312b 100644
--- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
@@ -380,6 +380,8 @@ void tst_qdeclarativelanguage::errors_data()
     QTest::newRow("invalidProperty") << "invalidProperty.qml" << "invalidProperty.errors.txt" << false;
     QTest::newRow("nonScriptableProperty") << "nonScriptableProperty.qml" << "nonScriptableProperty.errors.txt" << false;
     QTest::newRow("notAvailable") << "notAvailable.qml" << "notAvailable.errors.txt" << false;
+    QTest::newRow("singularProperty") << "singularProperty.qml" << "singularProperty.errors.txt" << false;
+    QTest::newRow("singularProperty.2") << "singularProperty.2.qml" << "singularProperty.2.errors.txt" << false;
 }
 
 
-- 
cgit v0.12


From a5b0d58bbba508d708b2711124c61a74e3b4f310 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 11:26:57 +1000
Subject: Ensure Flickable.contentX and Flickable.contentY return correct
 values. The animation value was used previously, but this isn't the actual
 position of the contentItem.

Task-number: QTBUG-13603
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativeflickable.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index 33c21b1..001abca 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -466,7 +466,7 @@ QDeclarativeFlickable::~QDeclarativeFlickable()
 qreal QDeclarativeFlickable::contentX() const
 {
     Q_D(const QDeclarativeFlickable);
-    return -d->hData.move.value();
+    return -d->contentItem->x();
 }
 
 void QDeclarativeFlickable::setContentX(qreal pos)
@@ -484,7 +484,7 @@ void QDeclarativeFlickable::setContentX(qreal pos)
 qreal QDeclarativeFlickable::contentY() const
 {
     Q_D(const QDeclarativeFlickable);
-    return -d->vData.move.value();
+    return -d->contentItem->y();
 }
 
 void QDeclarativeFlickable::setContentY(qreal pos)
-- 
cgit v0.12


From e38185424bda5b97bca4c381abbb6f4c577d55cf Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Fri, 8 Oct 2010 11:44:16 +1000
Subject: Remove some unnecessary includes in cpp files

---
 src/declarative/graphicsitems/qdeclarativeimagebase.cpp   | 2 --
 src/declarative/graphicsitems/qdeclarativeitem.cpp        | 1 -
 src/declarative/graphicsitems/qdeclarativepainteditem.cpp | 1 -
 src/declarative/qml/qdeclarativecomponent.cpp             | 1 -
 src/declarative/util/qdeclarativefontloader.cpp           | 1 -
 5 files changed, 6 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
index 02b4807..b06e2f7 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
@@ -46,8 +46,6 @@
 #include <qdeclarativeinfo.h>
 #include <qdeclarativepixmapcache_p.h>
 
-#include <QFile>
-
 QT_BEGIN_NAMESPACE
 
 QDeclarativeImageBase::QDeclarativeImageBase(QDeclarativeImageBasePrivate &dd, QDeclarativeItem *parent)
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 250a43b..735698e 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -56,7 +56,6 @@
 
 #include <QDebug>
 #include <QPen>
-#include <QFile>
 #include <QEvent>
 #include <QGraphicsSceneMouseEvent>
 #include <QtCore/qnumeric.h>
diff --git a/src/declarative/graphicsitems/qdeclarativepainteditem.cpp b/src/declarative/graphicsitems/qdeclarativepainteditem.cpp
index a6db1fa..b470b3a 100644
--- a/src/declarative/graphicsitems/qdeclarativepainteditem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepainteditem.cpp
@@ -44,7 +44,6 @@
 
 #include <QDebug>
 #include <QPen>
-#include <QFile>
 #include <QEvent>
 #include <QApplication>
 #include <QGraphicsSceneMouseEvent>
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index b532b0c..cfef9cf 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -57,7 +57,6 @@
 
 #include <QStack>
 #include <QStringList>
-#include <QFileInfo>
 #include <QtCore/qdebug.h>
 #include <QApplication>
 
diff --git a/src/declarative/util/qdeclarativefontloader.cpp b/src/declarative/util/qdeclarativefontloader.cpp
index 3e4a81a..d2f65ef 100644
--- a/src/declarative/util/qdeclarativefontloader.cpp
+++ b/src/declarative/util/qdeclarativefontloader.cpp
@@ -49,7 +49,6 @@
 #include <QDebug>
 #include <QNetworkRequest>
 #include <QNetworkReply>
-#include <QFile>
 #include <QFontDatabase>
 
 #include <private/qobject_p.h>
-- 
cgit v0.12


From 0bf05331d901ca27e358ec22569a07489a70b7a5 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 11:46:36 +1000
Subject: emit currentSectionChanged when section changes in ListView.

Task-number: QTBUG-13981
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativelistview.cpp    | 15 ++++++++++++---
 .../qdeclarativelistview/tst_qdeclarativelistview.cpp     |  6 ++++++
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 6b46bc5..4943aef 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -1009,18 +1009,27 @@ void QDeclarativeListViewPrivate::updateSections()
 
 void QDeclarativeListViewPrivate::updateCurrentSection()
 {
+    Q_Q(QDeclarativeListView);
     if (!sectionCriteria || visibleItems.isEmpty()) {
-        currentSection.clear();
+        if (!currentSection.isEmpty()) {
+            currentSection.clear();
+            emit q->currentSectionChanged();
+        }
         return;
     }
     int index = 0;
     while (index < visibleItems.count() && visibleItems.at(index)->endPosition() < position())
         ++index;
 
+    QString newSection = currentSection;
     if (index < visibleItems.count())
-        currentSection = visibleItems.at(index)->attached->section();
+        newSection = visibleItems.at(index)->attached->section();
     else
-        currentSection = visibleItems.first()->attached->section();
+        newSection = visibleItems.first()->attached->section();
+    if (newSection != currentSection) {
+        currentSection = newSection;
+        emit q->currentSectionChanged();
+    }
 }
 
 void QDeclarativeListViewPrivate::updateCurrent(int modelIndex)
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index 6452bae..65ff635 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -937,6 +937,8 @@ void tst_QDeclarativeListView::sections()
         QCOMPARE(next->text().toInt(), (i+1)/5);
     }
 
+    QSignalSpy currentSectionChangedSpy(listview, SIGNAL(currentSectionChanged()));
+
     // Remove section boundary
     model.removeItem(5);
 
@@ -972,9 +974,13 @@ void tst_QDeclarativeListView::sections()
     listview->setContentY(140);
     QTRY_COMPARE(listview->currentSection(), QString("1"));
 
+    QTRY_COMPARE(currentSectionChangedSpy.count(), 1);
+
     listview->setContentY(20);
     QTRY_COMPARE(listview->currentSection(), QString("0"));
 
+    QTRY_COMPARE(currentSectionChangedSpy.count(), 2);
+
     item = findItem<QDeclarativeItem>(contentItem, "wrapper", 1);
     QTRY_VERIFY(item);
     QTRY_COMPARE(item->height(), 20.0);
-- 
cgit v0.12


From 10f0cc708b8e7fc2206d1a141dfd4122e7a6f4b0 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 12:55:21 +1000
Subject: Ensure that onRelease is called for doubleClick events. Also ensures
 that the pressed property is updated appropriately and the double click and
 hold is possible.

Task-number: QTBUG-14279
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativemousearea.cpp   | 12 ++++++------
 src/declarative/graphicsitems/qdeclarativemousearea_p_p.h |  3 ++-
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
index a0208ef..1533d55 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
@@ -557,6 +557,7 @@ void QDeclarativeMouseArea::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
             ungrabMouse();
         setKeepMouseGrab(false);
     }
+    d->doubleClick = false;
 }
 
 void QDeclarativeMouseArea::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
@@ -565,14 +566,12 @@ void QDeclarativeMouseArea::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *even
     if (!d->absorb) {
         QDeclarativeItem::mouseDoubleClickEvent(event);
     } else {
+        d->doubleClick = true;
         d->saveEvent(event);
         QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, true, false);
         me.setAccepted(d->isDoubleClickConnected());
         emit this->doubleClicked(&me);
-        if (!me.isAccepted()) {
-            // Only deliver the press event if we haven't accepted the double click.
-            QDeclarativeItem::mouseDoubleClickEvent(event);
-        }
+        QDeclarativeItem::mouseDoubleClickEvent(event);
     }
 }
 
@@ -841,7 +840,8 @@ bool QDeclarativeMouseArea::setPressed(bool p)
         d->pressed = p;
         QDeclarativeMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, isclick, d->longPress);
         if (d->pressed) {
-            emit pressed(&me);
+            if (!d->doubleClick)
+                emit pressed(&me);
             me.setX(d->lastPos.x());
             me.setY(d->lastPos.y());
             emit mousePositionChanged(&me);
@@ -849,7 +849,7 @@ bool QDeclarativeMouseArea::setPressed(bool p)
             emit released(&me);
             me.setX(d->lastPos.x());
             me.setY(d->lastPos.y());
-            if (isclick && !d->longPress)
+            if (isclick && !d->longPress && !d->doubleClick)
                 emit clicked(&me);
         }
 
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
index 48a56d9..06a01d3 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativemousearea_p_p.h
@@ -68,7 +68,7 @@ class QDeclarativeMouseAreaPrivate : public QDeclarativeItemPrivate
 public:
     QDeclarativeMouseAreaPrivate()
       : absorb(true), hovered(false), pressed(false), longPress(false),
-      moved(false), stealMouse(false), drag(0)
+      moved(false), stealMouse(false), doubleClick(false), drag(0)
     {
     }
 
@@ -109,6 +109,7 @@ public:
     bool dragX : 1;
     bool dragY : 1;
     bool stealMouse : 1;
+    bool doubleClick : 1;
     QDeclarativeDrag *drag;
     QPointF startScene;
     qreal startX;
-- 
cgit v0.12


From 5447a9590dc0efa1a79fde6235fdcf76d3ae81fe Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 13:01:11 +1000
Subject: Add test for QTBUG-14279

Task-number: QTBUG-14279
---
 tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml    | 2 ++
 .../declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp  | 5 +++++
 2 files changed, 7 insertions(+)

diff --git a/tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml b/tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml
index 2348444..55b0812 100644
--- a/tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml
+++ b/tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml
@@ -4,11 +4,13 @@ Item {
     id: root
     property int clicked: 0
     property int doubleClicked: 0
+    property int released: 0
 
     MouseArea {
         width: 200; height: 200
         onClicked: { root.clicked++ }
         onDoubleClicked: { root.doubleClicked++ }
+        onReleased: { root.released++ }
     }
 }
 
diff --git a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
index 5e88450..5a50e0d 100644
--- a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
+++ b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp
@@ -413,14 +413,19 @@ void tst_QDeclarativeMouseArea::doubleClick()
     releaseEvent.setButtons(Qt::LeftButton);
     QApplication::sendEvent(scene, &releaseEvent);
 
+    QCOMPARE(canvas->rootObject()->property("released").toInt(), 1);
+
     QGraphicsSceneMouseEvent dblClickEvent(QEvent::GraphicsSceneMouseDoubleClick);
     dblClickEvent.setScenePos(QPointF(100, 100));
     dblClickEvent.setButton(Qt::LeftButton);
     dblClickEvent.setButtons(Qt::LeftButton);
     QApplication::sendEvent(scene, &dblClickEvent);
 
+    QApplication::sendEvent(scene, &releaseEvent);
+
     QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1);
     QCOMPARE(canvas->rootObject()->property("doubleClicked").toInt(), 1);
+    QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
 }
 
 QTEST_MAIN(tst_QDeclarativeMouseArea)
-- 
cgit v0.12


From c4cbd04275906b1bfa1a55147a0a4bb626033a20 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Fri, 8 Oct 2010 13:47:17 +1000
Subject: Check plugin and QML file case on Mac and Windows

This test should prevent the case where a QML app that is developed on a
case insensitive filesystem (like on Mac or Windows) and then run on
a case sensitive filesystem (like on Linux) fails to find module plugins,
imports and QML files.

Task-number: QTBUG-13517
---
 src/declarative/qml/qdeclarativeengine.cpp         | 26 +++++++
 src/declarative/qml/qdeclarativeglobal_p.h         | 13 ++++
 src/declarative/qml/qdeclarativeimport.cpp         | 11 ++-
 src/declarative/qml/qdeclarativetypeloader.cpp     |  8 +++
 .../data/importIncorrectCase.qml                   |  5 ++
 .../data/incorrectCase.errors.insensitive.txt      |  2 +
 .../data/incorrectCase.errors.sensitive.txt        |  1 +
 .../qdeclarativelanguage/data/incorrectCase.qml    |  4 ++
 .../data/incorrectCaseType.qml                     |  4 ++
 .../tst_qdeclarativelanguage.cpp                   | 24 +++++++
 .../data/incorrectCase.qml                         |  4 ++
 .../imports/com/nokia/WrongCase/qmldir             |  1 +
 .../pluginWrongCase/plugin.cpp                     | 83 ++++++++++++++++++++++
 .../pluginWrongCase/pluginWrongCase.pro            | 10 +++
 .../qdeclarativemoduleplugin.pro                   |  2 +-
 .../tst_qdeclarativemoduleplugin.cpp               | 20 ++++++
 16 files changed, 216 insertions(+), 2 deletions(-)
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp
 create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro

diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 584c5ec..0749767 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -2159,4 +2159,30 @@ const QMetaObject *QDeclarativeEnginePrivate::metaObjectForType(int t) const
     }
 }
 
+bool QDeclarative_isFileCaseCorrect(const QString &fileName)
+{
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+    QFileInfo info(fileName);
+
+    QString absolute = info.absoluteFilePath();
+    QString canonical = info.canonicalFilePath();
+
+    int absoluteLength = absolute.length();
+    int canonicalLength = canonical.length();
+
+    int length = qMin(absoluteLength, canonicalLength);
+    for (int ii = 0; ii < length; ++ii) {
+        const QChar &a = absolute.at(absoluteLength - 1 - ii);
+        const QChar &c = canonical.at(canonicalLength - 1 - ii);
+
+        if (a.toLower() != c.toLower())
+            return true;
+        if (a != c)
+            return false;
+    }
+#endif
+
+    return true;
+}
+
 QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativeglobal_p.h b/src/declarative/qml/qdeclarativeglobal_p.h
index 1041992..65d9b24 100644
--- a/src/declarative/qml/qdeclarativeglobal_p.h
+++ b/src/declarative/qml/qdeclarativeglobal_p.h
@@ -75,6 +75,19 @@ struct QDeclarativeGraphics_DerivedObject : public QObject
 };
 
 /*!
+    Returns true if the case of \a fileName is equivalent to the file case of 
+    \a fileName on disk, and false otherwise.
+
+    This is used to ensure that the behavior of QML on a case-insensitive file 
+    system is the same as on a case-sensitive file system.  This function 
+    performs a "best effort" attempt to determine the real case of the file. 
+    It may have false positives (say the case is correct when it isn't), but it
+    should never have a false negative (say the case is incorrect when it is 
+    correct).
+*/
+bool QDeclarative_isFileCaseCorrect(const QString &fileName);
+
+/*!
     Makes the \a object a child of \a parent.  Note that when using this method,
     neither \a parent nor the object's previous parent (if it had one) will
     receive ChildRemoved or ChildAdded events.
diff --git a/src/declarative/qml/qdeclarativeimport.cpp b/src/declarative/qml/qdeclarativeimport.cpp
index fe4ed48..6f5216a 100644
--- a/src/declarative/qml/qdeclarativeimport.cpp
+++ b/src/declarative/qml/qdeclarativeimport.cpp
@@ -351,7 +351,11 @@ bool QDeclarativeImportsPrivate::importExtension(const QString &absoluteFilePath
 {
     QFile file(absoluteFilePath);
     QString filecontent;
-    if (file.open(QFile::ReadOnly)) {
+    if (!QDeclarative_isFileCaseCorrect(absoluteFilePath)) {
+        if (errorString)
+            *errorString = QDeclarativeImportDatabase::tr("cannot load module \"%1\": File name case mismatch for \"%2\"").arg(uri).arg(absoluteFilePath);
+        return false;
+    } else if (file.open(QFile::ReadOnly)) {
         filecontent = QString::fromUtf8(file.readAll());
         if (qmlImportTrace())
             qDebug().nospace() << "QDeclarativeImports(" << qPrintable(base.toString()) << "::importExtension: "
@@ -913,6 +917,11 @@ bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QSt
     }
 
     if (!engineInitialized || !typesRegistered) {
+        if (!QDeclarative_isFileCaseCorrect(absoluteFilePath)) {
+            if (errorString) 
+                *errorString = tr("File name case mismatch for \"%2\"").arg(absoluteFilePath);
+            return false;
+        }
         QPluginLoader loader(absoluteFilePath);
 
         if (!loader.load()) {
diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp
index 061f309..c8e1a07 100644
--- a/src/declarative/qml/qdeclarativetypeloader.cpp
+++ b/src/declarative/qml/qdeclarativetypeloader.cpp
@@ -44,6 +44,7 @@
 #include <private/qdeclarativeengine_p.h>
 #include <private/qdeclarativecompiler_p.h>
 #include <private/qdeclarativecomponent_p.h>
+#include <private/qdeclarativeglobal_p.h>
 
 #include <QtDeclarative/qdeclarativecomponent.h>
 #include <QtCore/qdebug.h>
@@ -493,6 +494,13 @@ void QDeclarativeDataLoader::load(QDeclarativeDataBlob *blob)
     QString lf = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(blob->m_url);
 
     if (!lf.isEmpty()) {
+        if (!QDeclarative_isFileCaseCorrect(lf)) {
+            QDeclarativeError error;
+            error.setUrl(blob->m_url);
+            error.setDescription(QLatin1String("File name case mismatch"));
+            blob->setError(error);
+            return;
+        }
         QFile file(lf);
         if (file.open(QFile::ReadOnly)) {
             QByteArray data = file.readAll();
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml b/tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml
new file mode 100644
index 0000000..247f527
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml
@@ -0,0 +1,5 @@
+import QtQuick 1.0
+import com.Nokia.installedtest 1.0
+
+QtObject {
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt
new file mode 100644
index 0000000..3813680
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt
@@ -0,0 +1,2 @@
+3:1:Type IncorrectCaseType unavailable
+-1:-1:File name case mismatch
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt
new file mode 100644
index 0000000..abed1a7
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt
@@ -0,0 +1 @@
+3:1:IncorrectCaseType is not a type
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml
new file mode 100644
index 0000000..d11000b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml
@@ -0,0 +1,4 @@
+import QtQuick 1.0
+
+IncorrectCaseType {
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml
new file mode 100644
index 0000000..cf32b45
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml
@@ -0,0 +1,4 @@
+import QtQuick 1.0
+
+QtObject {
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
index bb1312b..2aac27e 100644
--- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
@@ -144,6 +144,7 @@ private slots:
     void importsInstalled();
     void importsOrder_data();
     void importsOrder();
+    void importIncorrectCase();
 
     void qmlAttachedPropertiesObjectMethod();
     void customOnProperty();
@@ -382,6 +383,13 @@ void tst_qdeclarativelanguage::errors_data()
     QTest::newRow("notAvailable") << "notAvailable.qml" << "notAvailable.errors.txt" << false;
     QTest::newRow("singularProperty") << "singularProperty.qml" << "singularProperty.errors.txt" << false;
     QTest::newRow("singularProperty.2") << "singularProperty.2.qml" << "singularProperty.2.errors.txt" << false;
+    QTest::newRow("incorrectCase") << "incorrectCase.qml" 
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+        << "incorrectCase.errors.insensitive.txt" 
+#else
+        << "incorrectCase.errors.sensitive.txt" 
+#endif
+        << false;
 }
 
 
@@ -1724,6 +1732,22 @@ void tst_qdeclarativelanguage::importsOrder()
     testType(qml,type,error);
 }
 
+void tst_qdeclarativelanguage::importIncorrectCase()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("importIncorrectCase.qml"));
+
+    QList<QDeclarativeError> errors = component.errors();
+    QCOMPARE(errors.count(), 1);
+
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+    QString expectedError = QLatin1String("cannot load module \"com.Nokia.installedtest\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("data/lib/com/Nokia/installedtest/qmldir") + QLatin1String("\"");
+#else
+    QString expectedError = QLatin1String("module \"com.Nokia.installedtest\" is not installed");
+#endif
+
+    QCOMPARE(errors.at(0).description(), expectedError);
+}
+
 void tst_qdeclarativelanguage::qmlAttachedPropertiesObjectMethod()
 {
     QObject object;
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml
new file mode 100644
index 0000000..a21ece7
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml
@@ -0,0 +1,4 @@
+import com.nokia.WrongCase 1.0
+
+MyPluginType { value: 123 }
+
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir
new file mode 100644
index 0000000..6c87874
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir
@@ -0,0 +1 @@
+plugin PluGin
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp
new file mode 100644
index 0000000..5e91f4e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QStringList>
+#include <QtDeclarative/qdeclarativeextensionplugin.h>
+#include <QtDeclarative/qdeclarative.h>
+#include <QDebug>
+
+class MyPluginType : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(int value READ value WRITE setValue)
+
+public:
+    MyPluginType(QObject *parent=0) : QObject(parent)
+    {
+        qWarning("import worked");
+    }
+
+    int value() const { return v; }
+    void setValue(int i) { v = i; }
+
+private:
+    int v;
+};
+
+
+class MyPlugin : public QDeclarativeExtensionPlugin
+{
+    Q_OBJECT
+public:
+    MyPlugin()
+    {
+        qWarning("plugin created");
+    }
+
+    void registerTypes(const char *uri)
+    {
+        Q_ASSERT(QLatin1String(uri) == "com.nokia.WrongCase");
+        qmlRegisterType<MyPluginType>(uri, 1, 0, "MyPluginType");
+    }
+};
+
+#include "plugin.moc"
+
+Q_EXPORT_PLUGIN2(plugin, MyPlugin);
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro
new file mode 100644
index 0000000..c7337ca
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro
@@ -0,0 +1,10 @@
+TEMPLATE = lib
+CONFIG += plugin
+SOURCES = plugin.cpp
+QT = core declarative
+TARGET = Plugin
+DESTDIR = ../imports/com/nokia/WrongCase
+
+symbian: {
+    TARGET.EPOCALLOWDLLDATA=1
+}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro
index 824b402..221e465 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro
@@ -1,6 +1,6 @@
 QT = core
 TEMPLATE = subdirs
-SUBDIRS = plugin
+SUBDIRS = plugin pluginWrongCase
 tst_qdeclarativemoduleplugin_pro.depends += plugin
 SUBDIRS += tst_qdeclarativemoduleplugin.pro
 
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
index e1022e0..587a86a 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
@@ -54,6 +54,7 @@ public:
 
 private slots:
     void importsPlugin();
+    void incorrectPluginCase();
 };
 
 #ifdef Q_OS_SYMBIAN
@@ -120,6 +121,25 @@ void tst_qdeclarativemoduleplugin::importsPlugin()
     delete object;
 }
 
+void tst_qdeclarativemoduleplugin::incorrectPluginCase()
+{
+    QDeclarativeEngine engine;
+    engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
+
+    QDeclarativeComponent component(&engine, TEST_FILE("data/incorrectCase.qml"));
+
+    QList<QDeclarativeError> errors = component.errors();
+    QCOMPARE(errors.count(), 1);
+
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+    QString expectedError = QLatin1String("plugin cannot be loaded for module \"com.nokia.WrongCase\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("imports/com/nokia/WrongCase/libPluGin.dylib") + QLatin1String("\"");
+#else
+    QString expectedError = QLatin1String("module \"com.nokia.WrongCase\" plugin \"PluGin\" not found");
+#endif
+
+    QCOMPARE(errors.at(0).description(), expectedError);
+}
+
 QTEST_MAIN(tst_qdeclarativemoduleplugin)
 
 #include "tst_qdeclarativemoduleplugin.moc"
-- 
cgit v0.12


From a139b9aff0d658758cc7a8063377824178a8ea92 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Fri, 8 Oct 2010 14:03:37 +1000
Subject: Disable Text {} image caching by default

Task-number: QTBUG-14050
---
 src/declarative/graphicsitems/qdeclarativetext.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 65f1564..54cb062 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -82,7 +82,7 @@ private:
     static QSet<QUrl> errors;
 };
 
-DEFINE_BOOL_CONFIG_OPTION(disableImageCache, QML_DISABLE_IMAGE_CACHE);
+DEFINE_BOOL_CONFIG_OPTION(enableImageCache, QML_ENABLE_TEXT_IMAGE_CACHE);
 
 QDeclarativeTextPrivate::QDeclarativeTextPrivate()
 : color((QRgb)0), style(QDeclarativeText::Normal),
@@ -90,7 +90,7 @@ QDeclarativeTextPrivate::QDeclarativeTextPrivate()
   imgDirty(true), dirty(true), richText(false), singleline(false), cache(true), internalWidthUpdate(false), doc(0),
   format(QDeclarativeText::AutoText), wrapMode(QDeclarativeText::NoWrap)
 {
-    cache = !disableImageCache();
+    cache = enableImageCache();
     QGraphicsItemPrivate::acceptedMouseButtons = Qt::LeftButton;
     QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents;
 }
-- 
cgit v0.12


From 762b03e1ae83ffd66965810e1d70326b364115f5 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 14:17:05 +1000
Subject: Don't forward keys to invisible items.

Task-number: QTBUG-13685
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativeitem.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 735698e..51eb5f2 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -1180,7 +1180,7 @@ void QDeclarativeKeysAttached::keyPressed(QKeyEvent *event, bool post)
         d->inPress = true;
         for (int ii = 0; ii < d->targets.count(); ++ii) {
             QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
-            if (i) {
+            if (i && i->isVisible()) {
                 d->item->scene()->sendEvent(i, event);
                 if (event->isAccepted()) {
                     d->inPress = false;
@@ -1222,7 +1222,7 @@ void QDeclarativeKeysAttached::keyReleased(QKeyEvent *event, bool post)
         d->inRelease = true;
         for (int ii = 0; ii < d->targets.count(); ++ii) {
             QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
-            if (i) {
+            if (i && i->isVisible()) {
                 d->item->scene()->sendEvent(i, event);
                 if (event->isAccepted()) {
                     d->inRelease = false;
@@ -1247,7 +1247,7 @@ void QDeclarativeKeysAttached::inputMethodEvent(QInputMethodEvent *event, bool p
         d->inIM = true;
         for (int ii = 0; ii < d->targets.count(); ++ii) {
             QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
-            if (i && (i->flags() & QGraphicsItem::ItemAcceptsInputMethod)) {
+            if (i && i->isVisible() && (i->flags() & QGraphicsItem::ItemAcceptsInputMethod)) {
                 d->item->scene()->sendEvent(i, event);
                 if (event->isAccepted()) {
                     d->imeItem = i;
@@ -1275,7 +1275,7 @@ QVariant QDeclarativeKeysAttached::inputMethodQuery(Qt::InputMethodQuery query)
     if (d->item) {
         for (int ii = 0; ii < d->targets.count(); ++ii) {
                 QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii));
-            if (i && (i->flags() & QGraphicsItem::ItemAcceptsInputMethod) && i == d->imeItem) { //### how robust is i == d->imeItem check?
+            if (i && i->isVisible() && (i->flags() & QGraphicsItem::ItemAcceptsInputMethod) && i == d->imeItem) { //### how robust is i == d->imeItem check?
                 QVariant v = static_cast<QDeclarativeItemAccessor *>(i)->doInputMethodQuery(query);
                 if (v.userType() == QVariant::RectF)
                     v = d->item->mapRectFromItem(i, v.toRectF());  //### cost?
-- 
cgit v0.12


From fd2d104988955e4e94252abd8d90507aa33dc10d Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 14:34:48 +1000
Subject: Test for QTBUG-13685

Task-number: QTBUG-13685
---
 tests/auto/declarative/qdeclarativeitem/data/keystest.qml    |  1 +
 .../declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp    | 12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/tests/auto/declarative/qdeclarativeitem/data/keystest.qml b/tests/auto/declarative/qdeclarativeitem/data/keystest.qml
index 3927f42..9af6e9f 100644
--- a/tests/auto/declarative/qdeclarativeitem/data/keystest.qml
+++ b/tests/auto/declarative/qdeclarativeitem/data/keystest.qml
@@ -17,6 +17,7 @@ Item {
 
     Item {
         id: item2
+        visible: forwardeeVisible
         Keys.onPressed: keysTestObject.forwardedKey(event.key)
         Keys.onReleased: keysTestObject.forwardedKey(event.key)
     }
diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
index bbbf73e..b4903ae 100644
--- a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
+++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
@@ -204,6 +204,7 @@ void tst_QDeclarativeItem::keys()
     canvas->rootContext()->setContextProperty("keysTestObject", testObject);
 
     canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
+    canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true));
 
     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keystest.qml"));
     canvas->show();
@@ -287,6 +288,17 @@ void tst_QDeclarativeItem::keys()
 
     testObject->reset();
 
+    canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false));
+    key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
+    QApplication::sendEvent(canvas, &key);
+    QCOMPARE(testObject->mKey, int(Qt::Key_A));
+    QCOMPARE(testObject->mForwardedKey, 0);
+    QCOMPARE(testObject->mText, QLatin1String("A"));
+    QVERIFY(testObject->mModifiers == Qt::NoModifier);
+    QVERIFY(!key.isAccepted());
+
+    testObject->reset();
+
     canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false));
     QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false);
 
-- 
cgit v0.12


From e17a5398bf20b89834d4d6c7f4d9203f192b101f Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Fri, 8 Oct 2010 14:50:43 +1000
Subject: Image.sourceSize is incorrect after changing Image.source

Task-number: QTBUG-14303
---
 .../graphicsitems/qdeclarativeimagebase.cpp        | 13 +++++----
 .../graphicsitems/qdeclarativeimagebase_p_p.h      |  2 ++
 .../qdeclarativeimage/tst_qdeclarativeimage.cpp    | 34 ++++++++++++++++++++--
 3 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
index b06e2f7..c3bac2d 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
@@ -113,6 +113,7 @@ void QDeclarativeImageBase::setSourceSize(const QSize& size)
         return;
 
     d->sourcesize = size;
+    d->explicitSourceSize = true;
     emit sourceSizeChanged();
     if (isComponentComplete())
         load();
@@ -121,7 +122,10 @@ void QDeclarativeImageBase::setSourceSize(const QSize& size)
 QSize QDeclarativeImageBase::sourceSize() const
 {
     Q_D(const QDeclarativeImageBase);
-    return d->sourcesize.isValid() ? d->sourcesize : QSize(implicitWidth(),implicitHeight());
+
+    int width = d->sourcesize.width();
+    int height = d->sourcesize.height();
+    return QSize(width != -1 ? width : implicitWidth(), height != -1 ? height : implicitHeight());
 }
 
 void QDeclarativeImageBase::load()
@@ -139,7 +143,7 @@ void QDeclarativeImageBase::load()
         pixmapChange();
         update();
     } else {
-        d->pix.load(qmlEngine(this), d->url, d->sourcesize, d->async);
+        d->pix.load(qmlEngine(this), d->url, d->explicitSourceSize ? sourceSize() : QSize(), d->async);
 
         if (d->pix.isLoading()) {
             d->progress = 0.0;
@@ -184,11 +188,8 @@ void QDeclarativeImageBase::requestFinished()
     setImplicitWidth(d->pix.width());
     setImplicitHeight(d->pix.height());
 
-    if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height()) {
-        d->sourcesize.setWidth(d->pix.width());
-        d->sourcesize.setHeight(d->pix.height());
+    if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height())
         emit sourceSizeChanged();
-    }
 
     if (d->status != oldStatus)
         emit statusChanged(d->status);
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h b/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
index aee8b28..3d23ba9 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase_p_p.h
@@ -69,6 +69,7 @@ public:
     QDeclarativeImageBasePrivate()
       : status(QDeclarativeImageBase::Null),
         progress(0.0),
+        explicitSourceSize(false),
         async(false)
     {
         QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents;
@@ -79,6 +80,7 @@ public:
     QUrl url;
     qreal progress;
     QSize sourcesize;
+    bool explicitSourceSize : 1;
     bool async : 1;
 };
 
diff --git a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
index 8f9b2ea..f1e026f 100644
--- a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
+++ b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
@@ -84,6 +84,7 @@ private slots:
     void tiling_QTBUG_6716();
     void noLoading();
     void paintedWidthHeight();
+    void sourceSize_QTBUG_14303();
 
 private:
     template<typename T>
@@ -377,7 +378,7 @@ void tst_qdeclarativeimage::noLoading()
     QTRY_COMPARE(statusSpy.count(), 0);
 
     // Loading remote file
-    ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/oldcolors.png");
+    ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/heart200.png");
     QTRY_VERIFY(obj->status() == QDeclarativeImage::Loading);
     QTRY_VERIFY(obj->progress() == 0.0);
     QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready);
@@ -388,7 +389,7 @@ void tst_qdeclarativeimage::noLoading()
 
     // Loading remote file again - should not go through 'Loading' state.
     ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png"));
-    ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/oldcolors.png");
+    ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/heart200.png");
     QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready);
     QTRY_VERIFY(obj->progress() == 1.0);
     QTRY_COMPARE(sourceSpy.count(), 4);
@@ -436,6 +437,35 @@ void tst_qdeclarativeimage::paintedWidthHeight()
     }
 }
 
+void tst_qdeclarativeimage::sourceSize_QTBUG_14303()
+{
+    QString componentStr = "import QtQuick 1.0\nImage { source: srcImage }";
+    QDeclarativeContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart200.png"));
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QDeclarativeImage *obj = qobject_cast<QDeclarativeImage*>(component.create());
+
+    QSignalSpy sourceSizeSpy(obj, SIGNAL(sourceSizeChanged()));
+
+    QTRY_VERIFY(obj != 0);
+    QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready);
+
+    QTRY_COMPARE(obj->sourceSize().width(), 200);
+    QTRY_COMPARE(obj->sourceSize().height(), 200);
+    QTRY_COMPARE(sourceSizeSpy.count(), 0);
+
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png"));
+    QTRY_COMPARE(obj->sourceSize().width(), 120);
+    QTRY_COMPARE(obj->sourceSize().height(), 120);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart200.png"));
+    QTRY_COMPARE(obj->sourceSize().width(), 200);
+    QTRY_COMPARE(obj->sourceSize().height(), 200);
+    QTRY_COMPARE(sourceSizeSpy.count(), 2);
+}
+
 /*
    Find an item with the specified objectName.  If index is supplied then the
    item must also evaluate the {index} expression equal to index
-- 
cgit v0.12


From 63e6b999144dfbd4ab230973d7e682361e8fe182 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Fri, 8 Oct 2010 15:06:17 +1000
Subject: Allow aliases to value type properties

Task-number: QTBUG-14254
---
 src/declarative/qml/qdeclarativecompiler.cpp       | 27 +++++++++++--
 src/declarative/qml/qdeclarativevmemetaobject.cpp  | 25 +++++++++---
 src/declarative/qml/qdeclarativevmemetaobject_p.h  | 19 ++++++++++
 .../qdeclarativelanguage/data/alias.10.qml         |  8 ++++
 .../qdeclarativelanguage/data/alias.11.qml         |  8 ++++
 .../data/invalidAlias.10.errors.txt                |  1 +
 .../qdeclarativelanguage/data/invalidAlias.10.qml  |  6 +++
 .../data/invalidAlias.3.errors.txt                 |  2 +-
 .../qdeclarativelanguage/data/invalidAlias.3.qml   |  2 +-
 .../data/invalidAlias.4.errors.txt                 |  2 +-
 .../data/invalidAlias.8.errors.txt                 |  1 +
 .../qdeclarativelanguage/data/invalidAlias.8.qml   |  7 ++++
 .../data/invalidAlias.9.errors.txt                 |  1 +
 .../qdeclarativelanguage/data/invalidAlias.9.qml   |  6 +++
 .../tst_qdeclarativelanguage.cpp                   | 44 ++++++++++++++++++++++
 15 files changed, 147 insertions(+), 12 deletions(-)
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml

diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index 7a29f24..74bc5bd 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -2565,8 +2565,8 @@ bool QDeclarativeCompiler::compileAlias(QMetaObjectBuilder &builder,
 
     QStringList alias = astNodeToStringList(node);
 
-    if (alias.count() != 1 && alias.count() != 2)
-        COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias reference. An alias reference must be specified as <id> or <id>.<property>"));
+    if (alias.count() < 1 || alias.count() > 3)
+        COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property>"));
 
     if (!compileState.ids.contains(alias.at(0)))
         COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias reference. Unable to find id \"%1\"").arg(alias.at(0)));
@@ -2578,11 +2578,14 @@ bool QDeclarativeCompiler::compileAlias(QMetaObjectBuilder &builder,
     int propIdx = -1;
     int flags = 0;
     bool writable = false;
-    if (alias.count() == 2) {
+    if (alias.count() == 2 || alias.count() == 3) {
         propIdx = idObject->metaObject()->indexOfProperty(alias.at(1).toUtf8().constData());
 
-        if (-1 == propIdx)
+        if (-1 == propIdx) {
             COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias location"));
+        } else if (propIdx > 0xFFFF) {
+            COMPILE_EXCEPTION(prop.defaultValue, tr("Alias property exceeds alias bounds"));
+        }
 
         QMetaProperty aliasProperty = idObject->metaObject()->property(propIdx);
         if (!aliasProperty.isScriptable())
@@ -2590,6 +2593,22 @@ bool QDeclarativeCompiler::compileAlias(QMetaObjectBuilder &builder,
 
         writable = aliasProperty.isWritable();
 
+        if (alias.count() == 3) {
+            QDeclarativeValueType *valueType = enginePrivate->valueTypes[aliasProperty.type()];
+            if (!valueType)
+                COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias location"));
+
+            propIdx |= ((unsigned int)aliasProperty.type()) << 24;
+
+            int valueTypeIndex = valueType->metaObject()->indexOfProperty(alias.at(2).toUtf8().constData());
+            if (valueTypeIndex == -1)
+                COMPILE_EXCEPTION(prop.defaultValue, tr("Invalid alias location"));
+            Q_ASSERT(valueTypeIndex <= 0xFF);
+            
+            aliasProperty = valueType->metaObject()->property(valueTypeIndex);
+            propIdx |= (valueTypeIndex << 16);
+        }
+
         if (aliasProperty.isEnumType()) 
             typeName = "int";  // Avoid introducing a dependency on the aliased metaobject
         else
diff --git a/src/declarative/qml/qdeclarativevmemetaobject.cpp b/src/declarative/qml/qdeclarativevmemetaobject.cpp
index 37f08fc..e28062b 100644
--- a/src/declarative/qml/qdeclarativevmemetaobject.cpp
+++ b/src/declarative/qml/qdeclarativevmemetaobject.cpp
@@ -459,7 +459,7 @@ int QDeclarativeVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
             id -= propOffset;
 
             if (id < metaData->propertyCount) {
-                int t = (metaData->propertyData() + id)->propertyType;
+               int t = (metaData->propertyData() + id)->propertyType;
                 bool needActivate = false;
 
                 if (t == -1) {
@@ -586,11 +586,26 @@ int QDeclarativeVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
 
                 connectAlias(id);
 
-                if (d->propertyIdx == -1) {
+                if (d->isObjectAlias()) {
                     *reinterpret_cast<QObject **>(a[0]) = target;
                     return -1;
+                } else if (d->isValueTypeAlias()) {
+                    // Value type property
+                    QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(ctxt->engine);
+
+                    QDeclarativeValueType *valueType = ep->valueTypes[d->valueType()];
+                    Q_ASSERT(valueType);
+
+                    valueType->read(target, d->propertyIndex());
+                    int rv = QMetaObject::metacall(valueType, c, d->valueTypeIndex(), a);
+                    
+                    if (c == QMetaObject::WriteProperty)
+                        valueType->write(target, d->propertyIndex(), 0x00);
+
+                    return rv;
+
                 } else {
-                    return QMetaObject::metacall(target, c, d->propertyIdx, a);
+                    return QMetaObject::metacall(target, c, d->propertyIndex(), a);
                 }
 
             }
@@ -823,8 +838,8 @@ void QDeclarativeVMEMetaObject::connectAlias(int aliasId)
         int sigIdx = methodOffset + aliasId + metaData->propertyCount;
         QMetaObject::connect(context, d->contextIdx + ctxtPriv->notifyIndex, object, sigIdx);
 
-        if (d->propertyIdx != -1) {
-            QMetaProperty prop = target->metaObject()->property(d->propertyIdx);
+        if (!d->isObjectAlias()) {
+            QMetaProperty prop = target->metaObject()->property(d->propertyIndex());
             if (prop.hasNotifySignal())
                 QDeclarativePropertyPrivate::connect(target, prop.notifySignalIndex(), object, sigIdx);
         }
diff --git a/src/declarative/qml/qdeclarativevmemetaobject_p.h b/src/declarative/qml/qdeclarativevmemetaobject_p.h
index 4ccaa73..5134763 100644
--- a/src/declarative/qml/qdeclarativevmemetaobject_p.h
+++ b/src/declarative/qml/qdeclarativevmemetaobject_p.h
@@ -84,6 +84,25 @@ struct QDeclarativeVMEMetaData
         int contextIdx;
         int propertyIdx;
         int flags;
+
+        bool isObjectAlias() const {
+            return propertyIdx == -1;
+        }
+        bool isPropertyAlias() const {
+            return !isObjectAlias() && !(propertyIdx & 0xFF000000);
+        }
+        bool isValueTypeAlias() const {
+            return !isObjectAlias() && (propertyIdx & 0xFF000000);
+        }
+        int propertyIndex() const {
+            return propertyIdx & 0x0000FFFF;
+        }
+        int valueTypeIndex() const {
+            return (propertyIdx & 0x00FF0000) >> 16;
+        }
+        int valueType() const {
+            return ((unsigned int)propertyIdx) >> 24;
+        }
     };
     
     struct PropertyData {
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml
new file mode 100644
index 0000000..bf6352e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml
@@ -0,0 +1,8 @@
+import Test 1.0
+
+MyTypeObject {
+    id: root
+    property alias valueAlias: root.rectProperty
+
+    rectProperty: "10,11,9x8"
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml
new file mode 100644
index 0000000..fbd50d9
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml
@@ -0,0 +1,8 @@
+import Test 1.0
+
+MyTypeObject {
+    id: root
+
+    property alias aliasProperty: root.rectProperty.x
+    rectProperty: "19,13,100x120"
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt
new file mode 100644
index 0000000..93652a7
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt
@@ -0,0 +1 @@
+5:23:Invalid alias location
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml
new file mode 100644
index 0000000..3ff7b16
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml
@@ -0,0 +1,6 @@
+import Test 1.0
+
+MyTypeObject {
+    id: root
+    property alias a: root.rectProperty.blah
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt
index 7260be4..fbf1b58 100644
--- a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt
@@ -1 +1 @@
-5:23:Invalid alias reference. An alias reference must be specified as <id> or <id>.<property>
+5:23:Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property>
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml
index cc71753..a363373 100644
--- a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml
@@ -2,5 +2,5 @@ import Test 1.0
 
 MyTypeObject {
     id: root
-    property alias a: root.rectProperty.x
+    property alias a: root.rectProperty.x.y
 }
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt
index 7260be4..fbf1b58 100644
--- a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt
@@ -1 +1 @@
-5:23:Invalid alias reference. An alias reference must be specified as <id> or <id>.<property>
+5:23:Invalid alias reference. An alias reference must be specified as <id>, <id>.<property> or <id>.<value property>.<property>
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt
new file mode 100644
index 0000000..93652a7
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt
@@ -0,0 +1 @@
+5:23:Invalid alias location
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml
new file mode 100644
index 0000000..4faa52d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml
@@ -0,0 +1,7 @@
+import Test 1.0
+
+MyTypeObject {
+    id: root
+    property alias a: root.imaginary.x
+}
+
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt
new file mode 100644
index 0000000..93652a7
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt
@@ -0,0 +1 @@
+5:23:Invalid alias location
diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml
new file mode 100644
index 0000000..f183912
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml
@@ -0,0 +1,6 @@
+import Test 1.0
+
+MyTypeObject {
+    id: root
+    property alias a: root.floatProperty.x
+}
diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
index 2aac27e..6a45957 100644
--- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
@@ -349,6 +349,9 @@ void tst_qdeclarativelanguage::errors_data()
     QTest::newRow("invalidAlias.5") << "invalidAlias.5.qml" << "invalidAlias.5.errors.txt" << false;
     QTest::newRow("invalidAlias.6") << "invalidAlias.6.qml" << "invalidAlias.6.errors.txt" << false;
     QTest::newRow("invalidAlias.7") << "invalidAlias.7.qml" << "invalidAlias.7.errors.txt" << false;
+    QTest::newRow("invalidAlias.8") << "invalidAlias.8.qml" << "invalidAlias.8.errors.txt" << false;
+    QTest::newRow("invalidAlias.9") << "invalidAlias.9.qml" << "invalidAlias.9.errors.txt" << false;
+    QTest::newRow("invalidAlias.10") << "invalidAlias.10.qml" << "invalidAlias.10.errors.txt" << false;
 
     QTest::newRow("invalidAttachedProperty.1") << "invalidAttachedProperty.1.qml" << "invalidAttachedProperty.1.errors.txt" << false;
     QTest::newRow("invalidAttachedProperty.2") << "invalidAttachedProperty.2.qml" << "invalidAttachedProperty.2.errors.txt" << false;
@@ -1064,6 +1067,47 @@ void tst_qdeclarativelanguage::aliasProperties()
 
         delete object;
     }
+
+    // Valuetype alias
+    // Simple "int" alias
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("alias.10.qml"));
+        VERIFY_ERRORS(0);
+        QObject *object = component.create();
+        QVERIFY(object != 0);
+
+        // Read through alias
+        QCOMPARE(object->property("valueAlias").toRect(), QRect(10, 11, 9, 8));
+        object->setProperty("rectProperty", QVariant(QRect(33, 12, 99, 100)));
+        QCOMPARE(object->property("valueAlias").toRect(), QRect(33, 12, 99, 100));
+
+        // Write throught alias
+        object->setProperty("valueAlias", QVariant(QRect(3, 3, 4, 9)));
+        QCOMPARE(object->property("valueAlias").toRect(), QRect(3, 3, 4, 9));
+        QCOMPARE(object->property("rectProperty").toRect(), QRect(3, 3, 4, 9));
+
+        delete object;
+    }
+
+    // Valuetype sub-alias
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("alias.11.qml"));
+        VERIFY_ERRORS(0);
+        QObject *object = component.create();
+        QVERIFY(object != 0);
+
+        // Read through alias
+        QCOMPARE(object->property("aliasProperty").toInt(), 19);
+        object->setProperty("rectProperty", QVariant(QRect(33, 8, 102, 111)));
+        QCOMPARE(object->property("aliasProperty").toInt(), 33);
+
+        // Write throught alias
+        object->setProperty("aliasProperty", QVariant(4));
+        QCOMPARE(object->property("aliasProperty").toInt(), 4);
+        QCOMPARE(object->property("rectProperty").toRect(), QRect(4, 8, 102, 111));
+
+        delete object;
+    }
 }
 
 // QTBUG-13374 Test that alias properties and signals can coexist
-- 
cgit v0.12


From 11536f150887266b6a6f5cf00b22f9d1fcc1aaeb Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 8 Oct 2010 16:12:31 +1000
Subject: Ensure GridView header is visible at the top of the view. The view
 was scrolled to the top of the first item, rather than the top of the header.

Task-number: QTBUG-13906
Reviewed-by: Michael Brasser
---
 .../graphicsitems/qdeclarativegridview.cpp         |  9 +++++-
 .../qdeclarativegridview/data/header.qml           | 32 ++++++++++++++++++++
 .../tst_qdeclarativegridview.cpp                   | 35 ++++++++++++++++++++++
 3 files changed, 75 insertions(+), 1 deletion(-)
 create mode 100644 tests/auto/declarative/qdeclarativegridview/data/header.qml

diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp
index 8216ab7..6ee6b0d 100644
--- a/src/declarative/graphicsitems/qdeclarativegridview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp
@@ -218,7 +218,14 @@ public:
                 return visibleItems.last()->rowPos() + rows * rowSize();
             }
         } else {
-             return (modelIndex / columns) * rowSize();
+            qreal pos = (modelIndex / columns) * rowSize();
+            if (header) {
+                qreal headerSize = flow == QDeclarativeGridView::LeftToRight
+                                   ? header->item->height()
+                                   : header->item->width();
+                pos += headerSize;
+            }
+            return pos;
         }
         return 0;
     }
diff --git a/tests/auto/declarative/qdeclarativegridview/data/header.qml b/tests/auto/declarative/qdeclarativegridview/data/header.qml
new file mode 100644
index 0000000..99baacd
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativegridview/data/header.qml
@@ -0,0 +1,32 @@
+import QtQuick 1.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            width: 80
+            height: 60
+            border.color: "blue"
+            Text {
+                text: index
+            }
+            color: GridView.isCurrentItem ? "lightsteelblue" : "white"
+        }
+    }
+    GridView {
+        id: grid
+        objectName: "grid"
+        width: 240
+        height: 320
+        cellWidth: 80
+        cellHeight: 60
+        model: testModel
+        delegate: myDelegate
+        header: Text { objectName: "header"; text: "Header"; height: 30 }
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
index 975cf8f..f7acd87 100644
--- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
+++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
@@ -82,6 +82,7 @@ private slots:
     void QTBUG_8456();
     void manualHighlight();
     void footer();
+    void header();
 
 private:
     QDeclarativeView *createView();
@@ -1214,6 +1215,40 @@ void tst_QDeclarativeGridView::footer()
     QTRY_COMPARE(footer->y(), 0.0);
 }
 
+void tst_QDeclarativeGridView::header()
+{
+    QDeclarativeView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 7; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
+    qApp->processEvents();
+
+    QDeclarativeGridView *gridview = findItem<QDeclarativeGridView>(canvas->rootObject(), "grid");
+    QTRY_VERIFY(gridview != 0);
+
+    QDeclarativeItem *contentItem = gridview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    QDeclarativeText *header = findItem<QDeclarativeText>(contentItem, "header");
+    QVERIFY(header);
+
+    QCOMPARE(header->y(), 0.0);
+    QCOMPARE(gridview->contentY(), 0.0);
+
+    QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0);
+    QVERIFY(item);
+    QCOMPARE(item->y(), 30.0);
+
+    model.clear();
+    QTRY_COMPARE(header->y(), 0.0);
+}
+
 
 QDeclarativeView *tst_QDeclarativeGridView::createView()
 {
-- 
cgit v0.12


From aa7fa8608939676ba56e130214b85f5d0c3745df Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Mon, 11 Oct 2010 11:24:05 +1000
Subject: Add a declarative callback for when a QObject's objectName changes

Task-number: QTBUG-13999
Reviewed-by: Martin Jones
---
 src/corelib/kernel/qobject.cpp | 6 ++++++
 src/corelib/kernel/qobject_p.h | 1 +
 2 files changed, 7 insertions(+)

diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 8330e47..579c225 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -127,6 +127,7 @@ extern "C" Q_CORE_EXPORT void qt_removeObject(QObject *)
 
 void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject *) = 0;
 void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = 0;
+void (*QAbstractDeclarativeData::objectNameChanged)(QAbstractDeclarativeData *, QObject *) = 0;
 
 QObjectData::~QObjectData() {}
 
@@ -1094,7 +1095,12 @@ QString QObject::objectName() const
 void QObject::setObjectName(const QString &name)
 {
     Q_D(QObject);
+    bool objectNameChanged = d->declarativeData && d->objectName != name;
+
     d->objectName = name;
+
+    if (objectNameChanged) 
+        d->declarativeData->objectNameChanged(d->declarativeData, this);
 }
 
 
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index 4800e6a..814769c 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -89,6 +89,7 @@ class Q_CORE_EXPORT QAbstractDeclarativeData
 public:
     static void (*destroyed)(QAbstractDeclarativeData *, QObject *);
     static void (*parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *);
+    static void (*objectNameChanged)(QAbstractDeclarativeData *, QObject *);
 };
 
 class Q_CORE_EXPORT QObjectPrivate : public QObjectData
-- 
cgit v0.12


From e11ee40cefc981fbdcfb10816039d4efb080fb17 Mon Sep 17 00:00:00 2001
From: Michael Brasser <michael.brasser@nokia.com>
Date: Mon, 11 Oct 2010 10:26:34 +1000
Subject: Don't give focus to a FocusScope that has had focus explicitly
 cleared.

If focus was explicitly cleared on a non-visible FocusScope, and then it
was made visible, it would incorrectly grab focus.

Task-number: QTBUG-13380
---
 src/gui/graphicsview/qgraphicsitem.cpp             | 16 ++++++++-----
 src/gui/graphicsview/qgraphicsitem_p.h             |  2 +-
 .../qdeclarativefocusscope/data/qtBug13380.qml     | 24 ++++++++++++++++++++
 .../tst_qdeclarativefocusscope.cpp                 | 26 ++++++++++++++++++++++
 tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp     |  3 +++
 5 files changed, 64 insertions(+), 7 deletions(-)
 create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml

diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 60cd020..e63acac 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -2365,7 +2365,7 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly, bo
                         while (fsi->d_ptr->focusScopeItem && fsi->d_ptr->focusScopeItem->isVisible())
                             fsi = fsi->d_ptr->focusScopeItem;
                         fsi->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ true,
-                                                   /* focusFromShow = */ true);
+                                                   /* focusFromHide = */ false);
                     }
                     break;
                 }
@@ -2375,6 +2375,10 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly, bo
                 QGraphicsItem *fi = subFocusItem;
                 if (fi && fi != scene->focusItem()) {
                     scene->setFocusItem(fi);
+                } else if (flags & QGraphicsItem::ItemIsFocusScope &&
+                           !scene->focusItem() &&
+                           q->isAncestorOf(scene->d_func()->lastFocusItem)) {
+                    q_ptr->setFocus();
                 }
             }
         } else {
@@ -2385,7 +2389,7 @@ void QGraphicsItemPrivate::setVisibleHelper(bool newVisible, bool explicitly, bo
                     if (p->flags() & QGraphicsItem::ItemIsFocusScope) {
                         if (p->d_ptr->visible) {
                             p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ true,
-                                                     /* focusFromShow = */ true);
+                                                     /* focusFromHide = */ true);
                         }
                         break;
                     }
@@ -3245,13 +3249,13 @@ bool QGraphicsItem::hasFocus() const
 */
 void QGraphicsItem::setFocus(Qt::FocusReason focusReason)
 {
-    d_ptr->setFocusHelper(focusReason, /* climb = */ true, /* focusFromShow = */ false);
+    d_ptr->setFocusHelper(focusReason, /* climb = */ true, /* focusFromHide = */ false);
 }
 
 /*!
     \internal
 */
-void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool climb, bool focusFromShow)
+void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool climb, bool focusFromHide)
 {
     // Disabled / unfocusable items cannot accept focus.
     if (!q_ptr->isEnabled() || !(flags & QGraphicsItem::ItemIsFocusable))
@@ -3272,7 +3276,7 @@ void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool clim
         if (p->flags() & QGraphicsItem::ItemIsFocusScope) {
             QGraphicsItem *oldFocusScopeItem = p->d_ptr->focusScopeItem;
             p->d_ptr->focusScopeItem = q_ptr;
-            if (!p->focusItem() && !focusFromShow) {
+            if (!p->focusItem() && !focusFromHide) {
                 if (oldFocusScopeItem)
                     oldFocusScopeItem->d_ptr->focusScopeItemChange(false);
                 focusScopeItemChange(true);
@@ -3334,7 +3338,7 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent)
             while (p) {
                 if (p->flags() & QGraphicsItem::ItemIsFocusScope) {
                     p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ false,
-                                             /* focusFromShow = */ false);
+                                             /* focusFromHide = */ false);
                     return;
                 }
                 p = p->d_ptr->parent;
diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h
index c8a7699..8480c19 100644
--- a/src/gui/graphicsview/qgraphicsitem_p.h
+++ b/src/gui/graphicsview/qgraphicsitem_p.h
@@ -477,7 +477,7 @@ public:
 
     inline void markParentDirty(bool updateBoundingRect = false);
 
-    void setFocusHelper(Qt::FocusReason focusReason, bool climb, bool focusFromShow);
+    void setFocusHelper(Qt::FocusReason focusReason, bool climb, bool focusFromHide);
     void clearFocusHelper(bool giveFocusToParent);
     void setSubFocus(QGraphicsItem *rootItem = 0);
     void clearSubFocus(QGraphicsItem *rootItem = 0);
diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml b/tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml
new file mode 100644
index 0000000..1784202
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml
@@ -0,0 +1,24 @@
+import QtQuick 1.0
+
+Rectangle {
+    width: 400; height: 400
+
+    property bool showRect: false
+    onShowRectChanged: if (showRect) rect.visible = true
+    property bool noFocus: !fs2.activeFocus
+
+    FocusScope {
+        id: fs1
+        focus: true
+    }
+    Rectangle {
+        id: rect
+        visible: false
+        FocusScope {
+            id: fs2
+            Rectangle {
+                focus: true
+            }
+        }
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp b/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp
index ec8f048..4cafbd9 100644
--- a/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp
+++ b/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp
@@ -70,6 +70,7 @@ private slots:
     void forceFocus();
     void noParentFocus();
     void signalEmission();
+    void qtBug13380();
 };
 
 /*
@@ -400,6 +401,31 @@ void tst_qdeclarativefocusscope::signalEmission()
     delete view;
 }
 
+void tst_qdeclarativefocusscope::qtBug13380()
+{
+    QDeclarativeView *view = new QDeclarativeView;
+    view->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtBug13380.qml"));
+
+    view->show();
+    QVERIFY(view->rootObject());
+    qApp->setActiveWindow(view);
+    qApp->processEvents();
+
+#ifdef Q_WS_X11
+    // to be safe and avoid failing setFocus with window managers
+    qt_x11_wait_for_window_manager(view);
+#endif
+
+    QVERIFY(view->hasFocus());
+    QVERIFY(view->scene()->hasFocus());
+    QVERIFY(view->rootObject()->property("noFocus").toBool());
+
+    view->rootObject()->setProperty("showRect", true);
+    QVERIFY(view->rootObject()->property("noFocus").toBool());
+
+    delete view;
+}
+
 QTEST_MAIN(tst_qdeclarativefocusscope)
 
 #include "tst_qdeclarativefocusscope.moc"
diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
index 2901dd5..2ddccd2 100644
--- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -9065,6 +9065,9 @@ void tst_QGraphicsItem::focusScope()
     scope2->hide();
     scope2->show();
     QVERIFY(!scope2->hasFocus());
+    QVERIFY(scope1->hasFocus());
+    scope2->setFocus();
+    scope3->setFocus();
     QVERIFY(scope3->hasFocus());
 
     QGraphicsRectItem *rect4 = new QGraphicsRectItem;
-- 
cgit v0.12


From f69eeec7030a5df12803a9128819207e3fc5bead Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Mon, 11 Oct 2010 11:43:59 +1000
Subject: Install the declarative objectNameChanged callback

Task-number: QTBUG-13999
---
 src/declarative/qml/qdeclarativedata_p.h   | 2 ++
 src/declarative/qml/qdeclarativeengine.cpp | 4 ++++
 2 files changed, 6 insertions(+)

diff --git a/src/declarative/qml/qdeclarativedata_p.h b/src/declarative/qml/qdeclarativedata_p.h
index e916273..c7857b7 100644
--- a/src/declarative/qml/qdeclarativedata_p.h
+++ b/src/declarative/qml/qdeclarativedata_p.h
@@ -82,10 +82,12 @@ public:
     static inline void init() {
         QAbstractDeclarativeData::destroyed = destroyed;
         QAbstractDeclarativeData::parentChanged = parentChanged;
+        QAbstractDeclarativeData::objectNameChanged = objectNameChanged;
     }
 
     static void destroyed(QAbstractDeclarativeData *, QObject *);
     static void parentChanged(QAbstractDeclarativeData *, QObject *, QObject *);
+    static void objectNameChanged(QAbstractDeclarativeData *, QObject *);
 
     void destroyed(QObject *);
     void parentChanged(QObject *, QObject *);
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 0749767..dfc29c4 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -468,6 +468,10 @@ void QDeclarativeData::parentChanged(QAbstractDeclarativeData *d, QObject *o, QO
     static_cast<QDeclarativeData *>(d)->parentChanged(o, p);
 }
 
+void QDeclarativeData::objectNameChanged(QAbstractDeclarativeData *d, QObject *o)
+{
+}
+
 void QDeclarativeEnginePrivate::init()
 {
     Q_Q(QDeclarativeEngine);
-- 
cgit v0.12


From 759da9b325f19670a3d79ede5f06fb3fa1f95495 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Mon, 11 Oct 2010 12:07:24 +1000
Subject: Allow objectName to be used in QML bindings

Task-number: QTBUG-13999
---
 src/declarative/qml/qdeclarativedata_p.h           | 18 +++++++--
 src/declarative/qml/qdeclarativeengine.cpp         | 43 ++++++++++++++++++----
 src/declarative/qml/qdeclarativefastproperties.cpp |  9 +++++
 .../qml/qdeclarativeobjectscriptclass.cpp          |  9 ++++-
 .../qdeclarativeecmascript/data/objectName.qml     |  8 ++++
 .../tst_qdeclarativeecmascript.cpp                 | 19 ++++++++++
 6 files changed, 93 insertions(+), 13 deletions(-)
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml

diff --git a/src/declarative/qml/qdeclarativedata_p.h b/src/declarative/qml/qdeclarativedata_p.h
index c7857b7..def4188 100644
--- a/src/declarative/qml/qdeclarativedata_p.h
+++ b/src/declarative/qml/qdeclarativedata_p.h
@@ -64,6 +64,7 @@ class QDeclarativeAbstractBinding;
 class QDeclarativeContext;
 class QDeclarativePropertyCache;
 class QDeclarativeContextData;
+class QDeclarativeNotifier;
 // This class is structured in such a way, that simply zero'ing it is the
 // default state for elemental object allocations.  This is crucial in the
 // workings of the QDeclarativeInstruction::CreateSimpleObject instruction.
@@ -75,7 +76,7 @@ public:
         : ownMemory(true), ownContext(false), indestructible(true), explicitIndestructibleSet(false), 
           context(0), outerContext(0), bindings(0), nextContextObject(0), prevContextObject(0), bindingBitsSize(0), 
           bindingBits(0), lineNumber(0), columnNumber(0), deferredComponent(0), deferredIdx(0), 
-          attachedProperties(0), scriptValue(0), objectDataRefCount(0), propertyCache(0), guards(0) { 
+          scriptValue(0), objectDataRefCount(0), propertyCache(0), guards(0), extendedData(0) {
           init(); 
       }
 
@@ -91,6 +92,7 @@ public:
 
     void destroyed(QObject *);
     void parentChanged(QObject *, QObject *);
+    void objectNameChanged(QObject *);
 
     void setImplicitDestructible() {
         if (!explicitIndestructibleSet) indestructible = false;
@@ -125,8 +127,6 @@ public:
     QDeclarativeCompiledData *deferredComponent; // Can't this be found from the context?
     unsigned int deferredIdx;
 
-    QHash<int, QObject *> *attachedProperties;
-
     // ### Can we make this QScriptValuePrivate so we incur no additional allocation
     // cost?
     QScriptValue *scriptValue;
@@ -149,6 +149,18 @@ public:
             return 0;
         }
     }
+
+    QDeclarativeNotifier *objectNameNotifier() const;
+    QHash<int, QObject *> *attachedProperties() const;
+
+    struct ExtendedData {
+        ExtendedData();
+        ~ExtendedData();
+
+        QHash<int, QObject *> attachedProperties;
+        void *objectNameNotifier;
+    };
+    mutable ExtendedData *extendedData;
 };
 
 template<class T>
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index dfc29c4..7ed925a 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -68,6 +68,7 @@
 #include "private/qdeclarativelist_p.h"
 #include "private/qdeclarativetypenamecache_p.h"
 #include "private/qdeclarativeinclude_p.h"
+#include "private/qdeclarativenotifier_p.h"
 
 #include <QtCore/qmetaobject.h>
 #include <QScriptClass>
@@ -470,6 +471,7 @@ void QDeclarativeData::parentChanged(QAbstractDeclarativeData *d, QObject *o, QO
 
 void QDeclarativeData::objectNameChanged(QAbstractDeclarativeData *d, QObject *o)
 {
+    static_cast<QDeclarativeData *>(d)->objectNameChanged(o);
 }
 
 void QDeclarativeEnginePrivate::init()
@@ -953,7 +955,7 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool cre
     if (!data)
         return 0; // Attached properties are only on objects created by QML
 
-    QObject *rv = data->attachedProperties?data->attachedProperties->value(id):0;
+    QObject *rv = data->extendedData?data->attachedProperties()->value(id):0;
     if (rv || !create)
         return rv;
 
@@ -963,11 +965,8 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool cre
 
     rv = pf(const_cast<QObject *>(object));
 
-    if (rv) {
-        if (!data->attachedProperties)
-            data->attachedProperties = new QHash<int, QObject *>();
-        data->attachedProperties->insert(id, rv);
-    }
+    if (rv) 
+        data->attachedProperties()->insert(id, rv);
 
     return rv;
 }
@@ -988,8 +987,6 @@ void QDeclarativeData::destroyed(QObject *object)
 {
     if (deferredComponent)
         deferredComponent->release();
-    if (attachedProperties)
-        delete attachedProperties;
 
     if (nextContextObject)
         nextContextObject->prevContextObject = prevContextObject;
@@ -1023,6 +1020,9 @@ void QDeclarativeData::destroyed(QObject *object)
     if (scriptValue)
         delete scriptValue;
 
+    if (extendedData)
+        delete extendedData;
+
     if (ownMemory)
         delete this;
 }
@@ -1032,6 +1032,11 @@ void QDeclarativeData::parentChanged(QObject *, QObject *parent)
     if (!parent && scriptValue) { delete scriptValue; scriptValue = 0; }
 }
 
+void QDeclarativeData::objectNameChanged(QObject *)
+{
+    if (extendedData) objectNameNotifier()->notify();
+}
+
 bool QDeclarativeData::hasBindingBit(int bit) const
 {
     if (bindingBitsSize > bit)
@@ -1068,6 +1073,28 @@ void QDeclarativeData::setBindingBit(QObject *obj, int bit)
     bindingBits[bit / 32] |= (1 << (bit % 32));
 }
 
+QDeclarativeData::ExtendedData::ExtendedData()
+: objectNameNotifier(0)
+{
+}
+
+QDeclarativeData::ExtendedData::~ExtendedData()
+{
+    ((QDeclarativeNotifier *)&objectNameNotifier)->~QDeclarativeNotifier();
+}
+
+QDeclarativeNotifier *QDeclarativeData::objectNameNotifier() const
+{
+    if (!extendedData) extendedData = new ExtendedData;
+    return (QDeclarativeNotifier *)&extendedData->objectNameNotifier;
+}
+
+QHash<int, QObject *> *QDeclarativeData::attachedProperties() const
+{
+    if (!extendedData) extendedData = new ExtendedData;
+    return &extendedData->attachedProperties;
+}
+
 /*!
     Creates a QScriptValue allowing you to use \a object in QML script.
     \a engine is the QDeclarativeEngine it is to be created in.
diff --git a/src/declarative/qml/qdeclarativefastproperties.cpp b/src/declarative/qml/qdeclarativefastproperties.cpp
index eb69b6a..78e3afd 100644
--- a/src/declarative/qml/qdeclarativefastproperties.cpp
+++ b/src/declarative/qml/qdeclarativefastproperties.cpp
@@ -51,10 +51,19 @@ QT_BEGIN_NAMESPACE
 // primarily read from bindings is a candidate for inclusion as a fast 
 // property.
 
+static void QObject_objectName(QObject *object, void *output, QDeclarativeNotifierEndpoint *endpoint)
+{
+    if (endpoint) 
+        endpoint->connect(QDeclarativeData::get(object, true)->objectNameNotifier());
+    *((QString *)output) = object->objectName();
+}
+
 QDeclarativeFastProperties::QDeclarativeFastProperties()
 {
     add(&QDeclarativeItem::staticMetaObject, QDeclarativeItem::staticMetaObject.indexOfProperty("parent"),
         QDeclarativeItemPrivate::parentProperty);
+    add(&QObject::staticMetaObject, QObject::staticMetaObject.indexOfProperty("objectName"),
+        QObject_objectName);    
 }
 
 int QDeclarativeFastProperties::accessorIndexForProperty(const QMetaObject *metaObject, int propertyIndex)
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index ab6ff74..61a1f55 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -239,8 +239,13 @@ QDeclarativeObjectScriptClass::property(QObject *obj, const Identifier &name)
         }
     } else {
         if (enginePriv->captureProperties && !(lastData->flags & QDeclarativePropertyCache::Data::IsConstant)) {
-            enginePriv->capturedProperties <<
-                QDeclarativeEnginePrivate::CapturedProperty(obj, lastData->coreIndex, lastData->notifyIndex);
+            if (lastData->coreIndex == 0) {
+                enginePriv->capturedProperties <<
+                    QDeclarativeEnginePrivate::CapturedProperty(QDeclarativeData::get(obj, true)->objectNameNotifier());
+            } else {
+                enginePriv->capturedProperties <<
+                    QDeclarativeEnginePrivate::CapturedProperty(obj, lastData->coreIndex, lastData->notifyIndex);
+            }
         }
 
         if (QDeclarativeValueTypeFactory::isValueType((uint)lastData->propType)) {
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml b/tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml
new file mode 100644
index 0000000..ca8c90d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+
+QtObject {
+    objectName: "hello"
+
+    property string test1: objectName
+    property string test2: objectName.substr(1, 3)
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 4feb630..02832f3 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -162,6 +162,7 @@ private slots:
     void deleteLater();
     void in();
     void sharedAttachedObject();
+    void objectName();
 
     void include();
 
@@ -2594,6 +2595,24 @@ void tst_qdeclarativeecmascript::sharedAttachedObject()
     delete o;
 }
 
+// QTBUG-13999
+void tst_qdeclarativeecmascript::objectName()
+{
+    QDeclarativeComponent component(&engine, TEST_FILE("objectName.qml"));
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+
+    QCOMPARE(o->property("test1").toString(), QString("hello"));
+    QCOMPARE(o->property("test2").toString(), QString("ell"));
+
+    o->setObjectName("world");
+
+    QCOMPARE(o->property("test1").toString(), QString("world"));
+    QCOMPARE(o->property("test2").toString(), QString("orl"));
+
+    delete o;
+}
+
 QTEST_MAIN(tst_qdeclarativeecmascript)
 
 #include "tst_qdeclarativeecmascript.moc"
-- 
cgit v0.12


From e67800d9e0dc82a38b01c9b8eff4dc1a10f306d8 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Mon, 11 Oct 2010 13:29:04 +1000
Subject: Test for absent qmldir

Task-number: QTBUG-13051
---
 .../qtest/declarative/qmllanguage/noqmldir/Test.qml                     | 2 ++
 .../auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp  | 1 +
 2 files changed, 3 insertions(+)
 create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml

diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml
new file mode 100644
index 0000000..0b054d0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml
@@ -0,0 +1,2 @@
+import QtQuick 1.0
+Rectangle { }
diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
index 6a45957..be04dee 100644
--- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
@@ -1569,6 +1569,7 @@ void tst_qdeclarativelanguage::basicRemote_data()
     QString serverdir = "http://127.0.0.1:14447/qtest/declarative/qmllanguage/";
 
     QTest::newRow("no need for qmldir") << QUrl(serverdir+"Test.qml") << "" << "";
+    QTest::newRow("absent qmldir") << QUrl(serverdir+"/noqmldir/Test.qml") << "" << "";
     QTest::newRow("need qmldir") << QUrl(serverdir+"TestLocal.qml") << "" << "";
 }
 
-- 
cgit v0.12


From 9849d8f5f1c0c3f03d3f83cc51eea2beb3d9cbbc Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Mon, 11 Oct 2010 18:07:35 +1000
Subject: Fix autotest on windows

---
 src/declarative/qml/qdeclarativeengine.cpp                   | 12 ++++++++++++
 .../tst_qdeclarativemoduleplugin.cpp                         |  7 ++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 7ed925a..d768882 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -2196,7 +2196,19 @@ bool QDeclarative_isFileCaseCorrect(const QString &fileName)
     QFileInfo info(fileName);
 
     QString absolute = info.absoluteFilePath();
+
+#if defined(Q_OS_MAC)
     QString canonical = info.canonicalFilePath();
+#elif defined(Q_OS_WIN)
+    wchar_t buffer[1024];
+
+    DWORD rv = ::GetShortPathName((wchar_t*)absolute.utf16(), buffer, 1024);
+    if (rv == 0 || rv >= 1024) return true;
+    rv = ::GetLongPathName(buffer, buffer, 1024);
+    if (rv == 0 || rv >= 1024) return true;
+
+    QString canonical((QChar *)buffer);
+#endif
 
     int absoluteLength = absolute.length();
     int canonicalLength = canonical.length();
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
index 587a86a..51f66a5 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
@@ -132,7 +132,12 @@ void tst_qdeclarativemoduleplugin::incorrectPluginCase()
     QCOMPARE(errors.count(), 1);
 
 #if defined(Q_OS_MAC) || defined(Q_OS_WIN)
-    QString expectedError = QLatin1String("plugin cannot be loaded for module \"com.nokia.WrongCase\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("imports/com/nokia/WrongCase/libPluGin.dylib") + QLatin1String("\"");
+#if defined(Q_OS_MAC)
+    QString libname = "libPluGin.dylib";
+#elif defined(Q_OS_WIN)
+    QString libname = "PluGin.dll";
+#endif
+    QString expectedError = QLatin1String("plugin cannot be loaded for module \"com.nokia.WrongCase\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("imports/com/nokia/WrongCase/" + libname) + QLatin1String("\"");
 #else
     QString expectedError = QLatin1String("module \"com.nokia.WrongCase\" plugin \"PluGin\" not found");
 #endif
-- 
cgit v0.12


From 650a0078e2cef43eff107fe8d2505f64a0bfedf0 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Tue, 12 Oct 2010 13:11:38 +1000
Subject: Update sections if model content changes. We didn't handle the
 section property changing, e.g. due to asynchronous model.

Task-number: QT-4093
Reviewed-by: Aaron Kennedy
---
 .../graphicsitems/qdeclarativelistview.cpp         | 40 ++++++++++++++++++++--
 .../graphicsitems/qdeclarativelistview_p.h         |  2 ++
 .../graphicsitems/qdeclarativevisualitemmodel.cpp  | 21 ++++++++++++
 .../graphicsitems/qdeclarativevisualitemmodel_p.h  |  4 +++
 .../tst_qdeclarativelistview.cpp                   | 11 ++++++
 5 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 4943aef..6fd3b71 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -775,7 +775,6 @@ void QDeclarativeListViewPrivate::layout()
         setPosition(0);
         return;
     }
-    updateSections();
     if (!visibleItems.isEmpty()) {
         qreal oldEnd = visibleItems.last()->endPosition();
         qreal pos = visibleItems.first()->endPosition() + spacing + 1;
@@ -934,6 +933,7 @@ void QDeclarativeListViewPrivate::createSection(FxListItem *listItem)
         return;
     if (listItem->attached->m_prevSection != listItem->attached->m_section) {
         if (!listItem->section) {
+            qreal pos = listItem->position();
             int i = sectionCacheSize-1;
             while (i >= 0 && !sectionCache[i])
                 --i;
@@ -961,8 +961,10 @@ void QDeclarativeListViewPrivate::createSection(FxListItem *listItem)
                     delete context;
                 }
             }
+            listItem->setPosition(pos);
         }
     } else if (listItem->section) {
+        qreal pos = listItem->position();
         int i = 0;
         do {
             if (!sectionCache[i]) {
@@ -975,12 +977,13 @@ void QDeclarativeListViewPrivate::createSection(FxListItem *listItem)
         } while (i < sectionCacheSize);
         delete listItem->section;
         listItem->section = 0;
+        listItem->setPosition(pos);
     }
 }
 
 void QDeclarativeListViewPrivate::updateSections()
 {
-    if (sectionCriteria) {
+    if (sectionCriteria && !visibleItems.isEmpty()) {
         QString prevSection;
         if (visibleIndex > 0)
             prevSection = sectionAt(visibleIndex-1);
@@ -990,6 +993,8 @@ void QDeclarativeListViewPrivate::updateSections()
             if (visibleItems.at(i)->index != -1) {
                 QDeclarativeListViewAttached *attached = visibleItems.at(i)->attached;
                 attached->setPrevSection(prevSection);
+                QString propValue = model->stringValue(visibleItems.at(i)->index, sectionCriteria->property());
+                attached->setSection(sectionCriteria->sectionString(propValue));
                 if (prevAtt)
                     prevAtt->setNextSection(attached->section());
                 createSection(visibleItems.at(i));
@@ -1560,6 +1565,7 @@ void QDeclarativeListView::setModel(const QVariant &model)
         disconnect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
         disconnect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
         disconnect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        disconnect(d->model, SIGNAL(itemsChanged(int,int)), this, SLOT(itemsChanged(int,int)));
         disconnect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
         disconnect(d->model, SIGNAL(createdItem(int, QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
         disconnect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
@@ -1590,6 +1596,7 @@ void QDeclarativeListView::setModel(const QVariant &model)
     if (d->model) {
         d->bufferMode = QDeclarativeListViewPrivate::BufferBefore | QDeclarativeListViewPrivate::BufferAfter;
         if (isComponentComplete()) {
+            updateSections();
             refill();
             if (d->currentIndex >= d->model->count() || d->currentIndex < 0) {
                 setCurrentIndex(0);
@@ -1605,6 +1612,7 @@ void QDeclarativeListView::setModel(const QVariant &model)
         connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
         connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
         connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
+        connect(d->model, SIGNAL(itemsChanged(int,int)), this, SLOT(itemsChanged(int,int)));
         connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
         connect(d->model, SIGNAL(createdItem(int, QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
         connect(d->model, SIGNAL(destroyingItem(QDeclarativeItem*)), this, SLOT(destroyingItem(QDeclarativeItem*)));
@@ -1662,6 +1670,7 @@ void QDeclarativeListView::setDelegate(QDeclarativeComponent *delegate)
             d->visibleItems.clear();
             d->releaseItem(d->currentItem);
             d->currentItem = 0;
+            updateSections();
             refill();
             d->moveReason = QDeclarativeListViewPrivate::SetIndex;
             d->updateCurrent(d->currentIndex);
@@ -2075,8 +2084,10 @@ void QDeclarativeListView::setCacheBuffer(int b)
 QDeclarativeViewSection *QDeclarativeListView::sectionCriteria()
 {
     Q_D(QDeclarativeListView);
-    if (!d->sectionCriteria)
+    if (!d->sectionCriteria) {
         d->sectionCriteria = new QDeclarativeViewSection(this);
+        connect(d->sectionCriteria, SIGNAL(propertyChanged()), this, SLOT(updateSections()));
+    }
     return d->sectionCriteria;
 }
 
@@ -2669,6 +2680,7 @@ void QDeclarativeListView::componentComplete()
 {
     Q_D(QDeclarativeListView);
     QDeclarativeFlickable::componentComplete();
+    updateSections();
     if (d->isValid()) {
         refill();
         d->moveReason = QDeclarativeListViewPrivate::SetIndex;
@@ -2685,6 +2697,18 @@ void QDeclarativeListView::componentComplete()
     }
 }
 
+void QDeclarativeListView::updateSections()
+{
+    Q_D(QDeclarativeListView);
+    if (isComponentComplete() && d->model) {
+        QList<QByteArray> roles;
+        if (d->sectionCriteria && !d->sectionCriteria->property().isEmpty())
+            roles << d->sectionCriteria->property().toUtf8();
+        d->model->setWatchedRoles(roles);
+        d->updateSections();
+    }
+}
+
 void QDeclarativeListView::refill()
 {
     Q_D(QDeclarativeListView);
@@ -2894,6 +2918,7 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
     for (int j = 0; j < added.count(); ++j)
         added.at(j)->attached->emitAdd();
 
+    d->updateSections();
     d->itemCount += count;
     emit countChanged();
 }
@@ -2986,6 +3011,7 @@ void QDeclarativeListView::itemsRemoved(int modelIndex, int count)
         }
     }
 
+    d->updateSections();
     emit countChanged();
 }
 
@@ -3107,6 +3133,14 @@ void QDeclarativeListView::itemsMoved(int from, int to, int count)
     // Ensure we don't cause an ugly list scroll.
     d->visibleItems.first()->setPosition(d->visibleItems.first()->position() + moveBy);
 
+    d->updateSections();
+    d->layout();
+}
+
+void QDeclarativeListView::itemsChanged(int, int)
+{
+    Q_D(QDeclarativeListView);
+    d->updateSections();
     d->layout();
 }
 
diff --git a/src/declarative/graphicsitems/qdeclarativelistview_p.h b/src/declarative/graphicsitems/qdeclarativelistview_p.h
index 735b248..2678b90 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview_p.h
+++ b/src/declarative/graphicsitems/qdeclarativelistview_p.h
@@ -250,11 +250,13 @@ protected:
     virtual void componentComplete();
 
 private Q_SLOTS:
+    void updateSections();
     void refill();
     void trackedPositionChanged();
     void itemsInserted(int index, int count);
     void itemsRemoved(int index, int count);
     void itemsMoved(int from, int to, int count);
+    void itemsChanged(int index, int count);
     void modelReset();
     void destroyRemoved();
     void createdItem(int index, QDeclarativeItem *item);
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
index 439f500..e569dd2 100644
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
+++ b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
@@ -403,6 +403,8 @@ public:
     QDeclarativeListAccessor *m_listAccessor;
 
     QModelIndex m_root;
+    QList<QByteArray> watchedRoles;
+    QList<int> watchedRoleIds;
 };
 
 class QDeclarativeVisualDataModelDataMetaObject : public QDeclarativeOpenMetaObject
@@ -1170,10 +1172,25 @@ int QDeclarativeVisualDataModel::indexOf(QDeclarativeItem *item, QObject *) cons
     return -1;
 }
 
+void QDeclarativeVisualDataModel::setWatchedRoles(QList<QByteArray> roles)
+{
+    Q_D(QDeclarativeVisualDataModel);
+    d->watchedRoles = roles;
+    d->watchedRoleIds.clear();
+}
+
 void QDeclarativeVisualDataModel::_q_itemsChanged(int index, int count,
                                          const QList<int> &roles)
 {
     Q_D(QDeclarativeVisualDataModel);
+    bool changed = false;
+    if (!d->watchedRoles.isEmpty() && d->watchedRoleIds.isEmpty()) {
+        foreach (QByteArray r, d->watchedRoles) {
+            if (d->m_roleNames.contains(r))
+                d->watchedRoleIds << d->m_roleNames.value(r);
+        }
+    }
+
     for (QHash<int,QDeclarativeVisualDataModelPrivate::ObjectRef>::ConstIterator iter = d->m_cache.begin();
         iter != d->m_cache.end(); ++iter) {
         const int idx = iter.key();
@@ -1183,6 +1200,8 @@ void QDeclarativeVisualDataModel::_q_itemsChanged(int index, int count,
             QDeclarativeVisualDataModelData *data = d->data(objRef.obj);
             for (int roleIdx = 0; roleIdx < roles.count(); ++roleIdx) {
                 int role = roles.at(roleIdx);
+                if (!changed && !d->watchedRoleIds.isEmpty() && d->watchedRoleIds.contains(role))
+                    changed = true;
                 int propId = data->propForRole(role);
                 if (propId != -1) {
                     if (data->hasValue(propId)) {
@@ -1217,6 +1236,8 @@ void QDeclarativeVisualDataModel::_q_itemsChanged(int index, int count,
             }
         }
     }
+    if (changed)
+        emit itemsChanged(index, count);
 }
 
 void QDeclarativeVisualDataModel::_q_itemsInserted(int index, int count)
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h b/src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h
index f09d8dd..5e187c2 100644
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h
+++ b/src/declarative/graphicsitems/qdeclarativevisualitemmodel_p.h
@@ -79,6 +79,7 @@ public:
     virtual bool completePending() const = 0;
     virtual void completeItem() = 0;
     virtual QString stringValue(int, const QString &) = 0;
+    virtual void setWatchedRoles(QList<QByteArray> roles) = 0;
 
     virtual int indexOf(QDeclarativeItem *item, QObject *objectContext) const = 0;
 
@@ -87,6 +88,7 @@ Q_SIGNALS:
     void itemsInserted(int index, int count);
     void itemsRemoved(int index, int count);
     void itemsMoved(int from, int to, int count);
+    void itemsChanged(int index, int count);
     void modelReset();
     void createdItem(int index, QDeclarativeItem *item);
     void destroyingItem(QDeclarativeItem *item);
@@ -120,6 +122,7 @@ public:
     virtual bool completePending() const;
     virtual void completeItem();
     virtual QString stringValue(int index, const QString &role);
+    virtual void setWatchedRoles(QList<QByteArray>) {}
 
     virtual int indexOf(QDeclarativeItem *item, QObject *objectContext) const;
 
@@ -174,6 +177,7 @@ public:
     bool completePending() const;
     void completeItem();
     virtual QString stringValue(int index, const QString &role);
+    virtual void setWatchedRoles(QList<QByteArray> roles);
 
     int indexOf(QDeclarativeItem *item, QObject *objectContext) const;
 
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index 65ff635..7a58773 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -985,6 +985,17 @@ void tst_QDeclarativeListView::sections()
     QTRY_VERIFY(item);
     QTRY_COMPARE(item->height(), 20.0);
 
+    // check that headers change when item changes
+    listview->setContentY(0);
+    model.modifyItem(0, "changed", "2");
+
+    canvas->show();
+    qApp->exec();
+
+    item = findItem<QDeclarativeItem>(contentItem, "wrapper", 1);
+    QTRY_VERIFY(item);
+    QTRY_COMPARE(item->height(), 40.0);
+
     delete canvas;
 }
 
-- 
cgit v0.12


From e4dbf0c82b46e7a32e21185c8f633506229be944 Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Tue, 12 Oct 2010 14:35:22 +1000
Subject: Bug: TextEdit ignores plain text format when pasting text

Task-number: QTBUG-14003
Reviewed-by: Michael Brasser
---
 .../graphicsitems/qdeclarativetextedit.cpp         |  1 +
 .../tst_qdeclarativetextedit.cpp                   | 25 ++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index 6f5608a..e05f4e4 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -319,6 +319,7 @@ void QDeclarativeTextEdit::setTextFormat(TextFormat format)
         updateSize();
     }
     d->format = format;
+    d->control->setAcceptRichText(d->format != PlainText);
     emit textFormatChanged(d->format);
 }
 
diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
index 472c5ef..a7971cc 100644
--- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
+++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
@@ -56,6 +56,8 @@
 #include <QDir>
 #include <QStyle>
 #include <QInputContext>
+#include <QClipboard>
+#include <QMimeData>
 #include <private/qapplication_p.h>
 #include <private/qtextcontrol_p.h>
 
@@ -119,6 +121,8 @@ private slots:
     void openInputPanelOnClick();
     void openInputPanelOnFocus();
     void geometrySignals();
+    void pastingRichText_QTBUG_14003();
+
 private:
     void simulateKey(QDeclarativeView *, int key);
     QDeclarativeView *createView(const QString &filename);
@@ -1174,6 +1178,27 @@ void tst_qdeclarativetextedit::geometrySignals()
     delete o;
 }
 
+void tst_qdeclarativetextedit::pastingRichText_QTBUG_14003()
+{
+#ifndef QT_NO_CLIPBOARD
+    QString componentStr = "import QtQuick 1.0\nTextEdit { textFormat: TextEdit.PlainText }";
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QDeclarativeTextEdit *obj = qobject_cast<QDeclarativeTextEdit*>(component.create());
+
+    QTRY_VERIFY(obj != 0);
+    QTRY_VERIFY(obj->textFormat() == QDeclarativeTextEdit::PlainText);
+
+    QMimeData *mData = new QMimeData;
+    mData->setHtml("<font color=\"red\">Hello</font>");
+    QApplication::clipboard()->setMimeData(mData);
+
+    obj->paste();
+    QTRY_VERIFY(obj->text() == "");
+    QTRY_VERIFY(obj->textFormat() == QDeclarativeTextEdit::PlainText);
+#endif
+}
+
 QTEST_MAIN(tst_qdeclarativetextedit)
 
 #include "tst_qdeclarativetextedit.moc"
-- 
cgit v0.12


From 99390f4d639e35f3b0606df4d2abbcd3879f128f Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Tue, 12 Oct 2010 16:06:07 +1000
Subject: Compile on MSVC2008

---
 src/declarative/qml/qdeclarativeengine.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index d768882..ec583f9 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -105,6 +105,7 @@
 #ifdef Q_OS_WIN // for %APPDATA%
 #include <qt_windows.h>
 #include <qlibrary.h>
+#include <windows.h>
 
 #define CSIDL_APPDATA		0x001a	// <username>\Application Data
 #endif
@@ -2202,9 +2203,7 @@ bool QDeclarative_isFileCaseCorrect(const QString &fileName)
 #elif defined(Q_OS_WIN)
     wchar_t buffer[1024];
 
-    DWORD rv = ::GetShortPathName((wchar_t*)absolute.utf16(), buffer, 1024);
-    if (rv == 0 || rv >= 1024) return true;
-    rv = ::GetLongPathName(buffer, buffer, 1024);
+    DWORD rv = ::GetLongPathName((wchar_t*)absolute.utf16(), buffer, 1024);
     if (rv == 0 || rv >= 1024) return true;
 
     QString canonical((QChar *)buffer);
-- 
cgit v0.12


From 912085070b97af83a88d7de181cb0c5ef946589c Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Tue, 12 Oct 2010 17:14:15 +1000
Subject: Update QtCore def files

---
 src/s60installs/bwins/QtCoreu.def | 1 +
 src/s60installs/eabi/QtCoreu.def  | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/s60installs/bwins/QtCoreu.def b/src/s60installs/bwins/QtCoreu.def
index 5eeb244..f4e3a28 100644
--- a/src/s60installs/bwins/QtCoreu.def
+++ b/src/s60installs/bwins/QtCoreu.def
@@ -4483,4 +4483,5 @@ EXPORTS
 	?msecsSinceReference@QElapsedTimer@@QBE_JXZ @ 4482 NONAME ; long long QElapsedTimer::msecsSinceReference(void) const
 	?selectThread@QEventDispatcherSymbian@@AAEAAVQSelectThread@@XZ @ 4483 NONAME ; class QSelectThread & QEventDispatcherSymbian::selectThread(void)
 	?qt_symbian_SetupThreadHeap@@YAHHAAUSStdEpocThreadCreateInfo@@@Z @ 4484 NONAME ; int qt_symbian_SetupThreadHeap(int, struct SStdEpocThreadCreateInfo &)
+	?objectNameChanged@QAbstractDeclarativeData@@2P6AXPAV1@PAVQObject@@@ZA @ 4485 NONAME ; void (*QAbstractDeclarativeData::objectNameChanged)(class QAbstractDeclarativeData *, class QObject *)
 
diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index f496839..eb53dca 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -3712,4 +3712,5 @@ EXPORTS
 	_ZltRK13QElapsedTimerS1_ @ 3711 NONAME
 	_ZrsR11QDataStreamR12QEasingCurve @ 3712 NONAME
 	_Z26qt_symbian_SetupThreadHeapiR24SStdEpocThreadCreateInfo @ 3713 NONAME
+	_ZN24QAbstractDeclarativeData17objectNameChangedE @ 3714 NONAME DATA 4
 
-- 
cgit v0.12


From c284a54ac24b6ff800b66c193016cc98d6305293 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Tue, 12 Oct 2010 17:14:33 +1000
Subject: Update QtDeclarative def files

---
 src/s60installs/bwins/QtDeclarativeu.def | 1 +
 src/s60installs/eabi/QtDeclarativeu.def  | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/s60installs/bwins/QtDeclarativeu.def b/src/s60installs/bwins/QtDeclarativeu.def
index cf0398a..b72147e 100644
--- a/src/s60installs/bwins/QtDeclarativeu.def
+++ b/src/s60installs/bwins/QtDeclarativeu.def
@@ -1838,4 +1838,5 @@ EXPORTS
 	?addChanged@QDeclarativeBasePositioner@@IAEXXZ @ 1837 NONAME ; void QDeclarativeBasePositioner::addChanged(void)
 	?start@QDeclarativeAbstractAnimation@@QAEXXZ @ 1838 NONAME ; void QDeclarativeAbstractAnimation::start(void)
 	?qt_metacall@QDeclarativeAbstractAnimation@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1839 NONAME ; int QDeclarativeAbstractAnimation::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?connect@QDeclarativePropertyPrivate@@SA_NPBVQObject@@H0HHPAH@Z @ 1840 NONAME ; bool QDeclarativePropertyPrivate::connect(class QObject const *, int, class QObject const *, int, int, int *)
 
diff --git a/src/s60installs/eabi/QtDeclarativeu.def b/src/s60installs/eabi/QtDeclarativeu.def
index d4084cc..cbfafdc 100644
--- a/src/s60installs/eabi/QtDeclarativeu.def
+++ b/src/s60installs/eabi/QtDeclarativeu.def
@@ -1883,4 +1883,5 @@ EXPORTS
 	_ZThn8_N29QDeclarativeAbstractAnimation9setTargetERK20QDeclarativeProperty @ 1882 NONAME
 	_ZThn8_N29QDeclarativeAbstractAnimationD0Ev @ 1883 NONAME
 	_ZThn8_N29QDeclarativeAbstractAnimationD1Ev @ 1884 NONAME
+	_ZN27QDeclarativePropertyPrivate7connectEPK7QObjectiS2_iiPi @ 1885 NONAME
 
-- 
cgit v0.12


From 71de6cd879f2f79900bda83cc4ba48f6df051d66 Mon Sep 17 00:00:00 2001
From: Jani Hautakangas <jani.hautakangas@nokia.com>
Date: Tue, 12 Oct 2010 12:41:26 +0300
Subject: Fix for CFbsBitmap to QPixmap conversion.

Symbian bitmap formats may have different scanline length
when compared to QImage formats. We need to define scanline
length for intermediate QImage when converting from CFbsBitmap
to QPixmap.

Task-number: QTBUG-14218
Reviewed-by: Jason Barron
---
 src/gui/image/qpixmap_s60.cpp      |  3 ++-
 src/openvg/qvg_symbian.cpp         |  3 ++-
 tests/auto/qpixmap/tst_qpixmap.cpp | 11 +++++++++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/gui/image/qpixmap_s60.cpp b/src/gui/image/qpixmap_s60.cpp
index 47249d9..b7c8acb 100644
--- a/src/gui/image/qpixmap_s60.cpp
+++ b/src/gui/image/qpixmap_s60.cpp
@@ -968,11 +968,12 @@ void QS60PixmapData::fromNativeType(void* pixmap, NativeType nativeType)
         if (needsCopy) {
 
             TSize size = sourceBitmap->SizeInPixels();
+            int bytesPerLine = sourceBitmap->ScanLineLength(size.iWidth, displayMode);
 
             QSymbianBitmapDataAccess da;
             da.beginDataAccess(sourceBitmap);
             uchar *bytes = (uchar*)sourceBitmap->DataAddress();
-            QImage img = QImage(bytes, size.iWidth, size.iHeight, format);
+            QImage img = QImage(bytes, size.iWidth, size.iHeight, bytesPerLine, format);
             img = img.copy();
             da.endDataAccess(sourceBitmap);
 
diff --git a/src/openvg/qvg_symbian.cpp b/src/openvg/qvg_symbian.cpp
index a9625b2..41b35fc 100644
--- a/src/openvg/qvg_symbian.cpp
+++ b/src/openvg/qvg_symbian.cpp
@@ -185,10 +185,11 @@ void QVGPixmapData::fromNativeType(void* pixmap, NativeType type)
         QImage::Format format = qt_TDisplayMode2Format(displayMode);
 
         TSize size = bitmap->SizeInPixels();
+        int bytesPerLine = bitmap->ScanLineLength(size.iWidth, displayMode);
 
         bitmap->BeginDataAccess();
         uchar *bytes = (uchar*)bitmap->DataAddress();
-        QImage img = QImage(bytes, size.iWidth, size.iHeight, format);
+        QImage img = QImage(bytes, size.iWidth, size.iHeight, bytesPerLine, format);
         img = img.copy();
         bitmap->EndDataAccess();
 
diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp
index 24cbb21..fdf8311 100644
--- a/tests/auto/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/qpixmap/tst_qpixmap.cpp
@@ -1160,6 +1160,8 @@ void tst_QPixmap::fromSymbianCFbsBitmap_data()
     const int smallHeight = 20;
     const int largeWidth = 240;
     const int largeHeight = 320;
+    const int notAlignedWidth = 250;
+    const int notAlignedHeight = 250;
 
     // Indexed Color Formats - Disabled since images seem to be blank -> no palette?
 //    QTest::newRow("EGray2 small") << EGray2 << smallWidth << smallHeight << QColor(Qt::black);
@@ -1172,14 +1174,19 @@ void tst_QPixmap::fromSymbianCFbsBitmap_data()
     // Direct Color Formats
     QTest::newRow("EColor4K small") << EColor4K << smallWidth << smallHeight << QColor(Qt::red);
     QTest::newRow("EColor4K big") << EColor4K << largeWidth << largeHeight << QColor(Qt::red);
+    QTest::newRow("EColor4K not aligned") << EColor4K << notAlignedWidth << notAlignedHeight << QColor(Qt::red);
     QTest::newRow("EColor64K small") << EColor64K << smallWidth << smallHeight << QColor(Qt::green);
     QTest::newRow("EColor64K big") << EColor64K << largeWidth << largeHeight << QColor(Qt::green);
+    QTest::newRow("EColor64K not aligned") << EColor64K << notAlignedWidth << notAlignedHeight << QColor(Qt::green);
     QTest::newRow("EColor16M small") << EColor16M << smallWidth << smallHeight << QColor(Qt::yellow);
     QTest::newRow("EColor16M big") << EColor16M << largeWidth << largeHeight << QColor(Qt::yellow);
+    QTest::newRow("EColor16M not aligned") << EColor16M << notAlignedWidth << notAlignedHeight << QColor(Qt::yellow);
     QTest::newRow("EColor16MU small") << EColor16MU << smallWidth << smallHeight << QColor(Qt::red);
     QTest::newRow("EColor16MU big") << EColor16MU << largeWidth << largeHeight << QColor(Qt::red);
+    QTest::newRow("EColor16MU not aligned") << EColor16MU << notAlignedWidth << notAlignedHeight << QColor(Qt::red);
     QTest::newRow("EColor16MA small opaque") << EColor16MA << smallWidth << smallHeight << QColor(255, 255, 0);
     QTest::newRow("EColor16MA big opaque") << EColor16MA << largeWidth << largeHeight << QColor(255, 255, 0);
+    QTest::newRow("EColor16MA not aligned opaque") << EColor16MA << notAlignedWidth << notAlignedHeight << QColor(255, 255, 0);
 
     // Semi-transparent Colors - Disabled for now, since the QCOMPARE fails, but visually confirmed to work
 //    QTest::newRow("EColor16MA small semi") << EColor16MA << smallWidth << smallHeight << QColor(255, 255, 0, 127);
@@ -1237,6 +1244,10 @@ void tst_QPixmap::fromSymbianCFbsBitmap()
 
         QColor actualColor(image.pixel(1, 1));
         QCOMPARE(actualColor, color);
+
+        QImage shouldBe(pixmap.width(), pixmap.height(), image.format());
+        shouldBe.fill(color.rgba());
+        QCOMPARE(image, shouldBe);
     }
     __UHEAP_MARKEND;
 
-- 
cgit v0.12


From 61d23b1740780b3c7970c9dd5d089002a35f339e Mon Sep 17 00:00:00 2001
From: Alessandro Portale <alessandro.portale@nokia.com>
Date: Tue, 12 Oct 2010 13:01:42 +0200
Subject: Fix memory leak in QFontEngineS60::addGlyphsToPath()

An "Open()"ed RGlyphOutlineIterator needs to be "Close()"d
before destroying the iterator. Otherwise some allocated
memory does not get freed. The RGlyphOutlineIterator
destructor does not close an open iterator.

Task-Number: QTBUG-14408
Done-by: Colleague from Nokia, Oulu
Reviewed-by: Alessandro Portale
---
 src/gui/text/qfontengine_s60.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 5980f20..653965e 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -308,6 +308,7 @@ void QFontEngineS60::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions,
         parseGlyphPathData(outlineChar, outlineEnd, *path, fontSizeInPixels,
                 positions[count++].toPointF(), false);
     } while(KErrNone == iterator.Next() && count <= nglyphs);
+    iterator.Close();
 #else // Q_SYMBIAN_HAS_GLYPHOUTLINE_API
     QFontEngine::addGlyphsToPath(glyphs, positions, nglyphs, path, flags);
 #endif //Q_SYMBIAN_HAS_GLYPHOUTLINE_API
-- 
cgit v0.12


From ab057be7228d20d909246183505b72e821cc440f Mon Sep 17 00:00:00 2001
From: Alessandro Portale <alessandro.portale@nokia.com>
Date: Tue, 12 Oct 2010 14:00:38 +0200
Subject: Remove unnecessary calls to GetHorizBounds() + boundingBox()

QFontEngineS60::boundingBox_const(): The metrics that
CFont::getCharacterData() returns is equivalent to what
TOpenFontCharMetrics::GetHorizBounds() returns. So, remove
the use of TRect glyphBounds, and
TOpenFontCharMetrics::GetHorizBounds().

Implementation of TOpenFontCharMetrics::GetHorizBounds():
http://developer.symbian.org/oss/API_REF/Public_API/file/837f303aceeb/epoc32/include/openfont.h#l1352

QRasterPaintEngine::drawGlyphsS60(): The metrics that
QFontEngineS60::getCharacterData() returns are equivalent to
what QFontEngineS60::boundingBox() returns. So, remove the
use of glyph_metrics_t metrics, and QFontEngineS60::boundingBox().

These changes increase the Fps in
qt\tests\manual\textrendering\textperformance "Latin" from 16.2 to
16.5 Fps on an XM5800. And they do that by removing code :)

Task-number: QTBUG-14378
Reviewed-by: Jason Barron
---
 src/gui/painting/qpaintengine_raster.cpp |  6 ++----
 src/gui/text/qfontengine_s60.cpp         | 10 ++++------
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 9749244..c92d291 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -3164,10 +3164,8 @@ void QRasterPaintEngine::drawGlyphsS60(const QPointF &p, const QTextItemInt &ti)
         const TUint8 *glyphBitmapBytes;
         TSize glyphBitmapSize;
         fe->getCharacterData(glyphs[i], tmetrics, glyphBitmapBytes, glyphBitmapSize);
-        const glyph_metrics_t metrics = ti.fontEngine->boundingBox(glyphs[i]);
-        const int x = qFloor(positions[i].x + metrics.x + aliasDelta);
-        const int y = qFloor(positions[i].y + metrics.y + aliasDelta);
-
+        const int x = qFloor(positions[i].x + tmetrics.HorizBearingX() + aliasDelta);
+        const int y = qFloor(positions[i].y - tmetrics.HorizBearingY() + aliasDelta);
         alphaPenBlt(glyphBitmapBytes, glyphBitmapSize.iWidth, 8, x, y, glyphBitmapSize.iWidth, glyphBitmapSize.iHeight);
     }
 
diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 653965e..32fcb82 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -360,13 +360,11 @@ glyph_metrics_t QFontEngineS60::boundingBox_const(glyph_t glyph) const
     const TUint8 *glyphBitmapBytes;
     TSize glyphBitmapSize;
     getCharacterData(glyph, metrics, glyphBitmapBytes, glyphBitmapSize);
-    TRect glyphBounds;
-    metrics.GetHorizBounds(glyphBounds);
     const glyph_metrics_t result(
-        glyphBounds.iTl.iX,
-        glyphBounds.iTl.iY,
-        glyphBounds.Width(),
-        glyphBounds.Height(),
+        metrics.HorizBearingX(),
+        -metrics.HorizBearingY(),
+        metrics.Width(),
+        metrics.Height(),
         metrics.HorizAdvance(),
         0
     );
-- 
cgit v0.12


From ea5281e6cd1ebc63e080f7232d4eb28f1610539e Mon Sep 17 00:00:00 2001
From: Alessandro Portale <alessandro.portale@nokia.com>
Date: Tue, 12 Oct 2010 14:18:54 +0200
Subject: Implement QFontEngineS60::emSquareSize()

Some glyph position tweaks during the shaping phase require
the "Units per Em" information for the font. QFontEngineS60
did not reimplement emSquareSize(), therefore, some combined
glyphs were rendered incorrectly (see QTBUG-10725)

This patch implements QFontEngineS60::emSquareSize()
Since Symbian does not provide the "Units per Em" via public
Api, we have to pick that out of the 'head' font table.
The value is cached per font.

Task-Number: QTBUG-10725
Reviewed-by: Eskil Abrahamsen Blomfeldt
---
 src/gui/text/qfontengine_s60.cpp | 26 ++++++++++++++++++++++++++
 src/gui/text/qfontengine_s60_p.h |  3 +++
 2 files changed, 29 insertions(+)

diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 32fcb82..824a8e2 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -41,6 +41,7 @@
 
 #include "qfontengine_s60_p.h"
 #include "qtextengine_p.h"
+#include "qendian.h"
 #include "qglobal.h"
 #include <private/qapplication_p.h>
 #include "qimage.h"
@@ -176,6 +177,24 @@ CFont *QSymbianTypeFaceExtras::fontOwner() const
     return m_cFont;
 }
 
+QFixed QSymbianTypeFaceExtras::unitsPerEm() const
+{
+    if (m_unitsPerEm.value() != 0)
+        return m_unitsPerEm;
+    const QByteArray head = getSfntTable(MAKE_TAG('h', 'e', 'a', 'd'));
+    const int unitsPerEmOffset = 18;
+    if (head.size() > unitsPerEmOffset + sizeof(quint16)) {
+        const uchar* tableData = reinterpret_cast<const uchar*>(head.constData());
+        const uchar* unitsPerEm = tableData + unitsPerEmOffset;
+        m_unitsPerEm = qFromBigEndian<quint16>(unitsPerEm);
+    } else {
+        // Bitmap font? Corrupt font?
+        // We return -1 and let the QFontEngineS60 return the pixel size.
+        m_unitsPerEm = -1;
+    }
+    return m_unitsPerEm;
+}
+
 // duplicated from qfontengine_xyz.cpp
 static inline unsigned int getChar(const QChar *str, int &i, const int len)
 {
@@ -248,6 +267,13 @@ QFontEngineS60::~QFontEngineS60()
     releaseFont(m_scaledFont);
 }
 
+QFixed QFontEngineS60::emSquareSize() const
+{
+    const QFixed unitsPerEm = m_extras->unitsPerEm();
+    return unitsPerEm.toInt() == -1 ?
+                QFixed::fromReal(m_originalFontSizeInPixels) : unitsPerEm;
+}
+
 bool QFontEngineS60::stringToCMap(const QChar *characters, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags) const
 {
     if (*nglyphs < len) {
diff --git a/src/gui/text/qfontengine_s60_p.h b/src/gui/text/qfontengine_s60_p.h
index d05c23c..c65ce55 100644
--- a/src/gui/text/qfontengine_s60_p.h
+++ b/src/gui/text/qfontengine_s60_p.h
@@ -82,11 +82,13 @@ public:
     const uchar *cmap() const;
     CFont *fontOwner() const;
     bool isSymbolCMap() const;
+    QFixed unitsPerEm() const;
 
 private:
     CFont* m_cFont;
     mutable bool m_symbolCMap;
     mutable QByteArray m_cmapTable;
+    mutable QFixed m_unitsPerEm;
 #ifndef Q_SYMBIAN_HAS_FONTTABLE_API
     COpenFont *m_openFont;
     mutable MOpenFontTrueTypeExtension *m_trueTypeExtension;
@@ -99,6 +101,7 @@ public:
     QFontEngineS60(const QFontDef &fontDef, const QSymbianTypeFaceExtras *extras);
     ~QFontEngineS60();
 
+    QFixed emSquareSize() const;
     bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags) const;
     void recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const;
 
-- 
cgit v0.12


From 0b3402f2ff0db1de747e9d38021a5c9300c8a011 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Tue, 12 Oct 2010 15:33:44 +0300
Subject: Added bearer plugin deployment to qt.iby

Reviewed-by: TrustMe
---
 src/s60installs/qt.iby | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/s60installs/qt.iby b/src/s60installs/qt.iby
index b6cdce9..4afbf05 100644
--- a/src/s60installs/qt.iby
+++ b/src/s60installs/qt.iby
@@ -53,6 +53,9 @@ file=ABI_DIR\BUILD_DIR\qaudio.dll            SHARED_LIB_DIR\qaudio.dll
 file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll
 file=ABI_DIR\BUILD_DIR\qglgraphicssystem.dll SHARED_LIB_DIR\qglgraphicssystem.dll
 
+// bearer
+file=ABI_DIR\BUILD_DIR\qsymbianbearer.dll    SHARED_LIB_DIR\qsymbianbearer.dll
+
 // S60 version compatibility plugins for 5.0 (3.1 and 3.2 devices are never likely to have this in ROM,
 // so don't bother including those plugins
 file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll   SHARED_LIB_DIR\qts60plugin_5_0.dll
@@ -99,6 +102,9 @@ data=\epoc32\data\qt\qtlibspluginstubs\qaudio.qtplugin resource\qt\plugins\audio
 data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin      resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin
 data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin      resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin
 
+// bearer stub
+data=\epoc32\data\z\resource\qt\plugins\bearer\qsymbianbearer.qtplugin resource\qt\plugins\bearer\qsymbianbearer.qtplugin
+
 // Stub sis file
 data=ZSYSTEM\install\qt_stub.sis    System\Install\qt_stub.sis
 data=ZSYSTEM\install\qtwebkit_stub.sis    System\Install\qtwebkit_stub.sis
-- 
cgit v0.12


From e39f273b921a36b307b2b2adddd7135f0c5a8858 Mon Sep 17 00:00:00 2001
From: Jason Barron <jason.barron@nokia.com>
Date: Tue, 12 Oct 2010 14:39:12 +0200
Subject: Delete qtdemoapps.iby.

This file was used to deploy certain Qt demo applications to a Symbian
ROM image and was always being exported to the epoc32 tree when Qt was
compiled. This doesn't make sense since these will never (hopefully) be
deployed on any real device. If someone wants demo apps deployed, they
should create their own IBY file.

Reviewed-by: Shane Kearns
Reviewed-by: Miikka Heikkinen
---
 src/s60installs/qtdemoapps.iby  | 15 ---------------
 src/s60installs/s60installs.pro |  1 -
 2 files changed, 16 deletions(-)
 delete mode 100644 src/s60installs/qtdemoapps.iby

diff --git a/src/s60installs/qtdemoapps.iby b/src/s60installs/qtdemoapps.iby
deleted file mode 100644
index d888135..0000000
--- a/src/s60installs/qtdemoapps.iby
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef QTDEMOAPPS_IBY
-#define QTDEMOAPPS_IBY
-
-// A subset of Qt demo & example applications
-
-// Note that star requires OpenVG and the Qt OpenVG paint engine
-S60_APP_EXE(star)
-S60_APP_RESOURCE(star)
-data=\epoc32\data\Z\private\10003a3f\import\Apps\star_reg.rsc   \private\10003a3f\import\apps\star_reg.rsc
-
-S60_APP_EXE(wiggly)
-S60_APP_RESOURCE(wiggly)
-data=\epoc32\data\Z\private\10003a3f\import\Apps\wiggly_reg.rsc   \private\10003a3f\import\apps\wiggly_reg.rsc
-
-#endif // QTDEMOAPPS_IBY
diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro
index c73ed06..d63b97c 100644
--- a/src/s60installs/s60installs.pro
+++ b/src/s60installs/s60installs.pro
@@ -200,5 +200,4 @@ symbian: {
     }
 
     BLD_INF_RULES.prj_exports += "qt.iby $$CORE_MW_LAYER_IBY_EXPORT_PATH(qt.iby)"
-    BLD_INF_RULES.prj_exports += "qtdemoapps.iby $$CUSTOMER_VARIANT_APP_LAYER_IBY_EXPORT_PATH(qtdemoapps.iby)"
 }
-- 
cgit v0.12


From 92fb7e405a93785af162e5dff0a6b2a2d40060bc Mon Sep 17 00:00:00 2001
From: Alessandro Portale <alessandro.portale@nokia.com>
Date: Tue, 12 Oct 2010 16:27:31 +0200
Subject: Optimize QFontEngineS60::recalcAdvances()

(Addition to ab057be7228d20d909246183505b72e821cc440f)

Instead of using a glyph_metrics_t (which gets filled with
data from a TOpenFontCharMetrics), we use a
TOpenFontCharMetrics, directly.

Also, the advances_y gets set to 0. Like on the other
platforms.

These change increases the Fps in
qt\tests\manual\textrendering\textperformance "Latin" from 16.5 to
16.6 Fps on an XM5800. I am sure that I can construct a benchmark
where the speed gain is bigger.

Task-number: QTBUG-14378
Reviewed-by: TrustMe
---
 src/gui/text/qfontengine_s60.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 824a8e2..3705136 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -303,10 +303,13 @@ bool QFontEngineS60::stringToCMap(const QChar *characters, int len, QGlyphLayout
 void QFontEngineS60::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const
 {
     Q_UNUSED(flags);
+    TOpenFontCharMetrics metrics;
+    const TUint8 *glyphBitmapBytes;
+    TSize glyphBitmapSize;
     for (int i = 0; i < glyphs->numGlyphs; i++) {
-        const glyph_metrics_t bbox = boundingBox_const(glyphs->glyphs[i]);
-        glyphs->advances_x[i] = bbox.xoff;
-        glyphs->advances_y[i] = bbox.yoff;
+        getCharacterData(glyphs->glyphs[i], metrics, glyphBitmapBytes, glyphBitmapSize);
+        glyphs->advances_x[i] = metrics.HorizAdvance();
+        glyphs->advances_y[i] = 0;
     }
 }
 
-- 
cgit v0.12


From 7d21b598d299ee61d61f15c69b41b8b38daf9bea Mon Sep 17 00:00:00 2001
From: Alessandro Portale <alessandro.portale@nokia.com>
Date: Tue, 12 Oct 2010 22:55:20 +0200
Subject: Remove obsolete tweak in QFontEngineS60::alphaMapForGlyph

On some Symbian versions (apparently <= Symbian^1),
CFont::GetCharacterData() returns 8-bit data with gray values
0x00, 0x10 ... 0xe0, 0xf0 due to a bug. The glyphs are nowhere
perfectly opaque, which is bad for blitting.
This has been however been fixed for Symbian^3.

The funny thing about this tweak was that it was only executed
on Symbian^3 (with the OpenVG/OpenGL paintengines). On Symbian^1
and below (rasterpaintengine), QFontEngineS60::alphaMapForGlyph()
does not get called at all, anymore.

Therefore, the removal of this tweak should not be noticable
anywhere, except that on Symbian^3, quite a few CPU cycles are
now saved.

See the attachments in QTBUG-14419 for details.

Task-Number: QTBUG-14419
Reviewed-By: TrustMe
---
 src/gui/text/qfontengine_s60.cpp | 22 +++++-----------------
 1 file changed, 5 insertions(+), 17 deletions(-)

diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 3705136..bf30e1c 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -345,29 +345,17 @@ void QFontEngineS60::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions,
 
 QImage QFontEngineS60::alphaMapForGlyph(glyph_t glyph)
 {
+    // Note: On some Symbian versions (apparently <= Symbian^1), this
+    // function will return gray values 0x00, 0x10 ... 0xe0, 0xf0 due
+    // to a bug. The glyphs are nowhere perfectly opaque.
+    // This has been fixed for Symbian^3.
+
     TOpenFontCharMetrics metrics;
     const TUint8 *glyphBitmapBytes;
     TSize glyphBitmapSize;
     getCharacterData(glyph, metrics, glyphBitmapBytes, glyphBitmapSize);
     QImage result(glyphBitmapBytes, glyphBitmapSize.iWidth, glyphBitmapSize.iHeight, glyphBitmapSize.iWidth, QImage::Format_Indexed8);
     result.setColorTable(grayPalette());
-
-    // The above setColorTable() call detached the image data anyway, so why not shape tha data a bit, while we can.
-    // CFont::GetCharacterData() returns 8-bit data that obviously was 4-bit data before, and converted to 8-bit incorrectly.
-    // The data values are 0x00, 0x10 ... 0xe0, 0xf0. So, a real opaque 0xff is never reached, which we get punished
-    // for every time we want to blit this glyph in the raster paint engine.
-    // "Fix" is to convert all 0xf0 to 0xff. Is fine, quality wise, and I assume faster than correcting all values.
-    // Blitting is however, evidentially faster now.
-    const int bpl = result.bytesPerLine();
-    for (int row = 0; row < result.height(); ++row) {
-        uchar *scanLine = result.scanLine(row);
-        for (int column = 0; column < bpl; ++column) {
-            if (*scanLine == 0xf0)
-                *scanLine = 0xff;
-            scanLine++;
-        }
-    }
-
     return result;
 }
 
-- 
cgit v0.12


From a311b854e0886f0498c068af5b489af36a96b845 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Wed, 13 Oct 2010 10:52:16 +1000
Subject: Compile on WinCE

---
 src/declarative/qml/qdeclarativeengine.cpp                            | 4 ++--
 .../declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp     | 4 ++--
 .../qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp         | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index ec583f9..8e1416e 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -2193,14 +2193,14 @@ const QMetaObject *QDeclarativeEnginePrivate::metaObjectForType(int t) const
 
 bool QDeclarative_isFileCaseCorrect(const QString &fileName)
 {
-#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN32)
     QFileInfo info(fileName);
 
     QString absolute = info.absoluteFilePath();
 
 #if defined(Q_OS_MAC)
     QString canonical = info.canonicalFilePath();
-#elif defined(Q_OS_WIN)
+#elif defined(Q_OS_WIN32)
     wchar_t buffer[1024];
 
     DWORD rv = ::GetLongPathName((wchar_t*)absolute.utf16(), buffer, 1024);
diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
index be04dee..061ac48 100644
--- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
+++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp
@@ -387,7 +387,7 @@ void tst_qdeclarativelanguage::errors_data()
     QTest::newRow("singularProperty") << "singularProperty.qml" << "singularProperty.errors.txt" << false;
     QTest::newRow("singularProperty.2") << "singularProperty.2.qml" << "singularProperty.2.errors.txt" << false;
     QTest::newRow("incorrectCase") << "incorrectCase.qml" 
-#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN32)
         << "incorrectCase.errors.insensitive.txt" 
 #else
         << "incorrectCase.errors.sensitive.txt" 
@@ -1784,7 +1784,7 @@ void tst_qdeclarativelanguage::importIncorrectCase()
     QList<QDeclarativeError> errors = component.errors();
     QCOMPARE(errors.count(), 1);
 
-#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN32)
     QString expectedError = QLatin1String("cannot load module \"com.Nokia.installedtest\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("data/lib/com/Nokia/installedtest/qmldir") + QLatin1String("\"");
 #else
     QString expectedError = QLatin1String("module \"com.Nokia.installedtest\" is not installed");
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
index 51f66a5..85fa718 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp
@@ -131,10 +131,10 @@ void tst_qdeclarativemoduleplugin::incorrectPluginCase()
     QList<QDeclarativeError> errors = component.errors();
     QCOMPARE(errors.count(), 1);
 
-#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
+#if defined(Q_OS_MAC) || defined(Q_OS_WIN32)
 #if defined(Q_OS_MAC)
     QString libname = "libPluGin.dylib";
-#elif defined(Q_OS_WIN)
+#elif defined(Q_OS_WIN32)
     QString libname = "PluGin.dll";
 #endif
     QString expectedError = QLatin1String("plugin cannot be loaded for module \"com.nokia.WrongCase\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("imports/com/nokia/WrongCase/" + libname) + QLatin1String("\"");
-- 
cgit v0.12


From 2553ca41a05afb28e49d813a1aebed12474f6b00 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 13 Oct 2010 14:55:07 +1000
Subject: Remove debug code added by 650a0078e2cef43eff107fe8d2505f64a0bfedf0

Task-number: QT-4093
---
 .../auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index 7a58773..2649c0d 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -989,9 +989,6 @@ void tst_QDeclarativeListView::sections()
     listview->setContentY(0);
     model.modifyItem(0, "changed", "2");
 
-    canvas->show();
-    qApp->exec();
-
     item = findItem<QDeclarativeItem>(contentItem, "wrapper", 1);
     QTRY_VERIFY(item);
     QTRY_COMPARE(item->height(), 40.0);
-- 
cgit v0.12


From cdcc5bc1a82b70d27752370d83b4b21c912f6153 Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Wed, 13 Oct 2010 15:01:19 +1000
Subject: Fix alignment bugs in Text element

Task-number: QTBUG-14374
---
 src/declarative/graphicsitems/qdeclarativetext.cpp | 961 +++++++++++----------
 .../graphicsitems/qdeclarativetext_p_p.h           |  48 +-
 2 files changed, 526 insertions(+), 483 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 54cb062..308aefa 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -85,12 +85,13 @@ private:
 DEFINE_BOOL_CONFIG_OPTION(enableImageCache, QML_ENABLE_TEXT_IMAGE_CACHE);
 
 QDeclarativeTextPrivate::QDeclarativeTextPrivate()
-: color((QRgb)0), style(QDeclarativeText::Normal),
-  hAlign(QDeclarativeText::AlignLeft), vAlign(QDeclarativeText::AlignTop), elideMode(QDeclarativeText::ElideNone),
-  imgDirty(true), dirty(true), richText(false), singleline(false), cache(true), internalWidthUpdate(false), doc(0),
-  format(QDeclarativeText::AutoText), wrapMode(QDeclarativeText::NoWrap)
+: color((QRgb)0), style(QDeclarativeText::Normal), hAlign(QDeclarativeText::AlignLeft), 
+  vAlign(QDeclarativeText::AlignTop), elideMode(QDeclarativeText::ElideNone),
+  format(QDeclarativeText::AutoText), wrapMode(QDeclarativeText::NoWrap), imageCacheDirty(true), 
+  updateOnComponentComplete(true), richText(false), singleline(false), cacheAllTextAsImage(true), 
+  internalWidthUpdate(false), doc(0) 
 {
-    cache = enableImageCache();
+    cacheAllTextAsImage = enableImageCache();
     QGraphicsItemPrivate::acceptedMouseButtons = Qt::LeftButton;
     QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents;
 }
@@ -151,7 +152,6 @@ void QTextDocumentWithImageResources::requestFinished()
 #endif
         QDeclarativeTextPrivate *d = QDeclarativeTextPrivate::get(textItem);
         d->updateLayout();
-        d->markImgDirty();
     }
 }
 
@@ -172,6 +172,382 @@ void QTextDocumentWithImageResources::setText(const QString &text)
 
 QSet<QUrl> QTextDocumentWithImageResources::errors;
 
+QDeclarativeTextPrivate::~QDeclarativeTextPrivate()
+{
+}
+
+void QDeclarativeTextPrivate::updateLayout()
+{
+    Q_Q(QDeclarativeText);
+    if (!q->isComponentComplete()) {
+        updateOnComponentComplete = true;
+        return;
+    }
+
+    // Setup instance of QTextLayout for all cases other than richtext
+    if (!richText) {
+        layout.clearLayout();
+        layout.setFont(font);
+        if (format != QDeclarativeText::StyledText) {
+            QString tmp = text;
+            tmp.replace(QLatin1Char('\n'), QChar::LineSeparator);
+            singleline = !tmp.contains(QChar::LineSeparator);
+            if (singleline && elideMode != QDeclarativeText::ElideNone && q->widthValid()) {
+                QFontMetrics fm(font);
+                tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); // XXX still worth layout...?
+            }
+            layout.setText(tmp);
+        } else {
+            singleline = false;
+            QDeclarativeStyledText::parse(text, layout);
+        }
+    }
+
+    updateSize();
+}
+
+void QDeclarativeTextPrivate::updateSize()
+{
+    Q_Q(QDeclarativeText);
+
+    if (!q->isComponentComplete()) {
+        updateOnComponentComplete = true;
+        return;
+    }
+
+    invalidateImageCache();
+
+    QFontMetrics fm(font);
+    if (text.isEmpty()) {
+        q->setImplicitHeight(fm.height());
+        emit q->paintedSizeChanged();
+        return;
+    }
+
+    int dy = q->height();
+    QSize size(0, 0);
+
+    //setup instance of QTextLayout for all cases other than richtext
+    if (!richText) {
+        size = setupTextLayout();
+        if (layedOutTextSize != size) {
+            q->prepareGeometryChange();
+            layedOutTextSize = size;
+        }
+        dy -= size.height();
+    } else {
+        singleline = false; // richtext can't elide or be optimized for single-line case
+        ensureDoc();
+        doc->setDefaultFont(font);
+        QTextOption option((Qt::Alignment)int(hAlign | vAlign));
+        option.setWrapMode(QTextOption::WrapMode(wrapMode));
+        doc->setDefaultTextOption(option);
+        if (wrapMode != QDeclarativeText::NoWrap && q->widthValid())
+            doc->setTextWidth(q->width());
+        else
+            doc->setTextWidth(doc->idealWidth()); // ### Text does not align if width is not set (QTextDoc bug)
+        dy -= (int)doc->size().height();
+        QSize dsize = doc->size().toSize();
+        if (dsize != layedOutTextSize) {
+            q->prepareGeometryChange();
+            layedOutTextSize = dsize;
+        }
+        size = QSize(int(doc->idealWidth()),dsize.height());
+    }
+    int yoff = 0;
+
+    if (q->heightValid()) {
+        if (vAlign == QDeclarativeText::AlignBottom)
+            yoff = dy;
+        else if (vAlign == QDeclarativeText::AlignVCenter)
+            yoff = dy/2;
+    }
+    q->setBaselineOffset(fm.ascent() + yoff);
+
+    //### need to comfirm cost of always setting these for richText
+    internalWidthUpdate = true;
+    q->setImplicitWidth(size.width());
+    internalWidthUpdate = false;
+    q->setImplicitHeight(size.height());
+    emit q->paintedSizeChanged();
+}
+
+/*!
+    Lays out the QDeclarativeTextPrivate::layout QTextLayout in the constraints of the QDeclarativeText.
+
+    Returns the size of the final text.  This can be used to position the text vertically (the text is
+    already absolutely positioned horizontally).
+*/
+QSize QDeclarativeTextPrivate::setupTextLayout()
+{
+    // ### text layout handling should be profiled and optimized as needed
+    // what about QStackTextEngine engine(tmp, d->font.font()); QTextLayout textLayout(&engine);
+
+    Q_Q(QDeclarativeText);
+    layout.setCacheEnabled(true);
+
+    int height = 0;
+    qreal widthUsed = 0;
+    qreal lineWidth = 0;
+
+    //set manual width
+    if ((wrapMode != QDeclarativeText::NoWrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid())
+        lineWidth = q->width();
+
+    QTextOption textOption = layout.textOption();
+    textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
+    layout.setTextOption(textOption);
+
+    layout.beginLayout();
+    while (1) {
+        QTextLine line = layout.createLine();
+        if (!line.isValid())
+            break;
+
+        if ((wrapMode != QDeclarativeText::NoWrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid()) 
+            line.setLineWidth(lineWidth);
+    }
+    layout.endLayout();
+
+    for (int i = 0; i < layout.lineCount(); ++i) {
+        QTextLine line = layout.lineAt(i);
+        widthUsed = qMax(widthUsed, line.naturalTextWidth());
+    }
+
+    qreal layoutWidth = q->widthValid()?q->width():widthUsed;
+
+    int x = 0;
+    for (int i = 0; i < layout.lineCount(); ++i) {
+        QTextLine line = layout.lineAt(i);
+        line.setPosition(QPointF(0, height));
+        height += int(line.height());
+
+        if (!cacheAllTextAsImage) {
+            if (hAlign == QDeclarativeText::AlignLeft) {
+                x = 0;
+            } else if (hAlign == QDeclarativeText::AlignRight) {
+                x = layoutWidth - (int)line.naturalTextWidth();
+            } else if (hAlign == QDeclarativeText::AlignHCenter) {
+                x = (layoutWidth - (int)line.naturalTextWidth()) / 2;
+            }
+            line.setPosition(QPoint(x, (int)line.y()));
+        }
+    }
+
+    return QSize(qCeil(widthUsed), height);
+}
+
+/*!
+    Returns a painted version of the QDeclarativeTextPrivate::layout QTextLayout.
+    If \a drawStyle is true, the style color overrides all colors in the document.
+*/
+QPixmap QDeclarativeTextPrivate::textLayoutImage(bool drawStyle)
+{
+    //do layout
+    QSize size = layedOutTextSize;
+
+    int x = 0;
+    for (int i = 0; i < layout.lineCount(); ++i) {
+        QTextLine line = layout.lineAt(i);
+        if (hAlign == QDeclarativeText::AlignLeft) {
+            x = 0;
+        } else if (hAlign == QDeclarativeText::AlignRight) {
+            x = size.width() - (int)line.naturalTextWidth();
+        } else if (hAlign == QDeclarativeText::AlignHCenter) {
+            x = (size.width() - (int)line.naturalTextWidth()) / 2;
+        }
+        line.setPosition(QPoint(x, (int)line.y()));
+    }
+
+    //paint text
+    QPixmap img(size);
+    if (!size.isEmpty()) {
+        img.fill(Qt::transparent);
+#ifdef Q_WS_MAC
+        bool oldSmooth = qt_applefontsmoothing_enabled;
+        qt_applefontsmoothing_enabled = false;
+#endif
+        QPainter p(&img);
+#ifdef Q_WS_MAC
+        qt_applefontsmoothing_enabled = oldSmooth;
+#endif
+        drawTextLayout(&p, QPointF(0,0), drawStyle);
+    }
+    return img;
+}
+
+/*!
+    Paints the QDeclarativeTextPrivate::layout QTextLayout into \a painter at \a pos.  If 
+    \a drawStyle is true, the style color overrides all colors in the document.
+*/
+void QDeclarativeTextPrivate::drawTextLayout(QPainter *painter, const QPointF &pos, bool drawStyle)
+{
+    if (drawStyle)
+        painter->setPen(styleColor);
+    else
+        painter->setPen(color);
+    painter->setFont(font);
+    layout.draw(painter, pos); 
+}
+
+/*!
+    Returns a painted version of the QDeclarativeTextPrivate::doc QTextDocument.
+    If \a drawStyle is true, the style color overrides all colors in the document.
+*/
+QPixmap QDeclarativeTextPrivate::textDocumentImage(bool drawStyle)
+{
+    QSize size = doc->size().toSize();
+
+    //paint text
+    QPixmap img(size);
+    img.fill(Qt::transparent);
+#ifdef Q_WS_MAC
+    bool oldSmooth = qt_applefontsmoothing_enabled;
+    qt_applefontsmoothing_enabled = false;
+#endif
+    QPainter p(&img);
+#ifdef Q_WS_MAC
+    qt_applefontsmoothing_enabled = oldSmooth;
+#endif
+
+    QAbstractTextDocumentLayout::PaintContext context;
+
+    QTextOption oldOption(doc->defaultTextOption());
+    if (drawStyle) {
+        context.palette.setColor(QPalette::Text, styleColor);
+        QTextOption colorOption(doc->defaultTextOption());
+        colorOption.setFlags(QTextOption::SuppressColors);
+        doc->setDefaultTextOption(colorOption);
+    } else {
+        context.palette.setColor(QPalette::Text, color);
+    }
+    doc->documentLayout()->draw(&p, context);
+    if (drawStyle)
+        doc->setDefaultTextOption(oldOption);
+    return img;
+}
+
+/*!
+    Mark the image cache as dirty.
+*/
+void QDeclarativeTextPrivate::invalidateImageCache() 
+{
+    Q_Q(QDeclarativeText);
+
+    if (imageCacheDirty)
+        return;
+
+    imageCacheDirty = true;
+    imageCache = QPixmap();
+
+    if (q->isComponentComplete())
+        q->update();
+}
+
+/*!
+    Tests if the image cache is dirty, and repaints it if it is.
+*/
+void QDeclarativeTextPrivate::checkImageCache()
+{
+    if (!imageCacheDirty)
+        return;
+
+    if (text.isEmpty()) {
+
+        imageCache = QPixmap();
+
+    } else {
+
+        QPixmap textImage;
+        QPixmap styledImage;
+
+        if (richText) {
+            textImage = textDocumentImage(false);
+            if (style != QDeclarativeText::Normal)
+                styledImage = textDocumentImage(true); //### should use styleColor
+        } else {
+            textImage = textLayoutImage(false);
+            if (style != QDeclarativeText::Normal)
+                styledImage = textLayoutImage(true); //### should use styleColor
+        }
+
+        switch (style) {
+        case QDeclarativeText::Outline:
+            imageCache = drawOutline(textImage, styledImage);
+            break;
+        case QDeclarativeText::Sunken:
+            imageCache = drawOutline(textImage, styledImage, -1);
+            break;
+        case QDeclarativeText::Raised:
+            imageCache = drawOutline(textImage, styledImage, 1);
+            break;
+        default:
+            imageCache = textImage;
+            break;
+        }
+
+    } 
+
+    imageCacheDirty = false;
+}
+
+/*! 
+    Ensures the QDeclarativeTextPrivate::doc variable is set to a valid text document 
+*/
+void QDeclarativeTextPrivate::ensureDoc()
+{
+    if (!doc) {
+        Q_Q(QDeclarativeText);
+        doc = new QTextDocumentWithImageResources(q);
+        doc->setDocumentMargin(0);
+    }
+}
+
+/*!
+    Draw \a styleSource as an outline around \a source and return the new image.
+*/
+QPixmap QDeclarativeTextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource)
+{
+    QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2);
+    img.fill(Qt::transparent);
+
+    QPainter ppm(&img);
+
+    QPoint pos(0, 0);
+    pos += QPoint(-1, 0);
+    ppm.drawPixmap(pos, styleSource);
+    pos += QPoint(2, 0);
+    ppm.drawPixmap(pos, styleSource);
+    pos += QPoint(-1, -1);
+    ppm.drawPixmap(pos, styleSource);
+    pos += QPoint(0, 2);
+    ppm.drawPixmap(pos, styleSource);
+
+    pos += QPoint(0, -1);
+    ppm.drawPixmap(pos, source);
+    ppm.end();
+
+    return img;
+}
+
+/*!
+    Draw \a styleSource below \a source at \a yOffset and return the new image.
+*/
+QPixmap QDeclarativeTextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset)
+{
+    QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2);
+    img.fill(Qt::transparent);
+
+    QPainter ppm(&img);
+
+    ppm.drawPixmap(QPoint(0, yOffset), styleSource);
+    ppm.drawPixmap(0, 0, source);
+
+    ppm.end();
+
+    return img;
+}
+
 /*!
     \qmlclass Text QDeclarativeText
     \ingroup qml-basic-visual-elements
@@ -211,10 +587,44 @@ QDeclarativeText::~QDeclarativeText()
 {
 }
 
+/*!
+  \qmlproperty bool Text::clip
+  This property holds whether the text is clipped.
 
-QDeclarativeTextPrivate::~QDeclarativeTextPrivate()
-{
-}
+  Note that if the text does not fit in the bounding rectangle it will be abruptly chopped.
+
+  If you want to display potentially long text in a limited space, you probably want to use \c elide instead.
+*/
+
+/*!
+    \qmlproperty bool Text::smooth
+
+    This property holds whether the text is smoothly scaled or transformed.
+
+    Smooth filtering gives better visual quality, but is slower.  If
+    the item is displayed at its natural size, this property has no visual or
+    performance effect.
+
+    \note Generally scaling artifacts are only visible if the item is stationary on
+    the screen.  A common pattern when animating an item is to disable smooth
+    filtering at the beginning of the animation and reenable it at the conclusion.
+*/
+
+/*!
+    \qmlsignal Text::onLinkActivated(string link)
+
+    This handler is called when the user clicks on a link embedded in the text.
+    The link must be in rich text or HTML format and the 
+    \a link string provides access to the particular link. 
+
+    \snippet doc/src/snippets/declarative/text/onLinkActivated.qml 0
+
+    The example code will display the text 
+    "The main website is at \l{http://qt.nokia.com}{Nokia Qt DF}."
+
+    Clicking on the highlighted link will output 
+    \tt{http://qt.nokia.com link activated} to the console.
+*/
 
 /*!
     \qmlproperty string Text::font.family
@@ -320,7 +730,6 @@ QDeclarativeTextPrivate::~QDeclarativeTextPrivate()
     Text { text: "Hello"; font.capitalization: Font.AllLowercase }
     \endqml
 */
-
 QFont QDeclarativeText::font() const
 {
     Q_D(const QDeclarativeText);
@@ -334,30 +743,9 @@ void QDeclarativeText::setFont(const QFont &font)
         return;
 
     d->font = font;
-
     d->updateLayout();
-    d->markImgDirty();
-    emit fontChanged(d->font);
-}
-
-void QDeclarativeText::setText(const QString &n)
-{
-    Q_D(QDeclarativeText);
-    if (d->text == n)
-        return;
 
-    d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(n));
-    if (d->richText) {
-        if (isComponentComplete()) {
-            d->ensureDoc();
-            d->doc->setText(n);
-        }
-    }
-
-    d->text = n;
-    d->updateLayout();
-    d->markImgDirty();
-    emit textChanged(d->text);
+    emit fontChanged(d->font);
 }
 
 /*!
@@ -374,17 +762,25 @@ QString QDeclarativeText::text() const
     return d->text;
 }
 
-void QDeclarativeText::setColor(const QColor &color)
+void QDeclarativeText::setText(const QString &n)
 {
     Q_D(QDeclarativeText);
-    if (d->color == color)
+    if (d->text == n)
         return;
 
-    d->color = color;
-    d->markImgDirty();
-    emit colorChanged(d->color);
+    d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(n));
+    if (d->richText && isComponentComplete()) {
+        d->ensureDoc();
+        d->doc->setText(n);
+    }
+
+    d->text = n;
+    d->updateLayout();
+
+    emit textChanged(d->text);
 }
 
+
 /*!
     \qmlproperty color Text::color
 
@@ -398,13 +794,23 @@ void QDeclarativeText::setColor(const QColor &color)
     Text { color: "steelblue"; ... }
     \endqml
 */
-
 QColor QDeclarativeText::color() const
 {
     Q_D(const QDeclarativeText);
     return d->color;
 }
 
+void QDeclarativeText::setColor(const QColor &color)
+{
+    Q_D(QDeclarativeText);
+    if (d->color == color)
+        return;
+
+    d->color = color;
+    d->invalidateImageCache();
+    emit colorChanged(d->color);
+}
+
 /*!
     \qmlproperty enumeration Text::style
 
@@ -445,21 +851,10 @@ void QDeclarativeText::setStyle(QDeclarativeText::TextStyle style)
     if (isComponentComplete() && (d->style == Normal || style == Normal))
         prepareGeometryChange();
     d->style = style;
-    d->markImgDirty();
+    d->invalidateImageCache();
     emit styleChanged(d->style);
 }
 
-void QDeclarativeText::setStyleColor(const QColor &color)
-{
-    Q_D(QDeclarativeText);
-    if (d->styleColor == color)
-        return;
-
-    d->styleColor = color;
-    d->markImgDirty();
-    emit styleColorChanged(d->styleColor);
-}
-
 /*!
     \qmlproperty color Text::styleColor
 
@@ -481,6 +876,18 @@ QColor QDeclarativeText::styleColor() const
     return d->styleColor;
 }
 
+void QDeclarativeText::setStyleColor(const QColor &color)
+{
+    Q_D(QDeclarativeText);
+    if (d->styleColor == color)
+        return;
+
+    d->styleColor = color;
+    d->invalidateImageCache();
+    emit styleColorChanged(d->styleColor);
+}
+
+
 /*!
     \qmlproperty enumeration Text::horizontalAlignment
     \qmlproperty enumeration Text::verticalAlignment
@@ -511,7 +918,10 @@ void QDeclarativeText::setHAlign(HAlignment align)
 
     if (isComponentComplete())
         prepareGeometryChange();
+
     d->hAlign = align;
+    d->updateLayout();
+
     emit horizontalAlignmentChanged(align);
 }
 
@@ -559,9 +969,8 @@ void QDeclarativeText::setWrapMode(WrapMode mode)
         return;
 
     d->wrapMode = mode;
-
     d->updateLayout();
-    d->markImgDirty();
+    
     emit wrapModeChanged();
 }
 
@@ -621,7 +1030,6 @@ Column {
     \o \image declarative-textformat.png
     \endtable
 */
-
 QDeclarativeText::TextFormat QDeclarativeText::textFormat() const
 {
     Q_D(const QDeclarativeText);
@@ -635,21 +1043,15 @@ void QDeclarativeText::setTextFormat(TextFormat format)
         return;
     d->format = format;
     bool wasRich = d->richText;
-    d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text));
-
-    if (wasRich && !d->richText) {
-        //### delete control? (and vice-versa below)
-        d->updateLayout();
-        d->markImgDirty();
-    } else if (!wasRich && d->richText) {
-        if (isComponentComplete()) {
-            d->ensureDoc();
-            d->doc->setText(d->text);
-        }
-        d->updateLayout();
-        d->markImgDirty();
+    d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text));
+
+    if (!wasRich && d->richText && isComponentComplete()) {
+        d->ensureDoc();
+        d->doc->setText(d->text);
     }
 
+    d->updateLayout();
+
     emit textFormatChanged(d->format);
 }
 
@@ -688,12 +1090,12 @@ void QDeclarativeText::setElideMode(QDeclarativeText::TextElideMode mode)
         return;
 
     d->elideMode = mode;
-
     d->updateLayout();
-    d->markImgDirty();
+    
     emit elideModeChanged(d->elideMode);
 }
 
+/*! \internal */
 QRectF QDeclarativeText::boundingRect() const
 {
     Q_D(const QDeclarativeText);
@@ -704,7 +1106,7 @@ QRectF QDeclarativeText::boundingRect() const
     int x = 0;
     int y = 0;
 
-    QSize size = d->cachedLayoutSize;
+    QSize size = d->layedOutTextSize;
     if (d->style != Normal)
         size += QSize(2,2);
 
@@ -737,117 +1139,23 @@ QRectF QDeclarativeText::boundingRect() const
     return QRectF(x,y,size.width(),size.height());
 }
 
-void QDeclarativeText::geometryChanged(const QRectF &newGeometry,
-                              const QRectF &oldGeometry)
+/*! \internal */
+void QDeclarativeText::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
 {
     Q_D(QDeclarativeText);
-    if (!d->internalWidthUpdate && newGeometry.width() != oldGeometry.width()) {
-        if (d->wrapMode != QDeclarativeText::NoWrap || d->elideMode != QDeclarativeText::ElideNone) {
-            //re-elide if needed
-            if (d->singleline && d->elideMode != QDeclarativeText::ElideNone &&
-                isComponentComplete() && widthValid()) {
-
-                QFontMetrics fm(d->font);
-                QString tmp = fm.elidedText(d->text,(Qt::TextElideMode)d->elideMode,width()); // XXX still worth layout...?
-                d->layout.setText(tmp);
-            }
+    if (!d->internalWidthUpdate && newGeometry.width() != oldGeometry.width() &&
+        (d->wrapMode != QDeclarativeText::NoWrap || d->elideMode != QDeclarativeText::ElideNone)) {
 
-            d->imgDirty = true;
+        if (d->singleline && d->elideMode != QDeclarativeText::ElideNone && widthValid()) {
+            // We need to re-elide
+            d->updateLayout();
+        } else {
+            // We just need to re-layout
             d->updateSize();
         }
     }
-    QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
-}
-
-void QDeclarativeTextPrivate::updateLayout()
-{
-    Q_Q(QDeclarativeText);
-    if (q->isComponentComplete()) {
-        //setup instance of QTextLayout for all cases other than richtext
-        if (!richText) {
-            layout.clearLayout();
-            layout.setFont(font);
-            if (format != QDeclarativeText::StyledText) {
-                QString tmp = text;
-                tmp.replace(QLatin1Char('\n'), QChar::LineSeparator);
-                singleline = !tmp.contains(QChar::LineSeparator);
-                if (singleline && elideMode != QDeclarativeText::ElideNone && q->widthValid()) {
-                    QFontMetrics fm(font);
-                    tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); // XXX still worth layout...?
-                }
-                layout.setText(tmp);
-            } else {
-                singleline = false;
-                QDeclarativeStyledText::parse(text, layout);
-            }
-        }
-        updateSize();
-    } else {
-        dirty = true;
-    }
-}
-
-
-void QDeclarativeTextPrivate::updateSize()
-{
-    Q_Q(QDeclarativeText);
-    if (q->isComponentComplete()) {
-        QFontMetrics fm(font);
-        if (text.isEmpty()) {
-            q->setImplicitHeight(fm.height());
-            emit q->paintedSizeChanged();
-            return;
-        }
-
-        int dy = q->height();
-        QSize size(0, 0);
-
-        //setup instance of QTextLayout for all cases other than richtext
-        if (!richText) {
-            size = setupTextLayout();
-            if (cachedLayoutSize != size) {
-                q->prepareGeometryChange();
-                cachedLayoutSize = size;
-            }
-            dy -= size.height();
-        } else {
-            singleline = false; // richtext can't elide or be optimized for single-line case
-            ensureDoc();
-            doc->setDefaultFont(font);
-            QTextOption option((Qt::Alignment)int(hAlign | vAlign));
-            option.setWrapMode(QTextOption::WrapMode(wrapMode));
-            doc->setDefaultTextOption(option);
-            if (wrapMode != QDeclarativeText::NoWrap && q->widthValid())
-                doc->setTextWidth(q->width());
-            else
-                doc->setTextWidth(doc->idealWidth()); // ### Text does not align if width is not set (QTextDoc bug)
-            dy -= (int)doc->size().height();
-            QSize dsize = doc->size().toSize();
-            if (dsize != cachedLayoutSize) {
-                q->prepareGeometryChange();
-                cachedLayoutSize = dsize;
-            }
-            size = QSize(int(doc->idealWidth()),dsize.height());
-        }
-        int yoff = 0;
 
-        if (q->heightValid()) {
-            if (vAlign == QDeclarativeText::AlignBottom)
-                yoff = dy;
-            else if (vAlign == QDeclarativeText::AlignVCenter)
-                yoff = dy/2;
-        }
-        q->setBaselineOffset(fm.ascent() + yoff);
-
-        //### need to comfirm cost of always setting these for richText
-        internalWidthUpdate = true;
-        q->setImplicitWidth(size.width());
-        internalWidthUpdate = false;
-        q->setImplicitHeight(size.height());
-        emit q->paintedSizeChanged();
-    } else {
-        dirty = true;
-    }
+    QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
 }
 
 /*!
@@ -872,228 +1180,6 @@ qreal QDeclarativeText::paintedHeight() const
     return implicitHeight();
 }
 
-
-
-// ### text layout handling should be profiled and optimized as needed
-// what about QStackTextEngine engine(tmp, d->font.font()); QTextLayout textLayout(&engine);
-
-void QDeclarativeTextPrivate::drawOutline()
-{
-    QPixmap img = QPixmap(imgStyleCache.width()+2,imgStyleCache.height()+2);
-    img.fill(Qt::transparent);
-
-    QPainter ppm(&img);
-
-    QPoint pos(imgCache.rect().topLeft());
-    pos += QPoint(-1, 0);
-    ppm.drawPixmap(pos, imgStyleCache);
-    pos += QPoint(2, 0);
-    ppm.drawPixmap(pos, imgStyleCache);
-    pos += QPoint(-1, -1);
-    ppm.drawPixmap(pos, imgStyleCache);
-    pos += QPoint(0, 2);
-    ppm.drawPixmap(pos, imgStyleCache);
-
-    pos += QPoint(0, -1);
-    ppm.drawPixmap(pos, imgCache);
-    ppm.end();
-
-    imgCache = img;
-}
-
-void QDeclarativeTextPrivate::drawOutline(int yOffset)
-{
-    QPixmap img = QPixmap(imgStyleCache.width()+2,imgStyleCache.height()+2);
-    img.fill(Qt::transparent);
-
-    QPainter ppm(&img);
-
-    QPoint pos(imgCache.rect().topLeft());
-    pos += QPoint(0, yOffset);
-    ppm.drawPixmap(pos, imgStyleCache);
-
-    pos += QPoint(0, -yOffset);
-    ppm.drawPixmap(pos, imgCache);
-    ppm.end();
-
-    imgCache = img;
-}
-
-QSize QDeclarativeTextPrivate::setupTextLayout()
-{
-    Q_Q(QDeclarativeText);
-    layout.setCacheEnabled(true);
-
-    int height = 0;
-    qreal widthUsed = 0;
-    qreal lineWidth = 0;
-
-    //set manual width
-    if ((wrapMode != QDeclarativeText::NoWrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid())
-        lineWidth = q->width();
-
-    QTextOption textOption = layout.textOption();
-    textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
-    layout.setTextOption(textOption);
-
-    layout.beginLayout();
-
-    while (1) {
-        QTextLine line = layout.createLine();
-        if (!line.isValid())
-            break;
-
-        if ((wrapMode != QDeclarativeText::NoWrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid())
-            line.setLineWidth(lineWidth);
-    }
-    layout.endLayout();
-
-    int x = 0;
-    for (int i = 0; i < layout.lineCount(); ++i) {
-        QTextLine line = layout.lineAt(i);
-        widthUsed = qMax(widthUsed, line.naturalTextWidth());
-        line.setPosition(QPointF(0, height));
-        height += int(line.height());
-
-        if (!cache) {
-            if (hAlign == QDeclarativeText::AlignLeft) {
-                x = 0;
-            } else if (hAlign == QDeclarativeText::AlignRight) {
-                x = q->width() - (int)line.naturalTextWidth();
-            } else if (hAlign == QDeclarativeText::AlignHCenter) {
-                x = (q->width() - (int)line.naturalTextWidth()) / 2;
-            }
-            line.setPosition(QPoint(x, (int)line.y()));
-        }
-    }
-
-    return QSize(qCeil(widthUsed), height);
-}
-
-QPixmap QDeclarativeTextPrivate::wrappedTextImage(bool drawStyle)
-{
-    //do layout
-    QSize size = cachedLayoutSize;
-
-    int x = 0;
-    for (int i = 0; i < layout.lineCount(); ++i) {
-        QTextLine line = layout.lineAt(i);
-        if (hAlign == QDeclarativeText::AlignLeft) {
-            x = 0;
-        } else if (hAlign == QDeclarativeText::AlignRight) {
-            x = size.width() - (int)line.naturalTextWidth();
-        } else if (hAlign == QDeclarativeText::AlignHCenter) {
-            x = (size.width() - (int)line.naturalTextWidth()) / 2;
-        }
-        line.setPosition(QPoint(x, (int)line.y()));
-    }
-
-    //paint text
-    QPixmap img(size);
-    if (!size.isEmpty()) {
-        img.fill(Qt::transparent);
-#ifdef Q_WS_MAC
-        bool oldSmooth = qt_applefontsmoothing_enabled;
-        qt_applefontsmoothing_enabled = false;
-#endif
-        QPainter p(&img);
-#ifdef Q_WS_MAC
-        qt_applefontsmoothing_enabled = oldSmooth;
-#endif
-        drawWrappedText(&p, QPointF(0,0), drawStyle);
-    }
-    return img;
-}
-
-void QDeclarativeTextPrivate::drawWrappedText(QPainter *p, const QPointF &pos, bool drawStyle)
-{
-    if (drawStyle)
-        p->setPen(styleColor);
-    else
-        p->setPen(color);
-    p->setFont(font);
-    layout.draw(p , pos); 
-}
-
-QPixmap QDeclarativeTextPrivate::richTextImage(bool drawStyle)
-{
-    QSize size = doc->size().toSize();
-
-    //paint text
-    QPixmap img(size);
-    img.fill(Qt::transparent);
-#ifdef Q_WS_MAC
-    bool oldSmooth = qt_applefontsmoothing_enabled;
-    qt_applefontsmoothing_enabled = false;
-#endif
-    QPainter p(&img);
-#ifdef Q_WS_MAC
-    qt_applefontsmoothing_enabled = oldSmooth;
-#endif
-
-    QAbstractTextDocumentLayout::PaintContext context;
-
-    QTextOption oldOption(doc->defaultTextOption());
-    if (drawStyle) {
-        context.palette.setColor(QPalette::Text, styleColor);
-        QTextOption colorOption(doc->defaultTextOption());
-        colorOption.setFlags(QTextOption::SuppressColors);
-        doc->setDefaultTextOption(colorOption);
-    } else {
-        context.palette.setColor(QPalette::Text, color);
-    }
-    doc->documentLayout()->draw(&p, context);
-    if (drawStyle)
-        doc->setDefaultTextOption(oldOption);
-    return img;
-}
-
-void QDeclarativeTextPrivate::checkImgCache()
-{
-    if (!imgDirty)
-        return;
-
-    bool empty = text.isEmpty();
-    QPixmap newImgCache;
-    if (empty) {
-        imgStyleCache = QPixmap();
-    } else if (richText) {
-        newImgCache = richTextImage(false);
-        if (style != QDeclarativeText::Normal)
-            imgStyleCache = richTextImage(true); //### should use styleColor
-    } else {
-        newImgCache = wrappedTextImage(false);
-        if (style != QDeclarativeText::Normal)
-            imgStyleCache = wrappedTextImage(true); //### should use styleColor
-    }
-    imgCache = newImgCache;
-    if (!empty)
-        switch (style) {
-        case QDeclarativeText::Outline:
-            drawOutline();
-            break;
-        case QDeclarativeText::Sunken:
-            drawOutline(-1);
-            break;
-        case QDeclarativeText::Raised:
-            drawOutline(1);
-            break;
-        default:
-            break;
-        }
-
-    imgDirty = false;
-}
-
-void QDeclarativeTextPrivate::ensureDoc()
-{
-    if (!doc) {
-        Q_Q(QDeclarativeText);
-        doc = new QTextDocumentWithImageResources(q);
-        doc->setDocumentMargin(0);
-    }
-}
-
 /*!
     Returns the number of resources (images) that are being loaded asynchronously.
 */
@@ -1103,22 +1189,14 @@ int QDeclarativeText::resourcesLoading() const
     return d->doc ? d->doc->resourcesLoading() : 0;
 }
 
-/*!
-  \qmlproperty bool Text::clip
-  This property holds whether the text is clipped.
-
-  Note that if the text does not fit in the bounding rectangle it will be abruptly chopped.
-
-  If you want to display potentially long text in a limited space, you probably want to use \c elide instead.
-*/
-
+/*! \internal */
 void QDeclarativeText::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
 {
     Q_D(QDeclarativeText);
 
-    if (d->cache || d->style != Normal) {
-        d->checkImgCache();
-        if (d->imgCache.isNull())
+    if (d->cacheAllTextAsImage || d->style != Normal) {
+        d->checkImageCache();
+        if (d->imageCache.isNull())
             return;
 
         bool oldAA = p->testRenderHint(QPainter::Antialiasing);
@@ -1128,23 +1206,23 @@ void QDeclarativeText::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWid
 
         QRect br = boundingRect().toRect();
 
-        bool needClip = clip() && (d->imgCache.width() > width() ||
-                                   d->imgCache.height() > height());
+        bool needClip = clip() && (d->imageCache.width() > width() ||
+                                   d->imageCache.height() > height());
 
         if (needClip)
-            p->drawPixmap(0, 0, width(), height(), d->imgCache, -br.x(), -br.y(), width(), height());
+            p->drawPixmap(0, 0, width(), height(), d->imageCache, -br.x(), -br.y(), width(), height());
         else
-            p->drawPixmap(br.x(), br.y(), d->imgCache);
+            p->drawPixmap(br.x(), br.y(), d->imageCache);
 
         if (d->smooth) {
             p->setRenderHint(QPainter::Antialiasing, oldAA);
             p->setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth);
         }
     } else {
-        qreal y = boundingRect().y();
+        QRectF bounds = boundingRect();
 
-        bool needClip = clip() && (d->cachedLayoutSize.width() > width() ||
-                                    d->cachedLayoutSize.height() > height());
+        bool needClip = clip() && (d->layedOutTextSize.width() > width() ||
+                                   d->layedOutTextSize.height() > height());
 
         if (needClip) {
             p->save();
@@ -1153,49 +1231,35 @@ void QDeclarativeText::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWid
         if (d->richText) {
             QAbstractTextDocumentLayout::PaintContext context;
             context.palette.setColor(QPalette::Text, d->color);
-            p->translate(0, y);
+            p->translate(bounds.x(), bounds.y());
             d->doc->documentLayout()->draw(p, context);
-            p->translate(0, -y);
+            p->translate(-bounds.x(), -bounds.y());
         } else {
-            d->drawWrappedText(p, QPointF(0,y), false);
+            d->drawTextLayout(p, QPointF(0, bounds.y()), false);
         }
-        if (needClip)
+
+        if (needClip) {
             p->restore();
+        }
     }
 }
 
-/*!
-    \qmlproperty bool Text::smooth
-
-    This property holds whether the text is smoothly scaled or transformed.
-
-    Smooth filtering gives better visual quality, but is slower.  If
-    the item is displayed at its natural size, this property has no visual or
-    performance effect.
-
-    \note Generally scaling artifacts are only visible if the item is stationary on
-    the screen.  A common pattern when animating an item is to disable smooth
-    filtering at the beginning of the animation and reenable it at the conclusion.
-*/
-
+/*! \internal */
 void QDeclarativeText::componentComplete()
 {
     Q_D(QDeclarativeText);
     QDeclarativeItem::componentComplete();
-    if (d->dirty) {
+    if (d->updateOnComponentComplete) {
+        d->updateOnComponentComplete = false;
         if (d->richText) {
             d->ensureDoc();
             d->doc->setText(d->text);
         }
         d->updateLayout();
-        d->dirty = false;
     }
 }
 
-/*!
-  \overload
-  Handles the given mouse \a event.
- */
+/*!  \internal */
 void QDeclarativeText::mousePressEvent(QGraphicsSceneMouseEvent *event)
 {
     Q_D(QDeclarativeText);
@@ -1214,26 +1278,7 @@ void QDeclarativeText::mousePressEvent(QGraphicsSceneMouseEvent *event)
 
 }
 
-/*!
-    \qmlsignal Text::onLinkActivated(string link)
-
-    This handler is called when the user clicks on a link embedded in the text.
-    The link must be in rich text or HTML format and the 
-    \a link string provides access to the particular link. 
-
-    \snippet doc/src/snippets/declarative/text/onLinkActivated.qml 0
-
-    The example code will display the text 
-    "The main website is at \l{http://qt.nokia.com}{Nokia Qt DF}."
-
-    Clicking on the highlighted link will output 
-    \tt{http://qt.nokia.com link activated} to the console.
-*/
-
-/*!
-  \overload
-  Handles the given mouse \a event.
- */
+/*! \internal */
 void QDeclarativeText::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
     Q_D(QDeclarativeText);
diff --git a/src/declarative/graphicsitems/qdeclarativetext_p_p.h b/src/declarative/graphicsitems/qdeclarativetext_p_p.h
index db68558..e37f477 100644
--- a/src/declarative/graphicsitems/qdeclarativetext_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetext_p_p.h
@@ -74,24 +74,8 @@ public:
 
     ~QDeclarativeTextPrivate();
 
-    void ensureDoc();
     void updateSize();
     void updateLayout();
-    void markImgDirty() {
-        Q_Q(QDeclarativeText);
-        imgDirty = true;
-        if (q->isComponentComplete())
-            q->update();
-    }
-    void checkImgCache();
-
-    void drawOutline();
-    void drawOutline(int yOffset);
-
-    QPixmap wrappedTextImage(bool drawStyle);
-    void drawWrappedText(QPainter *p, const QPointF &pos, bool drawStyle);
-    QPixmap richTextImage(bool drawStyle);
-    QSize setupTextLayout();
 
     QString text;
     QFont font;
@@ -99,23 +83,37 @@ public:
     QDeclarativeText::TextStyle style;
     QColor  styleColor;
     QString activeLink;
-    QPixmap imgCache;
-    QPixmap imgStyleCache;
     QDeclarativeText::HAlignment hAlign;
     QDeclarativeText::VAlignment vAlign;
     QDeclarativeText::TextElideMode elideMode;
-    bool imgDirty:1;
-    bool dirty:1;
+    QDeclarativeText::TextFormat format;
+    QDeclarativeText::WrapMode wrapMode;
+
+    void invalidateImageCache();
+    void checkImageCache();
+    QPixmap imageCache;
+
+    bool imageCacheDirty:1;
+    bool updateOnComponentComplete:1;
     bool richText:1;
     bool singleline:1;
-    bool cache:1;
+    bool cacheAllTextAsImage:1;
     bool internalWidthUpdate:1;
+
+    QSize layedOutTextSize;
+    
+    void ensureDoc();
+    QPixmap textDocumentImage(bool drawStyle);
     QTextDocumentWithImageResources *doc;
+
+    QSize setupTextLayout();
+    QPixmap textLayoutImage(bool drawStyle);
+    void drawTextLayout(QPainter *p, const QPointF &pos, bool drawStyle);
     QDeclarativeTextLayout layout;
-    QSize cachedLayoutSize;
-    QDeclarativeText::TextFormat format;
-    QDeclarativeText::WrapMode wrapMode;
-    
+
+    static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource);
+    static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset);
+
     static inline QDeclarativeTextPrivate *get(QDeclarativeText *t) {
         return t->d_func();
     }
-- 
cgit v0.12


From befbf33a0170de28631adb01c49491197595d20c Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Wed, 13 Oct 2010 15:12:28 +1000
Subject: Update reference bitmaps used in bitmap comparison tests to follow
 changes in Text painting

Task-number: QTBUG-14374
---
 .../declarative/qdeclarativetext/data/alignments_cb.png | Bin 496 -> 496 bytes
 .../declarative/qdeclarativetext/data/alignments_cc.png | Bin 556 -> 556 bytes
 .../declarative/qdeclarativetext/data/alignments_ct.png | Bin 533 -> 533 bytes
 3 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png b/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png
index 99de219..cf6199a 100644
Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png differ
diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png b/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png
index cb85251..f81ccb4 100644
Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png differ
diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png b/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png
index ddca549..9ba6412 100644
Binary files a/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png and b/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png differ
-- 
cgit v0.12


From deb92145c5bc69b7ee252687cf5b763b33f17775 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Tue, 28 Sep 2010 10:40:49 +1000
Subject: Update color type docs to mention transparency

---
 doc/src/declarative/basictypes.qdoc | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc
index e327d4a..e8aceb3 100644
--- a/doc/src/declarative/basictypes.qdoc
+++ b/doc/src/declarative/basictypes.qdoc
@@ -156,8 +156,10 @@
     Example:
     \qml
     Rectangle { color: "steelblue" }
+    Rectangle { color: "transparent" }
     Rectangle { color: "#FF0000" }
     Rectangle { color: "#800000FF" }
+    Rectangle { color: "#00000000" }    // ARGB fully transparent
     \endqml
 
     Or with the \l{QML:Qt::rgba()}{Qt.rgba()}, \l{QML:Qt::hsla()}{Qt.hsla()}, \l{QML:Qt::darker()}{Qt.darker()},
-- 
cgit v0.12


From a47835bf8cabffc127c2879b758f6730aca3d52b Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Wed, 13 Oct 2010 16:47:03 +1000
Subject: Fix worker ListModels to property emit countChanged()

Task-number: QT-4094
---
 src/declarative/util/qdeclarativelistmodelworkeragent.cpp      |  2 +-
 .../qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp        | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/declarative/util/qdeclarativelistmodelworkeragent.cpp b/src/declarative/util/qdeclarativelistmodelworkeragent.cpp
index 6804d4a..852b055 100644
--- a/src/declarative/util/qdeclarativelistmodelworkeragent.cpp
+++ b/src/declarative/util/qdeclarativelistmodelworkeragent.cpp
@@ -208,7 +208,7 @@ bool QDeclarativeListModelWorkerAgent::event(QEvent *e)
         const QList<Change> &changes = s->data.changes;
 
         if (m_copy) {
-            bool cc = m_copy->count() != s->list->count();
+            bool cc = m_orig->count() != s->list->count();
 
             FlatListModel *orig = m_orig->m_flat;
             FlatListModel *copy = s->list->m_flat;
diff --git a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
index be77f8e..4b8d772 100644
--- a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
+++ b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp
@@ -320,11 +320,16 @@ void tst_qdeclarativelistmodel::dynamic()
     if (!warning.isEmpty())
         QTest::ignoreMessage(QtWarningMsg, warning.toLatin1());
 
+    QSignalSpy spyCount(&model, SIGNAL(countChanged()));
+
     int actual = e.evaluate().toInt();
     if (e.hasError())
         qDebug() << e.error(); // errors not expected
 
     QCOMPARE(actual,result);
+
+    if (model.count() > 0)
+        QVERIFY(spyCount.count() > 0);
 }
 
 void tst_qdeclarativelistmodel::dynamic_worker_data()
@@ -351,6 +356,8 @@ void tst_qdeclarativelistmodel::dynamic_worker()
     QDeclarativeItem *item = createWorkerTest(&eng, &component, &model);
     QVERIFY(item != 0);
 
+    QSignalSpy spyCount(&model, SIGNAL(countChanged()));
+
     if (script[0] == QLatin1Char('{') && script[script.length()-1] == QLatin1Char('}'))
         script = script.mid(1, script.length() - 2);
     QVariantList operations;
@@ -367,6 +374,9 @@ void tst_qdeclarativelistmodel::dynamic_worker()
     waitForWorker(item);
     QCOMPARE(QDeclarativeProperty(item, "result").read().toInt(), result);
 
+    if (model.count() > 0)
+        QVERIFY(spyCount.count() > 0);
+
     delete item;
     qApp->processEvents();
 }
-- 
cgit v0.12


From 9abacb24b4e88e6811b90881d9e55764061607b2 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Wed, 13 Oct 2010 11:42:57 +0300
Subject: Added --remove-destination to qmake_emulator_deployment.flm

This will fix the issue with deploying files when destination is
owned by another user.

Reviewed-by: TrustMe
---
 mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm b/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm
index 3877edb..a557cbb 100644
--- a/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm
+++ b/mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm
@@ -21,7 +21,7 @@ CLEAN_TARGET:=$(1)
 
 $(1): $(2)
 	$(call startrule,qmake_emulator_deployment) \
-	$(GNUCP) --no-preserve=mode $(2) "$$@" && \
+	$(GNUCP) --remove-destination --no-preserve=mode $(2) "$$@" && \
 	$(GNUCHMOD) a+rw "$$@" \
 	$(call endrule,qmake_emulator_deployment) 	
 endef
-- 
cgit v0.12


From 0f81945563441082551c65f964531c16e185d3de Mon Sep 17 00:00:00 2001
From: Aaron Kennedy <aaron.kennedy@nokia.com>
Date: Wed, 13 Oct 2010 18:50:46 +1000
Subject: Fix autotest on windows

---
 src/declarative/qml/qdeclarativeengine.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 8e1416e..c3fdf36 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -2203,7 +2203,9 @@ bool QDeclarative_isFileCaseCorrect(const QString &fileName)
 #elif defined(Q_OS_WIN32)
     wchar_t buffer[1024];
 
-    DWORD rv = ::GetLongPathName((wchar_t*)absolute.utf16(), buffer, 1024);
+    DWORD rv = ::GetShortPathName((wchar_t*)absolute.utf16(), buffer, 1024);
+    if (rv == 0 || rv >= 1024) return true;
+    rv = ::GetLongPathName(buffer, buffer, 1024);
     if (rv == 0 || rv >= 1024) return true;
 
     QString canonical((QChar *)buffer);
-- 
cgit v0.12