private object ParseJavaScriptReturnValue(object responseValue)
{
object returnValue = null;
Dictionary<string, object> resultAsDictionary = responseValue as Dictionary<string, object>;
object[] resultAsArray = responseValue as object[];
if (resultAsDictionary != null)
{
if (resultAsDictionary.ContainsKey("ELEMENT"))
{
string id = (string)resultAsDictionary["ELEMENT"];
RemoteWebElement element = this.CreateElement(id);
returnValue = element;
}
else
{
// Recurse through the dictionary, re-parsing each value.
string[] keyCopy = new string[resultAsDictionary.Keys.Count];
resultAsDictionary.Keys.CopyTo(keyCopy, 0);
foreach (string key in keyCopy)
{
resultAsDictionary[key] = this.ParseJavaScriptReturnValue(resultAsDictionary[key]);
}
returnValue = resultAsDictionary;
}
}
else if (resultAsArray != null)
{
bool allElementsAreWebElements = true;
List<object> toReturn = new List<object>();
foreach (object item in resultAsArray)
{
object parsedItem = this.ParseJavaScriptReturnValue(item);
IWebElement parsedItemAsElement = parsedItem as IWebElement;
if (parsedItemAsElement == null)
{
allElementsAreWebElements = false;
}
toReturn.Add(parsedItem);
}
if (toReturn.Count > 0 && allElementsAreWebElements)
{
List<IWebElement> elementList = new List<IWebElement>();
foreach (object listItem in toReturn)
{
IWebElement itemAsElement = listItem as IWebElement;
elementList.Add(itemAsElement);
}
returnValue = elementList.AsReadOnly();
}
else
{
returnValue = toReturn.AsReadOnly();
}
}
else
{
returnValue = responseValue;
}
return returnValue;
}