Skip to content

Commit

Permalink
新增Mortise.BrowserAccessibility初步定义 (#18)
Browse files Browse the repository at this point in the history
  • Loading branch information
YanZhiwei authored Jul 10, 2024
1 parent 20e806c commit 5512a42
Show file tree
Hide file tree
Showing 14 changed files with 257 additions and 8 deletions.
25 changes: 17 additions & 8 deletions Mortise.sln
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mortise.Accessibility.Highl
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mortise.Accessibility.Highlighter.Windows", "src\Mortise.Accessibility.Highlighter.Windows\Mortise.Accessibility.Highlighter.Windows.csproj", "{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Browser", "Browser", "{F8E5F417-1060-4972-8FEE-886F38D3D5A8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mortise.BrowserAccessibility", "src\Browser\Mortise.BrowserAccessibility\Mortise.BrowserAccessibility.csproj", "{C6D5A33A-1BC0-4868-B63A-D1416C868088}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Release|Any CPU.Build.0 = Release|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Debug|Any CPU.Build.0 = Debug|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Release|Any CPU.ActiveCfg = Release|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Release|Any CPU.Build.0 = Release|Any CPU
{BF544747-9B9F-4C0D-AB67-7367E5199825}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF544747-9B9F-4C0D-AB67-7367E5199825}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF544747-9B9F-4C0D-AB67-7367E5199825}.Release|Any CPU.ActiveCfg = Release|Any CPU
Expand Down Expand Up @@ -66,6 +62,18 @@ Global
{0267B422-302F-4138-A5D2-7C5547766953}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0267B422-302F-4138-A5D2-7C5547766953}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0267B422-302F-4138-A5D2-7C5547766953}.Release|Any CPU.Build.0 = Release|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Debug|Any CPU.Build.0 = Debug|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Release|Any CPU.ActiveCfg = Release|Any CPU
{13379BE6-2EB7-4661-A2B9-D0681AAF3667}.Release|Any CPU.Build.0 = Release|Any CPU
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0499EB8D-DC8B-47EB-8447-A52579DC4EF3}.Release|Any CPU.Build.0 = Release|Any CPU
{C6D5A33A-1BC0-4868-B63A-D1416C868088}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6D5A33A-1BC0-4868-B63A-D1416C868088}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6D5A33A-1BC0-4868-B63A-D1416C868088}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6D5A33A-1BC0-4868-B63A-D1416C868088}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -75,6 +83,7 @@ Global
{A2BB9733-EB14-4535-9623-9DD96BE33684} = {7033CDE1-20E2-4531-B108-FB8EF2D6F215}
{2F9B1F30-F7BC-416C-BC2D-44FDC7D24FCF} = {B524BD24-3F72-4EB9-A3ED-EFBD39D86211}
{0267B422-302F-4138-A5D2-7C5547766953} = {B524BD24-3F72-4EB9-A3ED-EFBD39D86211}
{C6D5A33A-1BC0-4868-B63A-D1416C868088} = {F8E5F417-1060-4972-8FEE-886F38D3D5A8}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B2EB6DC1-0698-48D8-AD43-BFE923CC54EB}
Expand Down
12 changes: 12 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/BrowserAccessible.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Drawing;
using Mortise.Accessibility.Abstractions;

namespace Mortise.BrowserAccessibility;

public abstract class BrowserAccessible(IBrowserAccessibleContext context) : Accessible
{
protected readonly IBrowserAccessibleContext Context = context ?? throw new ArgumentNullException(nameof(context));
protected BrowserDescriptor Descriptor { get; set; }
public BrowserEngine Engine { get; protected set; }
public abstract Task<IPageAccessibleAction> AttachTo(Point location, string process);
}
13 changes: 13 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/BrowserDescriptor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Mortise.Accessibility.Abstractions;

namespace Mortise.BrowserAccessibility;

public class BrowserDescriptor : IAccessibleDescriptor
{
public string ExecutablePath { get; set; }
public HashSet<string> Profiles { get; set; }
public Version Version { get; set; }
public BrowserEngine Engine { get; set; }
public string[] SupportedProcessNames { get; set; }
public string IdentityString { get; set; }
}
24 changes: 24 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/BrowserEngine.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace Mortise.BrowserAccessibility;

public enum BrowserEngine
{
/// <summary>
/// Trident.
/// </summary>
Trident,

/// <summary>
/// Gecko.
/// </summary>
Gecko,

/// <summary>
/// Webkit
/// </summary>
Webkit,

/// <summary>
/// Chromium
/// </summary>
Chromium
}
11 changes: 11 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/Frame.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Mortise.BrowserAccessibility;

