in src/Desktop/UIAutomation/DesktopElementExtensionMethods.cs [238:311]
private static void PopulatePropertiesAndPatternsFromCache(this A11yElement element)
{
try
{
// Get the list of properties to retrieve
A11yAutomation.UIAutomationObject.PollForPotentialSupportedProperties((IUIAutomationElement)element.PlatformObject, out int[] ppids, out string[] ppns);
var ppl = new List<Tuple<int, string>>();
for (int i = 0; i < ppids.Length; i++)
{
var id = (int)ppids.GetValue(i);
var name = (string)ppns.GetValue(i);
if (DesktopElement.IsExcludedProperty(id, name) == false)
{
ppl.Add(new Tuple<int, string>(id, name));
}
}
A11yAutomation.UIAutomationObject.PollForPotentialSupportedPatterns((IUIAutomationElement)element.PlatformObject, out int[] ptids, out string[] ptns);
var ptl = new List<Tuple<int,string>>();
for (int i = 0; i < ptids.Length; i++)
{
ptl.Add(new Tuple<int, string>((int)ptids.GetValue(i), (string)ptns.GetValue(i)));
}
var pplist = (from pp in ppl
select pp.Item1).ToList();
var ptlist = (from pt in ptl
select pt.Item1).ToList();
// build a cache based on the lists
var cache = DesktopElementHelper.BuildCacheRequest(pplist, ptlist);
// buildupdate cached element
var uia = ((IUIAutomationElement)element.PlatformObject).BuildUpdatedCache(cache);
// retrieve properties from cache
var ps = (from pp in ppl//.AsParallel()
let val = GetPropertyValueFromCache(uia, pp.Item1)
where val != null
select new A11yProperty(pp.Item1, val, pp.Item2));
element.Properties = ps.Where(p => !string.IsNullOrEmpty(p.TextValue)).ToDictionary(d => d.Id);
element.UpdateGlimpse();
element.InitClickablePointProperty(uia);
// retrieve patterns from cache
var ptlst = from pt in ptl
let pi = A11yPatternFactory.GetPatternInstance(element, uia, pt.Item1, pt.Item2)
where pi != null
select pi;
element.Patterns = ptlst.ToList();
// release previous UIAElement
Marshal.ReleaseComObject(uia);
// release cache interface.
Marshal.ReleaseComObject(cache);
ppl.Clear();
ptl.Clear();
}
#pragma warning disable CA1031 // Do not catch general exception types
catch (Exception e)
{
e.ReportException();
}
#pragma warning restore CA1031 // Do not catch general exception types
}