Enable starting apps with command line arguments when run as admin is selected (#6923)

* Enable Run as Admin Arguments

* Use a seperate function for both methods which were generating ProcessStartInfo fixes missing LnkResolvedPath missing in contextmenu (E.g. Shortcuts / PWA's).

* Update tests

* Move ProgramArguments to Result class

Co-authored-by: Roy <royvou@hotmailcom>
This commit is contained in:
Roy
2020-10-21 20:49:55 +02:00
committed by GitHub
parent 8d9e85f4f5
commit 29ed39c7ae
6 changed files with 47 additions and 29 deletions

View File

@@ -439,7 +439,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _pinnedWebpage.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _pinnedWebpage.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(3, contextMenuResults.Count);
@@ -455,7 +455,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyInternetShortcutApp.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _dummyInternetShortcutApp.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(2, contextMenuResults.Count);
@@ -470,7 +470,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _chrome.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _chrome.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(3, contextMenuResults.Count);
@@ -486,7 +486,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _cmdRunCommand.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _cmdRunCommand.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(3, contextMenuResults.Count);
@@ -502,7 +502,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyAppRefApp.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _dummyAppRefApp.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(3, contextMenuResults.Count);
@@ -518,7 +518,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyShortcutApp.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _dummyShortcutApp.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(3, contextMenuResults.Count);
@@ -534,7 +534,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyFolderApp.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _dummyFolderApp.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(2, contextMenuResults.Count);
@@ -549,7 +549,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyGenericFileApp.ContextMenus(mock.Object);
List<ContextMenuResult> contextMenuResults = _dummyGenericFileApp.ContextMenus(string.Empty, mock.Object);
// Assert
Assert.AreEqual(2, contextMenuResults.Count);
@@ -586,5 +586,20 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
// Act
return Win32Program.GetAppTypeFromPath(path);
}
[TestCase(null)]
[TestCase("")]
[TestCase("ping 1.1.1.1")]
public void EmptyArgumentsShouldNotThrow(string argument)
{
// Arrange
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyInternetShortcutApp.ContextMenus(argument, mock.Object);
// Assert (Should always return if the above does not throw any exception)
Assert.True(true);
}
}
}

View File

@@ -156,9 +156,9 @@ namespace Microsoft.Plugin.Program
}
var menuOptions = new List<ContextMenuResult>();
if (selectedResult.ContextData is Programs.IProgram program)
if (selectedResult.ContextData is IProgram program)
{
menuOptions = program.ContextMenus(_context.API);
menuOptions = program.ContextMenus(selectedResult.ProgramArguments, _context.API);
}
return menuOptions;

View File

@@ -9,7 +9,7 @@ namespace Microsoft.Plugin.Program.Programs
{
public interface IProgram
{
List<ContextMenuResult> ContextMenus(IPublicAPI api);
List<ContextMenuResult> ContextMenus(string queryArguments, IPublicAPI api);
Result Result(string query, string queryArguments, IPublicAPI api);

View File

@@ -98,6 +98,7 @@ namespace Microsoft.Plugin.Program.Programs
Icon = Logo,
Score = score,
ContextData = this,
ProgramArguments = queryArguments,
Action = e =>
{
Launch(api, queryArguments);
@@ -117,7 +118,7 @@ namespace Microsoft.Plugin.Program.Programs
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Intentially keeping the process alive.")]
public List<ContextMenuResult> ContextMenus(IPublicAPI api)
public List<ContextMenuResult> ContextMenus(string queryArguments, IPublicAPI api)
{
if (api == null)
{
@@ -144,7 +145,7 @@ namespace Microsoft.Plugin.Program.Programs
var info = ShellCommand.SetProcessStartInfo(command, verb: "runas");
info.UseShellExecute = true;
info.Arguments = queryArguments;
Process.Start(info);
return true;
},

View File

@@ -220,15 +220,10 @@ namespace Microsoft.Plugin.Program.Programs
IcoPath = IcoPath,
Score = score,
ContextData = this,
ProgramArguments = queryArguments,
Action = e =>
{
var info = new ProcessStartInfo
{
FileName = LnkResolvedPath ?? FullPath,
WorkingDirectory = ParentDirectory,
UseShellExecute = true,
Arguments = queryArguments,
};
var info = GetProcessStartInfo(queryArguments);
Main.StartProcess(Process.Start, info);
@@ -248,7 +243,7 @@ namespace Microsoft.Plugin.Program.Programs
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Intentially keeping the process alive.")]
public List<ContextMenuResult> ContextMenus(IPublicAPI api)
public List<ContextMenuResult> ContextMenus(string queryArguments, IPublicAPI api)
{
if (api == null)
{
@@ -269,14 +264,7 @@ namespace Microsoft.Plugin.Program.Programs
AcceleratorModifiers = ModifierKeys.Control | ModifierKeys.Shift,
Action = _ =>
{
var info = new ProcessStartInfo
{
FileName = FullPath,
WorkingDirectory = ParentDirectory,
Verb = "runas",
UseShellExecute = true,
};
var info = GetProcessStartInfo(queryArguments, true);
Task.Run(() => Main.StartProcess(Process.Start, info));
return true;
@@ -327,6 +315,18 @@ namespace Microsoft.Plugin.Program.Programs
return contextMenus;
}
private ProcessStartInfo GetProcessStartInfo(string programArguments, bool runAsAdmin = false)
{
return new ProcessStartInfo
{
FileName = LnkResolvedPath ?? FullPath,
WorkingDirectory = ParentDirectory,
UseShellExecute = true,
Arguments = programArguments,
Verb = runAsAdmin ? "runas" : string.Empty,
};
}
public override string ToString()
{
return ExecutableName;

View File

@@ -36,6 +36,8 @@ namespace Wox.Plugin
public string FontFamily { get; set; }
public string ProgramArguments { get; set; }
public Visibility ToolTipVisibility { get; set; } = Visibility.Collapsed;
public ToolTipData ToolTipData