diff --git a/UIAutomation/ChangeLog b/UIAutomation/ChangeLog index 5672028e8..28b13bb5e 100644 --- a/UIAutomation/ChangeLog +++ b/UIAutomation/ChangeLog @@ -1,3 +1,7 @@ +2010-01-20 Matt Guo + + * UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs: unit tests for bug#570621 and bug#571711 + 2010-01-14 Matt Guo * UIAutomationSource/Mono.UIAutomation.Source/IElement.cs: diff --git a/UIAutomation/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs b/UIAutomation/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs index d2d7bb8ee..8ad9f5ec7 100644 --- a/UIAutomation/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs +++ b/UIAutomation/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs @@ -1123,6 +1123,27 @@ public void SupportedPropertiesTest () SupportedPropertiesTestInternal (treeView1Element); SupportedPropertiesTestInternal (listView1Element); } + + [Test] + public void Bug570621_Test () + { + var firstDataItem = this.table1Element.FindFirst (TreeScope.Children, new PropertyCondition( + AEIds.ControlTypeProperty, ControlType.DataItem)); + Assert.AreEqual (0, firstDataItem.Current.NativeWindowHandle); + + Assert.AreEqual (table1Element, + AutomationElement.FromHandle (new IntPtr (table1Element.Current.NativeWindowHandle))); + } + + [Test] + public void Bug571711_Test () + { + var firstDataItem = this.table1Element.FindFirst (TreeScope.Children, new PropertyCondition( + AEIds.ControlTypeProperty, ControlType.DataItem)); + //assert the following line won't fire any exception + firstDataItem.GetCurrentPropertyValue (ValuePattern.ValueProperty); + } + #endregion #region Private Methods diff --git a/UIAutomationWinforms/ChangeLog b/UIAutomationWinforms/ChangeLog index f5b3c7590..6bc81e9a3 100644 --- a/UIAutomationWinforms/ChangeLog +++ b/UIAutomationWinforms/ChangeLog @@ -1,3 +1,16 @@ +2010-01-20 Matt Guo + + * UIAutomationWinforms/Mono.UIAutomation.Winforms/ComboBoxProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms/ScrollBarProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms/PropertyGridViewProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarDataGridProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarListItemProvider.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemValueProviderBehavior.cs: + * UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DomainUpDown/ListItemValueProviderBehavior.cs: Fix bug#570621 and bug#571711 + 2010-01-14 Matt Guo * UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/TableProviderBehavior.cs: diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemValueProviderBehavior.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemValueProviderBehavior.cs index 7af7ab895..404caba86 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemValueProviderBehavior.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemValueProviderBehavior.cs @@ -96,7 +96,7 @@ public void SetValue (string value) } public string Value { - get { return provider.Value as string; } + get { return provider.Value as string ?? string.Empty; } } #endregion diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DomainUpDown/ListItemValueProviderBehavior.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DomainUpDown/ListItemValueProviderBehavior.cs index d92be9cc0..392ab9790 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DomainUpDown/ListItemValueProviderBehavior.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DomainUpDown/ListItemValueProviderBehavior.cs @@ -88,7 +88,10 @@ public void SetValue (string value) } public string Value { - get { return Convert.ToString (((ListItemProvider)Provider).ObjectItem); } + get { + var val = Convert.ToString (((ListItemProvider)Provider).ObjectItem); + return val ?? string.Empty; + } } #endregion diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ComboBoxProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ComboBoxProvider.cs index 6a57f7cd5..9ee859059 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ComboBoxProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ComboBoxProvider.cs @@ -305,7 +305,11 @@ protected override object GetProviderPropertyValue (int propertyId) IExpandCollapseProvider pattern = comboboxProvider.GetPatternProvider (ExpandCollapsePatternIdentifiers.Pattern.Id) as IExpandCollapseProvider; return pattern != null && pattern.ExpandCollapseState == ExpandCollapseState.Collapsed; - } else + } else if (propertyId == AutomationElementIdentifiers.NativeWindowHandleProperty.Id) + //Not like Windows, ComboBox.ListBox is a "real control" and has its own handle. + //On mono ComboxBox.ListBox dosen't has native window handle. + return null; + else return base.GetProviderPropertyValue (propertyId); } @@ -562,6 +566,8 @@ protected override object GetProviderPropertyValue (int propertyId) return Catalog.GetString ("Drop Down Button"); else if (propertyId == AutomationElementIdentifiers.LabeledByProperty.Id) return null; + else if (propertyId == AutomationElementIdentifiers.NativeWindowHandleProperty.Id) + return null; else return base.GetProviderPropertyValue (propertyId); } diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridProvider.cs index 06dd48150..338fca25d 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridProvider.cs @@ -786,6 +786,8 @@ protected override object GetProviderPropertyValue (int propertyId) (Rect) GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id)); } else if (propertyId == AutomationElementIdentifiers.ClickablePointProperty.Id) return Helper.GetClickablePoint (this); + else if (propertyId == AutomationElementIdentifiers.NativeWindowHandleProperty.Id) + return null; else return base.GetProviderPropertyValue (propertyId); } diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs index 7920f20b4..02a7e85da 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs @@ -540,6 +540,8 @@ protected override object GetProviderPropertyValue (int propertyId) return ControlType.DataItem.Id; else if (propertyId == AutomationElementIdentifiers.LocalizedControlTypeProperty.Id) return Catalog.GetString ("data item"); + else if (propertyId == AutomationElementIdentifiers.NativeWindowHandleProperty.Id) + return null; else return base.GetProviderPropertyValue (propertyId); } diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs index f88e4d0ba..92f6b3251 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs @@ -95,6 +95,8 @@ protected override object GetProviderPropertyValue (int propertyId) || propertyId == AutomationElementIdentifiers.NameProperty.Id || propertyId == AutomationElementIdentifiers.IsOffscreenProperty.Id) return ListProvider.GetItemPropertyValue (this, propertyId); + else if (propertyId == AutomationElementIdentifiers.NativeWindowHandleProperty.Id) + return null; else return base.GetProviderPropertyValue (propertyId); } diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarDataGridProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarDataGridProvider.cs index 8d3de21cb..3595704c5 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarDataGridProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarDataGridProvider.cs @@ -75,6 +75,8 @@ protected override object GetProviderPropertyValue (int propertyId) return ControlType.DataGrid.Id; else if (propertyId == AEIds.LocalizedControlTypeProperty.Id) return Catalog.GetString ("data grid"); + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; return base.GetProviderPropertyValue (propertyId); } @@ -392,6 +394,8 @@ protected override object GetProviderPropertyValue (int propertyId) return false; else if (propertyId == AEIds.LabeledByProperty.Id) return null; + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; return base.GetProviderPropertyValue (propertyId); } @@ -463,6 +467,8 @@ protected override object GetProviderPropertyValue (int propertyId) return label; else if (propertyId == AEIds.LabeledByProperty.Id) return null; + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; return base.GetProviderPropertyValue (propertyId); } @@ -521,6 +527,8 @@ protected override object GetProviderPropertyValue (int propertyId) } } else if (propertyId == AEIds.LabeledByProperty.Id) return null; + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; return base.GetProviderPropertyValue (propertyId); } diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarListItemProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarListItemProvider.cs index 7bd29e8d9..4910e26d1 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarListItemProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarListItemProvider.cs @@ -120,6 +120,8 @@ protected override object GetProviderPropertyValue (int propertyId) return Catalog.GetString ("list item"); else if (propertyId == AEIds.NameProperty.Id) return Text; + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; return base.GetProviderPropertyValue (propertyId); } @@ -161,6 +163,8 @@ protected override object GetProviderPropertyValue (int propertyId) return Catalog.GetString ("edit"); else if (propertyId == AEIds.NameProperty.Id) return listItemProvider.Text; + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; return base.GetProviderPropertyValue (propertyId); } diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/PropertyGridViewProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/PropertyGridViewProvider.cs index f6ecdb268..84df6ab25 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/PropertyGridViewProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/PropertyGridViewProvider.cs @@ -380,6 +380,8 @@ protected override object GetProviderPropertyValue (int propertyId) return ControlType.DataItem.Id; else if (propertyId == AEIds.LocalizedControlTypeProperty.Id) return Catalog.GetString ("data item"); + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; else return base.GetProviderPropertyValue (propertyId); } @@ -433,6 +435,8 @@ protected override object GetProviderPropertyValue (int propertyId) controlRect.X = controlRect.Y = 0; return !controlRect.IntersectsWith (GetBounds ()); } + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; return base.GetProviderPropertyValue (propertyId); } @@ -592,6 +596,8 @@ protected override object GetProviderPropertyValue (int propertyId) { if (propertyId == AEIds.NameProperty.Id) return entry.Label; + else if (propertyId == AEIds.NativeWindowHandleProperty.Id) + return null; else if (propertyId == AEIds.ControlTypeProperty.Id) return ControlType.Custom.Id; diff --git a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ScrollBarProvider.cs b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ScrollBarProvider.cs index 581c24ca5..2879276e0 100644 --- a/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ScrollBarProvider.cs +++ b/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ScrollBarProvider.cs @@ -23,7 +23,7 @@ // Mario Carrion // using System; -using System.Drawing; +using System.Drawing; using System.Windows; using System.Windows.Automation; using System.Windows.Automation.Provider; @@ -263,6 +263,8 @@ protected override object GetProviderPropertyValue (int propertyId) return false; else if (propertyId == AutomationElementIdentifiers.ControlTypeProperty.Id) return ControlType.Button.Id; + else if (propertyId == AutomationElementIdentifiers.NativeWindowHandleProperty.Id) + return null; else return base.GetProviderPropertyValue (propertyId); } @@ -319,6 +321,8 @@ protected override object GetProviderPropertyValue (int propertyId) return Catalog.GetString ("thumb"); else if (propertyId == AutomationElementIdentifiers.IsContentElementProperty.Id) return false; + else if (propertyId == AutomationElementIdentifiers.NativeWindowHandleProperty.Id) + return null; else return base.GetProviderPropertyValue (propertyId); } diff --git a/UiaDbus/ChangeLog b/UiaDbus/ChangeLog index 0eab1bf2a..eefff80ec 100644 --- a/UiaDbus/ChangeLog +++ b/UiaDbus/ChangeLog @@ -1,3 +1,7 @@ +2010-01-20 Matt Guo + + * UiaDbusBridge/AutomationBridge.cs: Fix bug#570621 + 2010-01-14 Matt Guo * UiaDbusSource/UiaDbusElement.cs: diff --git a/UiaDbus/UiaDbusBridge/AutomationBridge.cs b/UiaDbus/UiaDbusBridge/AutomationBridge.cs index 1b6b23cc7..cf917c6f8 100644 --- a/UiaDbus/UiaDbusBridge/AutomationBridge.cs +++ b/UiaDbus/UiaDbusBridge/AutomationBridge.cs @@ -196,8 +196,15 @@ public void RaiseStructureChangedEvent (object provider, StructureChangedEventAr lock (providerWrapperMapping) providerWrapperMapping [simpleProvider] = element; if (providerHandle != IntPtr.Zero) - lock (pointerProviderMapping) + lock (pointerProviderMapping) { + // TODO Add debug flag here, we'd better remove the ContainsKey check in the release version + if (pointerProviderMapping.ContainsKey (providerHandle)) { + Log.Error ("Duplicate provider handle, {0}, {1}", + simpleProvider.GetPropertyValue (AEIds.NameProperty.Id), + simpleProvider.GetPropertyValue (AEIds.LocalizedControlTypeProperty.Id)); + } pointerProviderMapping [providerHandle] = simpleProvider; + } if (isWindow) app.AddRootElement (element);