Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 12 additions & 74 deletions src/BaristaLabs.ChromeDevTools.Core/Chrome.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
namespace BaristaLabs.ChromeDevTools
{
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

/// <summary>
Expand Down Expand Up @@ -42,6 +40,18 @@ public async Task<ChromeVersion> GetChromeVersion()
return version;
}

/// <summary>
/// Downloads the Protocol Json from the running Chrome instance
/// </summary>
/// <returns>json string</returns>
public async Task<string> GetProtocolAsJson()
{
using (var chromeDebuggerClient = GetDebuggerClient())
{
return await chromeDebuggerClient.GetStringAsync("/json/protocol");
}
}

private HttpClient GetDebuggerClient()
{
var chromeHttpClient = new HttpClient()
Expand Down Expand Up @@ -137,77 +147,5 @@ public static Chrome OpenChrome(int remoteDebuggingPort = 9222)

return new Chrome(chromeProcess, directoryInfo, remoteDebuggingPort);
}

/// <summary>
/// Retrieves the browser protocol pdl for the specified chrome version.
/// </summary>
/// <remarks>
/// Um, yeah. See https://github.com/cyrus-and/chrome-remote-interface/issues/10#issuecomment-146032907
/// </remarks>
/// <returns></returns>
public static async Task<string> GetBrowserProtocolForChromeVersion(ChromeVersion chromeVersion)
{
var browserProtocolUrl = $"https://chromium.googlesource.com/chromium/src/+/{chromeVersion.WebKitVersionHash}/third_party/blink/renderer/core/inspector/browser_protocol.pdl?format=TEXT";

using (var browserProtocolClient = new HttpClient())
{
var browserProtocol64 = await browserProtocolClient.GetStringAsync(browserProtocolUrl);
return Encoding.UTF8.GetString(Convert.FromBase64String(browserProtocol64));
}
}

/// <summary>
/// Retrieves the javascript protocol pdl for the specified chrome version.
/// </summary>
public static async Task<string> GetJavaScriptProtocolForChromeVersion(ChromeVersion chromeVersion)
{
var jsProtocolUrl = $"https://chromium.googlesource.com/v8/v8/+/{chromeVersion.V8VersionNumber}/src/inspector/js_protocol.pdl?format=TEXT";

using (var jsProtocolClient = new HttpClient())
{
var jsProtocol64 = await jsProtocolClient.GetStringAsync(jsProtocolUrl);
return Encoding.UTF8.GetString(Convert.FromBase64String(jsProtocol64));
}
}

/// <summary>
/// Retrieves the python script that converts a pdl into json for the specified chrome version.
/// </summary>
/// <param name="chromeVersion"></param>
/// <returns></returns>
public static async Task<string> GetInspectorProtocolConverterPythonScript(ChromeVersion chromeVersion)
{
var protocolScriptUrl = $"https://chromium.googlesource.com/chromium/src/+/{chromeVersion.WebKitVersionHash}/third_party/inspector_protocol/pdl.py?format=TEXT";
using (var jsProtocolClient = new HttpClient())
{
var script64 = await jsProtocolClient.GetStringAsync(protocolScriptUrl);
return Encoding.UTF8.GetString(Convert.FromBase64String(script64));
}
}

/// <summary>
/// Merges a browserProtocol and jsProtocol into a single protocol definition.
/// </summary>
/// <param name="browserProtocol"></param>
/// <param name="jsProtocol"></param>
/// <returns></returns>
public static JObject MergeJavaScriptProtocolDefinitions(JObject browserProtocol, JObject jsProtocol)
{
//Merge the 2 protocols together.
if (jsProtocol["version"]["majorVersion"] != browserProtocol["version"]["majorVersion"] ||
jsProtocol["version"]["minorVersion"] != browserProtocol["version"]["minorVersion"])
{
throw new InvalidOperationException("Protocol mismatch -- The WebKit and V8 protocol versions should match.");
}

var result = browserProtocol.DeepClone() as JObject;
foreach (var domain in jsProtocol["domains"])
{
JArray jDomains = (JArray)result["domains"];
jDomains.Add(domain);
}

return result;
}
}
}
42 changes: 0 additions & 42 deletions src/ChromeDevToolsGeneratorCLI/PdlConverter.cs

This file was deleted.

13 changes: 3 additions & 10 deletions src/ChromeDevToolsGeneratorCLI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,21 +100,14 @@ public static async Task<JObject> GetProtocolDefinitionData(CliArguments args)
Console.WriteLine("Obtaining protocol definition from installed Chrome version...");

ChromeVersion currentVersion;
string protocolJson;
using (var chrome = Chrome.OpenChrome())
{
currentVersion = await chrome.GetChromeVersion();
protocolJson = await chrome.GetProtocolAsJson();
}

var browserProtocolPdl = await Chrome.GetBrowserProtocolForChromeVersion(currentVersion);
var javaScriptProtocolPdl = await Chrome.GetJavaScriptProtocolForChromeVersion(currentVersion);

var pdlScript = await Chrome.GetInspectorProtocolConverterPythonScript(currentVersion);

var pdlConverter = new PdlConverter(pdlScript);
var browserProtocol = pdlConverter.ToJson(browserProtocolPdl, "browser_protocol.pdl");
var jsProtocol = pdlConverter.ToJson(javaScriptProtocolPdl, "js_protocol.pdl");

protocolData = Chrome.MergeJavaScriptProtocolDefinitions(browserProtocol, jsProtocol);
protocolData = JObject.Parse(protocolJson);
protocolData["chromeVersion"] = JToken.FromObject(currentVersion);
File.WriteAllText(args.ProtocolPath, JsonConvert.SerializeObject(protocolData, Formatting.Indented));
}
Expand Down