feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization

This commit is contained in:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -0,0 +1,69 @@
using System;
using System.IO;
using System.Linq;
using System.Windows.Controls;
using Paca.App;
using Paca.Browser;
using Paca.Browser.Tabs;
using Paca.Server;
using Paca.Server.Gateway;
using Paca.Tests.Infrastructure;
using Xunit;
namespace Paca.Tests.Browser;
public class ChromeParityMilestone11Tests
{
[Fact]
public void ServerOptions_TabOpener_속성이_존재하고_호출가능하다()
{
string? opened = null;
var options = new ServerOptions
{
TabOpener = url => opened = url
};
options.TabOpener?.Invoke("https://test.com/from-mobile");
Assert.Equal("https://test.com/from-mobile", opened);
}
[Fact]
public void GatewayEventType_TabSharedFromDesktop_이벤트_타입이_정의되어_있다()
{
Assert.True(Enum.IsDefined(typeof(GatewayEventType), "TabSharedFromDesktop"));
}
[Fact]
public void BuildTabContextMenu_기기로_전송_메뉴항목_포함()
{
using var sta = StaDispatcher.Start();
WpfTestApp.Ensure(sta.Dispatcher);
sta.Invoke(() =>
{
var dataDir = Path.Combine(Path.GetTempPath(), $"vd_tab_handoff_{Guid.NewGuid():N}");
Environment.SetEnvironmentVariable("VD_DATA_DIR", dataDir);
try
{
var win = new MainWindow();
win.TabsManager.Tabs.Clear();
var t1 = win.TabsManager.NewTab("https://site1.com");
var menu = win.BuildTabContextMenu(t1);
var items = menu.Items.OfType<MenuItem>().Select(m => m.Header?.ToString()).ToList();
Assert.Contains("기기로 전송", items);
}
finally
{
try { if (Directory.Exists(dataDir)) Directory.Delete(dataDir, true); } catch { }
}
});
}
[Fact]
public void WebCompanion_PC_탭열기_엔드포인트_연동스크립트_포함()
{
var html = WebCompanion.Html;
Assert.Contains("/api/tabs/open", html);
}
}