From f00120d1ff65fbd67c76ea2f94e4332ab455ad36 Mon Sep 17 00:00:00 2001
From: Georgios Diamantopoulos <georgiosd@gmail.com>
Date: Thu, 16 Mar 2017 17:18:01 +0200
Subject: [PATCH] allow starting new sessions

---
 source/ChromeDevTools/ChromeSessionFactory.cs |  5 +++
 source/ChromeDevTools/IChromeProcess.cs       |  4 ++-
 source/ChromeDevTools/LocalChromeProcess.cs   |  2 ++
 source/ChromeDevTools/RemoteChromeProcess.cs  | 32 +++++++++++++------
 4 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/source/ChromeDevTools/ChromeSessionFactory.cs b/source/ChromeDevTools/ChromeSessionFactory.cs
index 4aa60b6..36facc2 100644
--- a/source/ChromeDevTools/ChromeSessionFactory.cs
+++ b/source/ChromeDevTools/ChromeSessionFactory.cs
@@ -3,6 +3,11 @@ namespace MasterDevs.ChromeDevTools
 {
     public class ChromeSessionFactory : IChromeSessionFactory
     {
+        public IChromeSession Create(ChromeSessionInfo sessionInfo)
+        {
+            return Create(sessionInfo.WebSocketDebuggerUrl);
+        }
+
         public IChromeSession Create(string endpointUrl)
         {
             // Sometimes binding to localhost might resolve wrong AddressFamily, force IPv4
diff --git a/source/ChromeDevTools/IChromeProcess.cs b/source/ChromeDevTools/IChromeProcess.cs
index 5acfd30..b6d6242 100644
--- a/source/ChromeDevTools/IChromeProcess.cs
+++ b/source/ChromeDevTools/IChromeProcess.cs
@@ -5,7 +5,9 @@ namespace MasterDevs.ChromeDevTools
 {
     public interface IChromeProcess : IDisposable
     {
-        Task<ChromeSessionInfo[]> GetSessions();
+        Task<ChromeSessionInfo[]> GetSessionInfo();
+
+        Task<ChromeSessionInfo> StartNewSession();
 
         Uri RemoteDebuggingUri { get; }
     }
diff --git a/source/ChromeDevTools/LocalChromeProcess.cs b/source/ChromeDevTools/LocalChromeProcess.cs
index 8c2e629..62f0e68 100644
--- a/source/ChromeDevTools/LocalChromeProcess.cs
+++ b/source/ChromeDevTools/LocalChromeProcess.cs
@@ -20,6 +20,8 @@ namespace MasterDevs.ChromeDevTools
 
         public override void Dispose()
         {
+            base.Dispose();
+
             Process.Kill();
             try
             {
diff --git a/source/ChromeDevTools/RemoteChromeProcess.cs b/source/ChromeDevTools/RemoteChromeProcess.cs
index 0076d9b..e10ff60 100644
--- a/source/ChromeDevTools/RemoteChromeProcess.cs
+++ b/source/ChromeDevTools/RemoteChromeProcess.cs
@@ -7,29 +7,41 @@ namespace MasterDevs.ChromeDevTools
 {
     public class RemoteChromeProcess : IChromeProcess
     {
+        private readonly HttpClient http;
+
+        public RemoteChromeProcess(string remoteDebuggingUri)
+            : this(new Uri(remoteDebuggingUri))
+        {
+
+        }
+
         public RemoteChromeProcess(Uri remoteDebuggingUri)
         {
             RemoteDebuggingUri = remoteDebuggingUri;
+
+            http = new HttpClient
+            {
+                BaseAddress = RemoteDebuggingUri
+            };
         }
 
         public Uri RemoteDebuggingUri { get; }
 
         public virtual void Dispose()
         {
+            http.Dispose();
         }
 
-        public async Task<ChromeSessionInfo[]> GetSessions()
+        public async Task<ChromeSessionInfo[]> GetSessionInfo()
         {
-            using (var http = new HttpClient
-            {
-                BaseAddress = RemoteDebuggingUri
-            })
-            {
-                string json = await http.GetStringAsync("/json");
-                return JsonConvert.DeserializeObject<ChromeSessionInfo[]>(json);
-            }
+            string json = await http.GetStringAsync("/json");
+            return JsonConvert.DeserializeObject<ChromeSessionInfo[]>(json);
         }
 
-        
+        public async Task<ChromeSessionInfo> StartNewSession()
+        {
+            string json = await http.GetStringAsync("/json");
+            return JsonConvert.DeserializeObject<ChromeSessionInfo>(json);
+        }
     }
 }
\ No newline at end of file
-- 
GitLab