diff --git a/src/BaristaLabs.ChromeDevTools.Core/Chrome.cs b/src/BaristaLabs.ChromeDevTools.Core/Chrome.cs index 272cfa0..c47b557 100644 --- a/src/BaristaLabs.ChromeDevTools.Core/Chrome.cs +++ b/src/BaristaLabs.ChromeDevTools.Core/Chrome.cs @@ -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; /// @@ -42,6 +40,18 @@ public async Task GetChromeVersion() return version; } + /// + /// Downloads the Protocol Json from the running Chrome instance + /// + /// json string + public async Task GetProtocolAsJson() + { + using (var chromeDebuggerClient = GetDebuggerClient()) + { + return await chromeDebuggerClient.GetStringAsync("/json/protocol"); + } + } + private HttpClient GetDebuggerClient() { var chromeHttpClient = new HttpClient() @@ -137,77 +147,5 @@ public static Chrome OpenChrome(int remoteDebuggingPort = 9222) return new Chrome(chromeProcess, directoryInfo, remoteDebuggingPort); } - - /// - /// Retrieves the browser protocol pdl for the specified chrome version. - /// - /// - /// Um, yeah. See https://github.com/cyrus-and/chrome-remote-interface/issues/10#issuecomment-146032907 - /// - /// - public static async Task 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)); - } - } - - /// - /// Retrieves the javascript protocol pdl for the specified chrome version. - /// - public static async Task 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)); - } - } - - /// - /// Retrieves the python script that converts a pdl into json for the specified chrome version. - /// - /// - /// - public static async Task 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)); - } - } - - /// - /// Merges a browserProtocol and jsProtocol into a single protocol definition. - /// - /// - /// - /// - 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; - } } } diff --git a/src/ChromeDevToolsGeneratorCLI/PdlConverter.cs b/src/ChromeDevToolsGeneratorCLI/PdlConverter.cs deleted file mode 100644 index 7f0bff6..0000000 --- a/src/ChromeDevToolsGeneratorCLI/PdlConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace ChromeDevToolsGeneratorCLI -{ - using IronPython.Hosting; - using Microsoft.Scripting.Hosting; - using Newtonsoft.Json.Linq; - - /// - /// Uses IronPython to convert the chromium protocol to other formats using the provided chromium pdl script - /// - /// - /// https://cs.chromium.org/chromium/src/third_party/inspector_protocol/ - /// - public class PdlConverter - { - private ScriptEngine Engine - { - get; - set; - } - - private dynamic Scope - { - get; - set; - } - - public PdlConverter(string script) - { - Engine = Python.CreateEngine(); - Scope = Engine.CreateScope(); - Engine.Execute(script, Scope); - } - - public JObject ToJson(string protocol, string fileName) - { - var parsedProtocol = Scope.loads(protocol, fileName); - var json = Scope.json.dumps(parsedProtocol); - - return JObject.Parse(json.ToString()); - } - } -} diff --git a/src/ChromeDevToolsGeneratorCLI/Program.cs b/src/ChromeDevToolsGeneratorCLI/Program.cs index 7eba397..a828a9b 100644 --- a/src/ChromeDevToolsGeneratorCLI/Program.cs +++ b/src/ChromeDevToolsGeneratorCLI/Program.cs @@ -100,21 +100,14 @@ public static async Task 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)); }