'window' contextProperty is registered after components are completed

Bug #1621509 reported by Tim Peeters on 2016-09-08
10
This bug affects 2 people
Affects Status Importance Assigned to Milestone
ubuntu-ui-toolkit (Ubuntu)
Critical
Tim Peeters

Bug Description

This is the cause for the Sections index resetting after initialization, see bug 1610231.

Use this code:
------ ModelFromList13.qml ------
import QtQuick 2.4

// This component is used in tst_listview_bug1621509.13.qml
Item {
    id: root
    property var myObject
    property int count: 0 // will hold the number of changes to myObject after Component.completed.

    onMyObjectChanged: {
        print("myObject changed to "+myObject)
        count++;
    }
    Component.onCompleted: {
        count = 0;
    }
}

------ tst_list_model_from_list_bug1621509.13.qml ------
import QtQuick 2.4
import QtTest 1.0

// Ubuntu.Components is not explicitly used below, but its import causes bug #1621509.
import Ubuntu.Components 1.3

TestCase {
    id: testCase
    name: "EmbeddedListView"
    width: 100
    height: 100

    // Bug #1621509 only occurs when we wait for the window to be visible.
    // Forces the components to be completed before the test functions are executed.
    when: windowShown

    ModelFromList13 {
        id: embeddedListView
        QtObject {
            objectName: "one"
            id: objectOne
        }
        myObject: objectOne
    }

    Component.onCompleted: {
        print("Component completed."); // must print something to reproduce the bug.
    }

    function test_no_model_change_after_completed_bug1621509_bug1610231() {
        compare(embeddedListView.count, 0,
                "The model was changed after the component was completed.");
    }
}
----------

the test will fail. Also, one can replace the TestCase by Item (and remove when: windowShown) and simply use qmlscene to start the app. It will show that myObject is set twice: before the component completed, and then again afterwards. I suspect the reason for this is the change of the 'window' context property which causes everything in the context (objectOne) and properties that depend on that to be re-evaluated.

Related branches

Tim Peeters (tpeeters) on 2016-09-08
Changed in ubuntu-ui-toolkit (Ubuntu):
importance: Undecided → Critical
tags: added: qt56
tags: added: qt5.6
removed: qt56
Tim Peeters (tpeeters) wrote :

I checked and no ListViewProxy is created. So something else causes this when importing Ubuntu.Components (1.0/1.1/1.2/1.3).

description: updated
Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in ubuntu-ui-toolkit (Ubuntu):
status: New → Confirmed
Zsombor Egri (zsombi) wrote :

ListView extension is not active if someone explicitly uses ViewItems attached properties or ListItem as delegate. As your sample doesn't use either of these, it cannot be the culprit. You don't seem to use anything from UITK so the only elements are instantiated at this time are the context properties. However neither of those should have any effect on the model setup.

Tim Peeters (tpeeters) wrote :

I can reproduce the issue without using a ListView.

Tim Peeters (tpeeters) wrote :

Code to reproduce the issue without using a ListView is here: http://bazaar.launchpad.net/~tpeeters/ubuntu-ui-toolkit/qt56fixes2sections/revision/2095

Changed in ubuntu-ui-toolkit (Ubuntu):
assignee: nobody → Tim Peeters (tpeeters)
status: Confirmed → In Progress
Tim Peeters (tpeeters) wrote :

After further investigation and discussion, this seems to be the problem:

- focusWindow changes after the components are completed.
- change of focusWindow registers a new 'window' context property.
- registering a new context property, causes a re-evaluation of properties in the context.

So the properties of variables are set twice, once before the focus window is set, and once afterwards. This gives problems, for example, in the Sections where the index is reset when its model is changed after the Sections component was completed, thus overriding the index property that was explicitly set by the app developer.

Tim Peeters (tpeeters) wrote :

^properties of variables = properties of components.

