From 4f74d04e6a532f8e916c22361216b4aca174441c Mon Sep 17 00:00:00 2001
From: svatal <swata@centrum.cz>
Date: Fri, 11 Aug 2017 15:38:15 +0200
Subject: [PATCH] run chrome in headless mode & wait for user dir deletion

---
 source/ChromeDevTools/ChromeProcessFactory.cs | 16 +++++++++----
 source/ChromeDevTools/IDirectoryCleaner.cs    |  9 +++++++
 source/ChromeDevTools/LocalChromeProcess.cs   | 19 ++++-----------
 .../MasterDevs.ChromeDevTools.csproj          |  2 ++
 .../StubbornDirectoryCleaner.cs               | 24 +++++++++++++++++++
 source/Sample/Program.cs                      |  2 +-
 6 files changed, 52 insertions(+), 20 deletions(-)
 create mode 100644 source/ChromeDevTools/IDirectoryCleaner.cs
 create mode 100644 source/ChromeDevTools/StubbornDirectoryCleaner.cs

diff --git a/source/ChromeDevTools/ChromeProcessFactory.cs b/source/ChromeDevTools/ChromeProcessFactory.cs
index a007628..494568e 100644
--- a/source/ChromeDevTools/ChromeProcessFactory.cs
+++ b/source/ChromeDevTools/ChromeProcessFactory.cs
@@ -6,18 +6,26 @@ namespace MasterDevs.ChromeDevTools
 {
     public class ChromeProcessFactory : IChromeProcessFactory
     {
+        public IDirectoryCleaner DirectoryCleaner { get; set; }
+
+        public ChromeProcessFactory(IDirectoryCleaner directoryCleaner)
+        {
+            DirectoryCleaner = directoryCleaner;
+        }
+
         public IChromeProcess Create(int port)
         {
             string path = Path.GetRandomFileName();
             var directoryInfo = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), path));
-            var remoteDebuggingArg = "--remote-debugging-port=" + port;
-            var userDirectoryArg = "--user-data-dir=\"" + directoryInfo.FullName + "\"";
-            var chromeProcessArgs = remoteDebuggingArg + " " + userDirectoryArg + " --bwsi --no-first-run";
+            var remoteDebuggingArg = $"--remote-debugging-port={port}";
+            var userDirectoryArg = $"--user-data-dir=\"{directoryInfo.FullName}\"";
+            const string headlessArg = "--headless --disable-gpu";
+            var chromeProcessArgs = $"{headlessArg} {remoteDebuggingArg} {userDirectoryArg} --bwsi --no-first-run";
             var processStartInfo = new ProcessStartInfo(@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", chromeProcessArgs);
             var chromeProcess = Process.Start(processStartInfo);
 
             string remoteDebuggingUrl = "http://localhost:" + port;
-            return new LocalChromeProcess(new Uri(remoteDebuggingUrl), directoryInfo, chromeProcess);
+            return new LocalChromeProcess(new Uri(remoteDebuggingUrl), () => DirectoryCleaner.Delete(directoryInfo), chromeProcess);
         }
     }
 }
\ No newline at end of file
diff --git a/source/ChromeDevTools/IDirectoryCleaner.cs b/source/ChromeDevTools/IDirectoryCleaner.cs
new file mode 100644
index 0000000..d27977c
--- /dev/null
+++ b/source/ChromeDevTools/IDirectoryCleaner.cs
@@ -0,0 +1,9 @@
+using System.IO;
+
+namespace MasterDevs.ChromeDevTools
+{
+    public interface IDirectoryCleaner
+    {
+        void Delete(DirectoryInfo dir);
+    }
+}
\ No newline at end of file
diff --git a/source/ChromeDevTools/LocalChromeProcess.cs b/source/ChromeDevTools/LocalChromeProcess.cs
index 62f0e68..c075636 100644
--- a/source/ChromeDevTools/LocalChromeProcess.cs
+++ b/source/ChromeDevTools/LocalChromeProcess.cs
@@ -1,21 +1,18 @@
 using System;
 using System.Diagnostics;
-using System.IO;
-using System.Threading;
 
 namespace MasterDevs.ChromeDevTools
 {
     public class LocalChromeProcess : RemoteChromeProcess
     {
-        public LocalChromeProcess(Uri remoteDebuggingUri, DirectoryInfo userDirectory, Process process)
+        public LocalChromeProcess(Uri remoteDebuggingUri, Action disposeUserDirectory, Process process)
             : base(remoteDebuggingUri)
         {
-            UserDirectory = userDirectory;
+            DisposeUserDirectory = disposeUserDirectory;
             Process = process;
         }
 
-        public DirectoryInfo UserDirectory { get; set; }
-
+        public Action DisposeUserDirectory { get; set; }
         public Process Process { get; set; }
 
         public override void Dispose()
@@ -23,15 +20,7 @@ namespace MasterDevs.ChromeDevTools
             base.Dispose();
 
             Process.Kill();
-            try
-            {
-                UserDirectory.Delete(true);
-            }
-            catch
-            {
-                Thread.Sleep(500);          // i'm being lazy because i'm tired
-                UserDirectory.Delete(true);
-            }
+            DisposeUserDirectory();
         }
     }
 }
\ No newline at end of file
diff --git a/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj b/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj
index e3c29d8..edd8226 100644
--- a/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj
+++ b/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj
@@ -60,6 +60,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="ChromeProcessFactory.cs" />
+    <Compile Include="IDirectoryCleaner.cs" />
     <Compile Include="LocalChromeProcess.cs" />
     <Compile Include="ChromeSession.cs" />
     <Compile Include="ChromeSessionExtensions.cs" />
@@ -93,6 +94,7 @@
     <Compile Include="Protocol\**\*.cs" />
     <Compile Include="RemoteChromeProcess.cs" />
     <Compile Include="Serialization\MessageContractResolver.cs" />
+    <Compile Include="StubbornDirectoryCleaner.cs" />
     <Compile Include="SupportedByAttribute.cs" />
   </ItemGroup>
   <ItemGroup>
diff --git a/source/ChromeDevTools/StubbornDirectoryCleaner.cs b/source/ChromeDevTools/StubbornDirectoryCleaner.cs
new file mode 100644
index 0000000..4d44869
--- /dev/null
+++ b/source/ChromeDevTools/StubbornDirectoryCleaner.cs
@@ -0,0 +1,24 @@
+using System.IO;
+using System.Threading;
+
+namespace MasterDevs.ChromeDevTools
+{
+    public class StubbornDirectoryCleaner : IDirectoryCleaner
+    {
+        public void Delete(DirectoryInfo dir)
+        {
+            while (true)
+            {
+                try
+                {
+                    dir.Delete(true);
+                    return;
+                }
+                catch
+                {
+                    Thread.Sleep(500);
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/source/Sample/Program.cs b/source/Sample/Program.cs
index b861c9c..ae7011a 100644
--- a/source/Sample/Program.cs
+++ b/source/Sample/Program.cs
@@ -12,7 +12,7 @@ namespace MasterDevs.ChromeDevTools.Sample
             Task.Run(async () =>
             {
                 // STEP 1 - Run Chrome
-                var chromeProcessFactory = new ChromeProcessFactory();
+                var chromeProcessFactory = new ChromeProcessFactory(new StubbornDirectoryCleaner());
                 using (var chromeProcess = chromeProcessFactory.Create(9222))
                 {
                     // STEP 2 - Create a debugging session
-- 
GitLab