Skip to content

Commit 24675be

Browse files
committed
Internal changes to JSON wire protocol handling in .NET bindings
This commit does away with extraneous JsonConverter classes used with the Json.NET serialization library. The changes should be merely internal, but companion projects that incorrectly rely on implementation details of the .NET bindings may find these changes to be breaking. Please adjust accordingly. This prepares the way for future changes to enable the .NET bindings to correctly communicate using the W3C dialect of the JSON Wire Protocol.
1 parent 364187a commit 24675be

File tree

8 files changed

+66
-188
lines changed

8 files changed

+66
-188
lines changed

dotnet/src/webdriver/Firefox/FirefoxDriver.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,8 +313,8 @@ private static ICommandExecutor CreateExtensionConnection(FirefoxBinary binary,
313313
private static ICapabilities RemoveUnneededCapabilities(ICapabilities capabilities)
314314
{
315315
DesiredCapabilities caps = capabilities as DesiredCapabilities;
316-
caps.Capabilities.Remove(FirefoxDriver.ProfileCapabilityName);
317-
caps.Capabilities.Remove(FirefoxDriver.BinaryCapabilityName);
316+
caps.CapabilitiesDictionary.Remove(FirefoxDriver.ProfileCapabilityName);
317+
caps.CapabilitiesDictionary.Remove(FirefoxDriver.BinaryCapabilityName);
318318
return caps;
319319
}
320320
#endregion

dotnet/src/webdriver/Platform.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// </copyright>
1818

1919
using System;
20+
using System.Globalization;
2021

2122
namespace OpenQA.Selenium
2223
{
@@ -167,6 +168,14 @@ public PlatformType PlatformType
167168
get { return this.platformTypeValue; }
168169
}
169170

171+
/// <summary>
172+
/// Gets the value of the platform type for transmission using the JSON Wire Protocol.
173+
/// </summary>
174+
public string ProtocolPlatformType
175+
{
176+
get { return this.platformTypeValue.ToString("G").ToUpper(CultureInfo.InvariantCulture); }
177+
}
178+
170179
/// <summary>
171180
/// Compares the platform to the specified type.
172181
/// </summary>
@@ -213,5 +222,26 @@ public override string ToString()
213222
{
214223
return this.platformTypeValue.ToString();
215224
}
225+
226+
/// <summary>
227+
/// Creates a <see cref="Platform"/> object from a string name of the platform.
228+
/// </summary>
229+
/// <param name="platformName">The name of the platform to create.</param>
230+
/// <returns>The Platform object represented by the string name.</returns>
231+
internal static Platform FromString(string platformName)
232+
{
233+
PlatformType platformTypeFromString = PlatformType.Any;
234+
try
235+
{
236+
platformTypeFromString = (PlatformType)Enum.Parse(typeof(PlatformType), platformName, true);
237+
}
238+
catch (ArgumentException)
239+
{
240+
// If the requested platform string is not a valid platform type,
241+
// ignore it and use PlatformType.Any.
242+
}
243+
244+
return new Platform(platformTypeFromString);
245+
}
216246
}
217247
}

dotnet/src/webdriver/Remote/Command.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public string ParametersAsJsonString
9494
string parametersString = string.Empty;
9595
if (this.commandParameters != null && this.commandParameters.Count > 0)
9696
{
97-
parametersString = JsonConvert.SerializeObject(this.commandParameters, new JsonConverter[] { new DesiredCapabilitiesJsonConverter() });
97+
parametersString = JsonConvert.SerializeObject(this.commandParameters);
9898
}
9999

100100
return parametersString;

dotnet/src/webdriver/Remote/DesiredCapabilities.cs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
using System;
2020
using System.Collections.Generic;
2121
using System.Globalization;
22-
using Newtonsoft.Json;
22+
using OpenQA.Selenium.Internal;
2323