Tim Peeters (tpeeters) on 2016-09-14
summary: - ListView with extension from UbuntuToolkit updates its model after the
- component is completed
+ 'window' contextProperty is registered after components are completed
Tim Peeters (tpeeters) on 2016-09-15
description: updated
Tim Peeters (tpeeters) on 2016-09-27
Changed in ubuntu-ui-toolkit (Ubuntu):
status: In Progress → Fix Committed
Launchpad Janitor (janitor) wrote :
Download full text (4.4 KiB)

This bug was fixed in the package ubuntu-ui-toolkit - 1.3.2135+16.10.20161003.1

---------------
ubuntu-ui-toolkit (1.3.2135+16.10.20161003.1) yakkety; urgency=medium

  [ Christian Dywan ]
  * Fix warning about using implicit char* to QString conversion.
  * __styleInstance may be null, when doesn't handle that. Fixes LP: #1586013
  * Focus ring, arrow keys and space to expand OptionSelector.
    Fixes LP: #1514860
  * Use QStringLiteral with QString.replace. Fixes LP: #1625507
  * Use displayText to determine if the clear button should show.
    Fixes LP: #1461571
  * && escapes an ampersand used in a mnemonic label. Fixes LP: #1587580
  * Try harder to pass an item to QuickUtils.rootItem. Fixes LP: #1586013

  [ Timo Jyrinki ]
  * Enable arm64 unit tests on xenial and newer. Fixes LP: #1580172.
  * Add initial snapcraft.yaml

  [ Marco Trevisan ]
  * UCSlotsLayout: update the size of the element when top/bottom paddings change.
    Fixes LP: #1628161

  [ Tim Peeters ]
  * Ensure that the model in TabBarStyle is a list and not null.
    Fixes LP: #1622577.
  * Initialize the 'window' context property with null and add MainView 1.3 unit
    tests. Fixes LP: #1610231, LP: #1621509, LP: #1625993.
  * Fix libpng sRGB profile warnings on Yakkety. Fixes LP: #1625137.
  * Disable layouts unit test to work around bug 1625137 on Yakkety.

  [ Zsombor Egri ]
  * Fix AdaptivePageLayout behavior on Qt5.6. Fixes LP: #1585996.
  * Fix property binding restore on theme palette values. Fixes LP: #1570478.
  * Move activeFocusOnTab from style into components. Fixes LP: #1590005.

  [ Loïc Molinari ]
  * Added public headers extra robustness checks. Made use of the qmake
    headersclean feature to check the robustness of our public headers.
  * Excluded LTTng features from non-Linux builds.
  * Moved common C++ configs to ubuntu_common.prf. The common config file
    doesn't add -Werror directly to QMAKE_CXXFLAGS anymore, it sets the
    warnings_are_errors variable so that it is correctly handled by different
    compilers (not just GCC). That allows to remove the
    -Werror=deprecated-declarations flag since warnings_are_errors defines it
    for us. Removed the DEFINES += QT_USE_QSTRINGBUILDER lines since it's
    already handled by qt_module.prf. Set the -Wsuggest-override warning to
    QMAKE_CXXFLAGS_WARN_ON instead of QMAKE_CXXFLAGS directly.
  * Cleaned up qmake Ubuntu packaging variables. The qtbase packaging for Ubuntu
    exports the CFLAGS, CXXFLAGS and LFLAGS variables in the environment before
    running configure so that the qtbase shared libraries can be compiled with
    the required distribution defined compiler flags. That is fine (though I
    guess that could be handled better at the qtbase packaging level with maybe
    a dedicated prf) but it results in qt_build_config.prf defining the
    QMAKE_CFLAGS, QMAKE_CXXFLAGS and QMAKE_LFLAGS variables with these
    distribution specific flags. Since we load this prf, these variables end up
    being defined when building the toolkit for development purpose. This is
    problematic because -O2 and -g are always defined (whatever the debug or
    release config chosen by the developer), al...

Read more...

Changed in ubuntu-ui-toolkit (Ubuntu):
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers