Skip to content

Commit

Permalink
Merge remote-tracking branch 'internal/develop' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
Grabacr07 committed Mar 28, 2020
2 parents 03230ef + 712db89 commit d166cf5
Show file tree
Hide file tree
Showing 9 changed files with 150 additions and 61 deletions.
15 changes: 1 addition & 14 deletions source/Grabacr07.KanColleViewer/Application.Static.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ partial class Application
static Application()
{
AppDomain.CurrentDomain.UnhandledException += (sender, args) => ReportException("AppDomain", sender, args.ExceptionObject as Exception);
AppDomain.CurrentDomain.AssemblyResolve += CefBridge.ResolveCefSharpAssembly;

TelemetryClient = new TelemetryClient();
TelemetryClient.Context.Session.Id = Guid.NewGuid().ToString();
Expand All @@ -37,20 +38,6 @@ static Application()

static partial void SetInstrumentationKey();

private static void CefInitialize()
{
var cefSettings = new CefSettings()
{
CachePath = CefBridge.CachePath,
};
cefSettings.CefCommandLineArgs.Add("proxy-server", Models.Settings.NetworkSettings.LocalProxySettingsString);
//cefSettings.CefCommandLineArgs.Add("disable-webgl", "1");
CefSharpSettings.SubprocessExitIfParentProcessClosed = true;

Cef.EnableHighDPISupport();
Cef.Initialize(cefSettings);
}

/// <summary>
/// <see cref="ProxyBootstrapper"/> を使用し、<see cref="KanColleProxy"/> を起動することを試みます。
/// 必要に応じて、ユーザーに操作を求めるダイアログを表示します。
Expand Down
3 changes: 2 additions & 1 deletion source/Grabacr07.KanColleViewer/Application.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using CefSharp;
using Grabacr07.KanColleViewer.Composition;
using Grabacr07.KanColleViewer.Models;
using Grabacr07.KanColleViewer.Models.Cef;
using Grabacr07.KanColleViewer.Models.Settings;
using Grabacr07.KanColleViewer.ViewModels;
using Grabacr07.KanColleViewer.Views;
Expand Down Expand Up @@ -89,7 +90,7 @@ protected override void OnStartup(StartupEventArgs e)
Helper.SetMMCSSTask();
Helper.DeleteCacheIfRequested();

CefInitialize();
CefBridge.Initialize();

// BootstrapProxy() で Views.Settings.ProxyBootstrapper.Show() が呼ばれるより前に
// Application.MainWindow を設定しておく。これ大事
Expand Down
42 changes: 18 additions & 24 deletions source/Grabacr07.KanColleViewer/KanColleViewer.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.props" Condition="Exists('..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.props')" />
<Import Project="..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.props" Condition="Exists('..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.props')" />
<Import Project="..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.props" Condition="Exists('..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.props')" />
<Import Project="..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.props" Condition="Exists('..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.props')" />
<Import Project="..\packages\cef.redist.x86.3.3396.1786\build\cef.redist.x86.props" Condition="Exists('..\packages\cef.redist.x86.3.3396.1786\build\cef.redist.x86.props')" />
<Import Project="..\packages\cef.redist.x64.3.3396.1786\build\cef.redist.x64.props" Condition="Exists('..\packages\cef.redist.x64.3.3396.1786\build\cef.redist.x64.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
Expand All @@ -18,49 +18,43 @@
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<SccProjectName>
</SccProjectName>
<SccLocalPath>
</SccLocalPath>
<SccAuxPath>
</SccAuxPath>
<SccProvider>
</SccProvider>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
<TargetFrameworkProfile />
<ExpressionBlendVersion>12.0.50716.0</ExpressionBlendVersion>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Assets\app.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;BETA</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release %28beta%29|x86'">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release %28beta%29|AnyCPU'">
<OutputPath>bin\x86\Release %28beta%29\</OutputPath>
<DefineConstants>TRACE;BETA</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
Expand Down Expand Up @@ -661,13 +655,13 @@
</PropertyGroup>
<Error Condition="!Exists('..\packages\cef.redist.x64.3.3396.1786\build\cef.redist.x64.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x64.3.3396.1786\build\cef.redist.x64.props'))" />
<Error Condition="!Exists('..\packages\cef.redist.x86.3.3396.1786\build\cef.redist.x86.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x86.3.3396.1786\build\cef.redist.x86.props'))" />
<Error Condition="!Exists('..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.props'))" />
<Error Condition="!Exists('..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.targets'))" />
<Error Condition="!Exists('..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.props'))" />
<Error Condition="!Exists('..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.targets'))" />
<Error Condition="!Exists('..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.props'))" />
<Error Condition="!Exists('..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.targets'))" />
<Error Condition="!Exists('..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.props'))" />
<Error Condition="!Exists('..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.targets'))" />
</Target>
<Import Project="..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.targets" Condition="Exists('..\packages\CefSharp.Common.67.0.0-pre01\build\CefSharp.Common.targets')" />
<Import Project="..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.targets" Condition="Exists('..\packages\CefSharp.Wpf.67.0.0-pre01\build\CefSharp.Wpf.targets')" />
<Import Project="..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.targets" Condition="Exists('..\packages\CefSharp.Common.67.0.0\build\CefSharp.Common.targets')" />
<Import Project="..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.targets" Condition="Exists('..\packages\CefSharp.Wpf.67.0.0\build\CefSharp.Wpf.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
Expand Down
39 changes: 39 additions & 0 deletions source/Grabacr07.KanColleViewer/Models/Cef/CefBridge.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using CefSharp;
using CefSharp.Wpf;
Expand All @@ -10,8 +11,46 @@ namespace Grabacr07.KanColleViewer.Models.Cef
{
public static class CefBridge
{
private static readonly string asesmblyDirectory = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);
private static readonly string cefDirectory = Path.Combine(asesmblyDirectory, Environment.Is64BitProcess ? "x64" : "x86");
private static bool initialized;

public static string CachePath => Path.Combine(Application.Instance.LocalAppData.FullName, "Chromium");

public static void Initialize()
{
if (initialized) return;

CefSharpSettings.SubprocessExitIfParentProcessClosed = true;

var cefSettings = new CefSettings()
{
BrowserSubprocessPath = Path.Combine(cefDirectory, "CefSharp.BrowserSubprocess.exe"),
CachePath = CefBridge.CachePath,
};
cefSettings.CefCommandLineArgs.Add("proxy-server", Settings.NetworkSettings.LocalProxySettingsString);

CefSharpSettings.SubprocessExitIfParentProcessClosed = true;
CefSharp.Cef.Initialize(cefSettings);

initialized = true;
}

public static Assembly ResolveCefSharpAssembly(object sender, ResolveEventArgs args)
{
if (args.Name.StartsWith("CefSharp"))
{
var assemblyName = args.Name.Split(new[] { ',' }, 2).FirstOrDefault() + ".dll";
var archSpecificPath = Path.Combine(cefDirectory, assemblyName);

return File.Exists(archSpecificPath)
? Assembly.LoadFile(archSpecificPath)
: null;
}

return null;
}

public static bool TryGetKanColleCanvas(this ChromiumWebBrowser webBrowser, out IFrame canvas)
{
var browser = webBrowser.GetBrowser();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,25 +92,26 @@ public static string LocalProxySettingsString
{
get
{
var port = LocalProxy.IsEnabled ? LocalProxy.Port.Value : LocalProxy.Port.Default;
switch (Proxy.Type.Value)
{
case ProxyType.SystemProxy:
{
var proxyConfig = new Win32.WinHttpCurrentUserIEProxyConfig();
Win32.WinHttp.WinHttpGetIEProxyConfigForCurrentUser(ref proxyConfig);
var settings = IEStyleProxySettingsBuilder.Parse(proxyConfig.Proxy);
return settings.ToIEStyleSettings("127.0.0.1", LocalProxy.Port.Value);
return settings.ToIEStyleSettings("127.0.0.1", port);
}

case ProxyType.SpecificProxy:
//指定プロキシの場合、HTTPだけNekoxyを通し、後は指定プロキシに流す
{
var settings = IEStyleProxySettingsBuilder.Parse(new Proxy());
return settings.ToIEStyleSettings("127.0.0.1", LocalProxy.Port.Value);
return settings.ToIEStyleSettings("127.0.0.1", port);
}
case ProxyType.DirectAccess:
//プロキシを使用しない場合、HTTPだけNekoxyを通し、後は直アクセス
return $"http=127.0.0.1:{LocalProxy.Port.Value}";
return $"http=127.0.0.1:{port}";
default:
throw new IndexOutOfRangeException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ namespace Grabacr07.KanColleViewer.Views.Behaviors
/// </summary>
internal class ScreenshotAction : InteractionMessageAction<ChromiumWebBrowser>
{
private IFrame targetCanvas;

protected override async void InvokeAction(InteractionMessage message)
{
if (message is ScreenshotMessage screenshotMessage)
Expand All @@ -43,7 +41,7 @@ private Task TakeScreenshot(string path, SupportedImageFormat format)
{
var source = new TaskCompletionSource<Unit>();

if (this.targetCanvas == null && !this.AssociatedObject.TryGetKanColleCanvas(out this.targetCanvas))
if (!this.AssociatedObject.TryGetKanColleCanvas(out var targetCanvas))
{
source.SetException(new Exception("艦これの Canvas 要素が見つかりません。"));
return source.Task;
Expand All @@ -64,7 +62,7 @@ private Task TakeScreenshot(string path, SupportedImageFormat format)
}})();
";
this.AssociatedObject.JavascriptObjectRepository.Register(request.Id, request, true);
this.targetCanvas.ExecuteJavaScriptAsync(script);
targetCanvas.ExecuteJavaScriptAsync(script);

return source.Task;
}
Expand Down
72 changes: 70 additions & 2 deletions source/Grabacr07.KanColleViewer/Views/Controls/KanColleHost.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Markup;
using CefSharp;
using CefSharp.Wpf;
using CefSharp.Wpf.Internals;
using Grabacr07.KanColleViewer.Models;
using Grabacr07.KanColleViewer.Models.Cef;

Expand All @@ -28,6 +31,7 @@ static KanColleHost()

private ScrollViewer scrollViewer;
private bool styleSheetApplied;
private bool focusInInputbox;

#region WebBrowser 依存関係プロパティ

Expand All @@ -54,6 +58,7 @@ private static void WebBrowserPropertyChangedCallback(DependencyObject d, Depend
{
newBrowser.FrameLoadEnd += instance.HandleLoadEnd;
newBrowser.MenuHandler = new ContextMenuHandler();
newBrowser.WpfKeyboardHandler = new InhibitTabKeyHandler(newBrowser);
}
if (instance.scrollViewer != null)
{
Expand Down Expand Up @@ -191,12 +196,15 @@ private void ApplyStyleSheet()
{
try
{
if (this.WebBrowser.TryGetKanColleCanvas(out _))
if (this.WebBrowser.TryGetKanColleCanvas(out var canvas))
{
var js = $"var style = document.createElement(\"style\"); style.innerHTML = \"{this.UserStyleSheet.Replace("\r\n", " ")}\"; document.body.appendChild(style);";
var js = $"var style = document.createElement(\"style\"); style.innerHTML = \"{Regex.Replace(this.UserStyleSheet, "\r|\n", " ")}\"; document.body.appendChild(style);";
this.WebBrowser.GetMainFrame().ExecuteJavaScriptAsync(js);
canvas.ExecuteJavaScriptAsync(js);

this.styleSheetApplied = true;

this.RegisterInputFocusHandler(canvas);
}
}
catch (Exception) when (Application.Instance.State == ApplicationState.Startup)
Expand All @@ -209,5 +217,65 @@ private void ApplyStyleSheet()
Application.TelemetryClient.TrackException(ex);
}
}


private void RegisterInputFocusHandler(IFrame frame)
{
var handler = new InputboxFocusHandler();
var script = $@"
(async function()
{{
await CefSharp.BindObjectAsync('{handler.Id}');
var input = document.getElementById('r_editbox');
input.onfocus = function() {{ {handler.Id}.setInputFocus(true); }};
input.onblur = function() {{ {handler.Id}.setInputFocus(false); }};
}})();
";
handler.FocusChanged += hasFocus =>
{
this.focusInInputbox = hasFocus;
System.Diagnostics.Debug.WriteLine($"focusInInputbox: {hasFocus}");
};

this.WebBrowser.JavascriptObjectRepository.Register(handler.Id, handler, true);
frame.ExecuteJavaScriptAsync(script);
}
}

public class InputboxFocusHandler
{
public event Action<bool> FocusChanged;

public string Id { get; }

public InputboxFocusHandler()
{
this.Id = $"focusHandler{DateTimeOffset.Now.Ticks}";
}

public void SetInputFocus(bool hasFocus)
{
this.FocusChanged?.Invoke(hasFocus);
}
}

public class InhibitTabKeyHandler : WpfKeyboardHandler
{
public InhibitTabKeyHandler(ChromiumWebBrowser owner)
: base(owner)
{
}

public override void HandleKeyPress(KeyEventArgs e)
{
if (e.Key == Key.Tab)
{
e.Handled = true;
return;
}

base.HandleKeyPress(e);
}
}
}
4 changes: 2 additions & 2 deletions source/Grabacr07.KanColleViewer/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
<packages>
<package id="cef.redist.x64" version="3.3396.1786" targetFramework="net46" />
<package id="cef.redist.x86" version="3.3396.1786" targetFramework="net46" />
<package id="CefSharp.Common" version="67.0.0-pre01" targetFramework="net46" />
<package id="CefSharp.Wpf" version="67.0.0-pre01" targetFramework="net46" />
<package id="CefSharp.Common" version="67.0.0" targetFramework="net46" />
<package id="CefSharp.Wpf" version="67.0.0" targetFramework="net46" />
<package id="LivetCask" version="1.3.1.0" targetFramework="net45" />
<package id="LivetExtensions" version="1.1.0.0" targetFramework="net45" />
<package id="log4net" version="2.0.3" targetFramework="net45" />
Expand Down
Loading

0 comments on commit d166cf5

Please sign in to comment.