2424
namespace OpenQA.Selenium.Remote
2525
{
@@ -73,18 +73,7 @@ public DesiredCapabilities(Dictionary<string, object> rawMap)
7373
Platform rawAsPlatform = raw as Platform;
7474
if (rawAsString != null)
7575
{
76-
PlatformType platformInfo = PlatformType.Any;
77-
try
78-
{
79-
platformInfo = (PlatformType)Enum.Parse(typeof(PlatformType), rawAsString, true);
80-
}
81-
catch (ArgumentException)
82-
{
83-
// If the server does not pass back a valid platform type, ignore it and
84-
// use PlatformType.Any.
85-
}
86-
87-
this.capabilities[CapabilityType.Platform] = new Platform(platformInfo);
76+
this.SetCapability(CapabilityType.Platform, Platform.FromString(rawAsString));
8877
}
8978
else if (rawAsPlatform != null)
9079
{
@@ -173,11 +162,10 @@ public bool IsJavaScriptEnabled
173162
this.SetCapability(CapabilityType.IsJavaScriptEnabled, value);
174163
}
175164
}
176-
177165
/// <summary>
178166
/// Gets the internal capabilities dictionary.
179167
/// </summary>
180-
internal Dictionary<string, object> Capabilities
168+
internal Dictionary<string, object> CapabilitiesDictionary
181169
{
182170
get { return this.capabilities; }
183171
}
@@ -317,6 +305,11 @@ public object GetCapability(string capability)
317305
if (this.capabilities.ContainsKey(capability))
318306
{
319307
capabilityValue = this.capabilities[capability];
308+
string capabilityValueString = capabilityValue as string;
309+
if (capability == CapabilityType.Platform && capabilityValueString != null)
310+
{
311+
capabilityValue = Platform.FromString(capabilityValue.ToString());
312+
}
320313
}
321314

322315
return capabilityValue;
@@ -329,7 +322,29 @@ public object GetCapability(string capability)
329322
/// <param name="capabilityValue">The value for the capability.</param>
330323
public void SetCapability(string capability, object capabilityValue)
331324
{
332-
this.capabilities[capability] = capabilityValue;
325+
// Handle the special case of Platform objects. These should
326+
// be stored in the underlying dictionary as their protocol
327+
// string representation.
328+
Platform platformCapabilityValue = capabilityValue as Platform;
329+
if (platformCapabilityValue != null)
330+
{
331+
this.capabilities[capability] = platformCapabilityValue.ProtocolPlatformType;
332+
}
333+
else
334+
{
335+
this.capabilities[capability] = capabilityValue;
336+
}
337+
}
338+
339+
/// <summary>
340+
/// Converts the <see cref="ICapabilities"/> object to a <see cref="Dictionary{TKey, TValue}"/>.
341+
/// </summary>
342+
/// <returns>The <see cref="Dictionary{TKey, TValue}"/> containing the capabilities.</returns>
343+
public Dictionary<string, object> ToDictionary()
344+
{
345+
// CONSIDER: Instead of returning the raw internal member,
346+
// we might want to copy/clone it instead.
347+
return this.capabilities;
333348
}
334349

335350
/// <summary>

dotnet/src/webdriver/Remote/JsonConverters/DesiredCapabilitiesJsonConverter.cs

Lines changed: 0 additions & 85 deletions
This file was deleted.

dotnet/src/webdriver/Remote/JsonConverters/PlatformJsonConverter.cs

Lines changed: 0 additions & 81 deletions
This file was deleted.

dotnet/src/webdriver/Remote/RemoteWebDriver.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -883,8 +883,9 @@ protected virtual void Dispose(bool disposing)
883883
/// <param name="desiredCapabilities">Capabilities of the browser</param>
884884
protected void StartSession(ICapabilities desiredCapabilities)
885885
{
886+
DesiredCapabilities capabilitiesObject = desiredCapabilities as DesiredCapabilities;
886887
Dictionary<string, object> parameters = new Dictionary<string, object>();
887-
parameters.Add("desiredCapabilities", desiredCapabilities);
888+
parameters.Add("desiredCapabilities", capabilitiesObject.CapabilitiesDictionary);
888889
Response response = this.Execute(DriverCommand.NewSession, parameters);
889890

890891
Dictionary<string, object> rawCapabilities = (Dictionary<string, object>)response.Value;

dotnet/src/webdriver/WebDriver.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,6 @@
116116
<Compile Include="PhantomJS\PhantomJSOptions.cs" />
117117
<Compile Include="PhantomJS\PhantomJSWebElement.cs" />
118118
<Compile Include="Remote\ICommandServer.cs" />
119-
<Compile Include="Remote\JsonConverters\DesiredCapabilitiesJsonConverter.cs" />
120-
<Compile Include="Remote\JsonConverters\PlatformJsonConverter.cs" />
121119
<Compile Include="Remote\JsonConverters\ResponseValueJsonConverter.cs" />
122120
<Compile Include="Remote\LocalFileDetector.cs" />
123121
<Compile Include="Remote\RemoteTouchScreen.cs" />

0 commit comments

Comments
 (0)