public class Frame
{
private Frame? Parent { get; set; }
public string Name { get; set; }
public string Src { get; set; }
public string Id { get; set; }

public Stack<Frame> Child { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Diagnostics;

namespace Mortise.BrowserAccessibility;

public interface IBrowserAccessibleAction
{
public bool IsConnected { get; }
public Process Process { get; }
public string UniqueId { get; }
public IBrowserAccessibleContext Context { get; }
public Task<IPageAccessibleAction[]?> GetPagesAsync();
public Task<IPageAccessibleAction> NewPageAsync();
public Task<IPageAccessibleAction> GetActivePageAsync();
public Task<IPageAccessibleAction[]?> GetPagesByTitleAsync(string title);
public Task<IPageAccessibleAction[]?> GetPagesByUrlAsync(string url);
public Task CloseAsync();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.Diagnostics;
using System.Drawing;

namespace Mortise.BrowserAccessibility;

public interface IBrowserAccessibleContext
{
public Process[] GetRunningProcess();

/// <summary>
/// 获取矩形框
/// </summary>
/// <returns></returns>
public Rectangle GetBoundingRectangle();

/// <summary>
/// 获取RenderWidget矩形框
/// </summary>
/// <returns></returns>
public Rectangle GetRenderingBoundingRectangle();

public void SetMaximize();

public void SetMinimize();

public BrowserDescriptor GetDescriptor();
}
8 changes: 8 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/IFunction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Mortise.BrowserAccessibility;

public interface IFunction
{
public string Name { get; set; }

public dynamic Parameter { get; set; }
}
35 changes: 35 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/IPageAccessibleAction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System.Drawing;
using Mortise.BrowserAccessibility.Options;

namespace Mortise.BrowserAccessibility;

public interface IPageAccessibleAction
{
public bool IsActive { get; }

public bool IsReady { get; }

public string Url { get; }

public string UniqueId { get; }

public Task<string> GetTitleAsync();

public Task SetActivateAsync();

public Task GotoAsync(string url);

public Task CloseAsync();

public Task<bool> GoBackAsync();

public Task<bool> GoForwardAsync();

public Task<bool> ReloadAsync();

public Task<bool> InjectScriptAsync(InjectScriptOptions options);

public Task<bool> Ping();

public Task ElementFromPoint(Point location);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\nuget.props"></Import>
<Import Project="..\..\..\common.props"></Import>
<Import Project="..\..\..\version.props"></Import>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Tenon.Serialization.Abstractions" Version="0.0.1-alpha-202406271301" />
<PackageReference Include="Tenon.Serialization.Json" Version="0.0.1-alpha-202406271301" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\Mortise.Accessibility.Abstractions\Mortise.Accessibility.Abstractions.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Mortise.BrowserAccessibility.Options;

public class InjectScriptOptions
{
public string Content { get; set; }
public string Type { get; set; } = "text/javascript";
public required object Id { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Mortise.BrowserAccessibility.Options;

public class LaunchOptions
{
public bool Headless { get; set; }

public string ExecutablePath { get; set; }
}
45 changes: 45 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/Request.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
namespace Mortise.BrowserAccessibility;

public abstract class Request<TRes>
{
public Response<TRes> Response { get; private set; }

public TRes Result => Response.Result;

protected virtual async Task OnBeforeRequestAsync()
{
await Task.CompletedTask;
}

protected abstract Task<Response<TRes>> EvaluateAsync(IFunction function);

protected abstract Task<Response<TRes>> ContinueEvaluateAsync(Frame iframe);

public async Task ExecuteAsync(IFunction function)
{
await OnBeforeRequestAsync();
var response = await EvaluateAsync(function);
if (response.Ok)
{
Response = response;
return;
}
await OnContinueExecuteRequestAsync(response);
}

private async Task OnContinueExecuteRequestAsync(Response<TRes> response)
{
var iframes = response.Frame.Child;
foreach (var iframe in iframes)
{
var iframeResponse = await ContinueEvaluateAsync(iframe);
if (iframeResponse.Ok)
{
Response = iframeResponse;
break;
}

await OnContinueExecuteRequestAsync(iframeResponse);
}
}
}
12 changes: 12 additions & 0 deletions src/Browser/Mortise.BrowserAccessibility/Response.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Mortise.BrowserAccessibility;

public class Response<TRes>
{
public Frame? Frame { get; set; }

public TRes? Result { get; set; }

public bool Ok { get; set; }

public bool IsNavigationRequest { get; set; }
}

0 comments on commit 5512a42

Please sign in to comment.