import QtQuick 2.0 Item { property bool success: false BaseComponent2 { id: foo // Override the properties of the base component property string directProperty: 'hello' function getDirectFromExtension() { return directProperty } property alias extensionDirectAlias: foo.directProperty property Text objectProperty: Text { width: 666 } property int optimizedBoundProperty: objectProperty.width function getOptimizedBoundFromExtension() { return optimizedBoundProperty } property alias extensionOptimizedBoundAlias: foo.optimizedBoundProperty property int unoptimizedBoundProperty: if (true) objectProperty.width function getUnoptimizedBoundFromExtension() { return unoptimizedBoundProperty } property alias extensionUnoptimizedBoundAlias: foo.unoptimizedBoundProperty property string extensionDirectPropertyChangedValue: '' onDirectPropertyChanged: extensionDirectPropertyChangedValue = directProperty property int extensionOptimizedBoundPropertyChangedValue: 0 onOptimizedBoundPropertyChanged: extensionOptimizedBoundPropertyChangedValue = optimizedBoundProperty property int extensionUnoptimizedBoundPropertyChangedValue: 0 onUnoptimizedBoundPropertyChanged: extensionUnoptimizedBoundPropertyChangedValue = unoptimizedBoundProperty function setDirectFromExtension(n) { directProperty = n } function setBoundFromExtension(n) { objectProperty.width = n } } Component.onCompleted: { // In the base component, overriding should not affect resolution if (foo.getDirectFromBase() != 333) return if (foo.getOptimizedBoundFromBase() != 333) return if (foo.getUnoptimizedBoundFromBase() != 333) return // In the extension component overriding should occur if (foo.getDirectFromExtension() != 'hello') return if (foo.getOptimizedBoundFromExtension() != 666) return if (foo.getUnoptimizedBoundFromExtension() != 666) return // External access should yield extension component scoping if (foo.directProperty != 'hello') return if (foo.optimizedBoundProperty != 666) return if (foo.unoptimizedBoundProperty != 666) return // Verify alias properties bind to the correct target if (foo.baseDirectAlias != 333) return if (foo.baseOptimizedBoundAlias != 333) return if (foo.baseUnoptimizedBoundAlias != 333) return if (foo.extensionDirectAlias != 'hello') return if (foo.extensionOptimizedBoundAlias != 666) return if (foo.extensionUnoptimizedBoundAlias != 666) return foo.baseDirectPropertyChangedValue = 0 foo.baseOptimizedBoundPropertyChangedValue = 0 foo.baseUnoptimizedBoundPropertyChangedValue = 0 foo.extensionDirectPropertyChangedValue = '' foo.extensionOptimizedBoundPropertyChangedValue = 0 foo.extensionUnoptimizedBoundPropertyChangedValue = 0 // Verify that the correct onChanged signal is emitted foo.setDirectFromBase(999) if (foo.getDirectFromBase() != 999) return if (foo.baseDirectPropertyChangedValue != 999) return if (foo.extensionDirectPropertyChangedValue != '') return foo.setDirectFromExtension('goodbye') if (foo.getDirectFromExtension() != 'goodbye') return if (foo.extensionDirectPropertyChangedValue != 'goodbye') return if (foo.baseDirectPropertyChangedValue != 999) return foo.setBoundFromBase(999) if (foo.getOptimizedBoundFromBase() != 999) return if (foo.getUnoptimizedBoundFromBase() != 999) return if (foo.baseOptimizedBoundPropertyChangedValue != 999) return if (foo.baseUnoptimizedBoundPropertyChangedValue != 999) return if (foo.extensionOptimizedBoundPropertyChangedValue != 0) return if (foo.extensionUnoptimizedBoundPropertyChangedValue != 0) return foo.baseOptimizedBoundPropertyChangedValue = 0 foo.baseUnoptimizedBoundPropertyChangedValue = 0 foo.setBoundFromExtension(123) if (foo.getOptimizedBoundFromExtension() != 123) return if (foo.getUnoptimizedBoundFromExtension() != 123) return if (foo.extensionOptimizedBoundPropertyChangedValue != 123) return if (foo.extensionUnoptimizedBoundPropertyChangedValue != 123) return if (foo.baseOptimizedBoundPropertyChangedValue != 0) return if (foo.baseUnoptimizedBoundPropertyChangedValue != 0) return success = true } }