Skip to content

Commit b412e16

Browse files
committed
WIP (42)
1 parent b5f6126 commit b412e16

File tree

3 files changed

+93
-23
lines changed

3 files changed

+93
-23
lines changed

src/WinWebDiffLib/WebDiffWindow.hpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class CWebDiffWindow : public IWebDiffWindow
8686
std::wstring userDataFolder = GetUserDataFolderPath(i);
8787
ComPtr<IWebDiffCallback> callback2(callback);
8888
hr = m_webWindow[i].Create(m_hInstance, m_hWnd, urls[i], userDataFolder.c_str(),
89-
m_size, m_fitToWindow, m_zoom,
89+
m_size, m_fitToWindow, m_zoom, m_userAgent,
9090
Callback<IWebDiffCallback>([this, counter, callback2](const WebDiffCallbackResult& result) -> HRESULT
9191
{
9292
*counter = *counter - 1;
@@ -146,7 +146,7 @@ class CWebDiffWindow : public IWebDiffWindow
146146
{
147147
if (pane < 0 || pane >= m_nPanes || !m_hWnd)
148148
return;
149-
m_webWindow[pane].NewTab(url, 1.0, callback);
149+
m_webWindow[pane].NewTab(url, m_zoom, m_userAgent, callback);
150150
}
151151

152152
void CloseActiveTab(int pane) override
@@ -527,6 +527,20 @@ class CWebDiffWindow : public IWebDiffWindow
527527
m_webWindow[pane].SetZoom(m_zoom);
528528
}
529529

530+
const wchar_t *GetUserAgent() const
531+
{
532+
if (m_nPanes == 0)
533+
return L"";
534+
return m_userAgent.c_str();
535+
}
536+
537+
void SetUserAgent(const wchar_t* userAgent)
538+
{
539+
m_userAgent = userAgent;
540+
for (int pane = 0; pane < m_nPanes; ++pane)
541+
m_webWindow[pane].SetUserAgent(m_userAgent);
542+
}
543+
530544
bool GetFitToWindow() const
531545
{
532546
return m_fitToWindow;
@@ -997,6 +1011,7 @@ class CWebDiffWindow : public IWebDiffWindow
9971011
SIZE m_size{ 1024, 600 };
9981012
bool m_fitToWindow = true;
9991013
double m_zoom = 1.0;
1014+
std::wstring m_userAgent = L"";
10001015
UserDataFolderType m_userDataFolderType = UserDataFolderType::APPDATA;
10011016
bool m_bUserDataFolderPerPane = true;
10021017
std::vector<ComPtr<IWebDiffEventHandler>> m_listeners;

src/WinWebDiffLib/WebWindow.hpp

Lines changed: 74 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,24 @@ class CWebWindow
4040
{
4141
friend CWebWindow;
4242
public:
43-
CWebTab(CWebWindow* parent, const wchar_t* url, double zoom, IWebDiffCallback* callback)
43+
CWebTab(CWebWindow* parent, const wchar_t* url, double zoom, const std::wstring& userAgent, IWebDiffCallback* callback)
4444
: m_parent(parent)
4545
{
46-
InitializeWebView(url, zoom, nullptr, nullptr, callback);
46+
InitializeWebView(url, zoom, userAgent, nullptr, nullptr, callback);
4747
}
4848

49-
CWebTab(CWebWindow* parent, double zoom, ICoreWebView2NewWindowRequestedEventArgs* args = nullptr, ICoreWebView2Deferral* deferral = nullptr, IWebDiffCallback* callback = nullptr)
49+
CWebTab(CWebWindow* parent, double zoom, const std::wstring& userAgent, ICoreWebView2NewWindowRequestedEventArgs* args = nullptr, ICoreWebView2Deferral* deferral = nullptr, IWebDiffCallback* callback = nullptr)
5050
: m_parent(parent)
5151
{
52-
InitializeWebView(nullptr, zoom, args, deferral, callback);
52+
InitializeWebView(nullptr, zoom, userAgent, args, deferral, callback);
5353
}
5454

55-
bool InitializeWebView(const wchar_t* url, double zoom, ICoreWebView2NewWindowRequestedEventArgs* args, ICoreWebView2Deferral* deferral, IWebDiffCallback* callback)
55+
bool InitializeWebView(const wchar_t* url, double zoom, const std::wstring& userAgent, ICoreWebView2NewWindowRequestedEventArgs* args, ICoreWebView2Deferral* deferral, IWebDiffCallback* callback)
5656
{
5757
std::shared_ptr<std::wstring> url2(url ? new std::wstring(url) : nullptr);
5858
ComPtr<IWebDiffCallback> callback2(callback);
5959
HRESULT hr = m_parent->m_webviewEnvironment->CreateCoreWebView2Controller(m_parent->m_hWebViewParent, Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>(
60-
[this, url2, zoom, args, deferral, callback2](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT {
60+
[this, url2, zoom, userAgent, args, deferral, callback2](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT {
6161
if (controller != nullptr) {
6262
m_webviewController = controller;
6363
m_webviewController->get_CoreWebView2(&m_webview);
@@ -69,7 +69,7 @@ class CWebWindow
6969
callback2->Invoke({ result, nullptr });
7070
return result;
7171
}
72-
72+
7373
m_webviewController->put_ZoomFactor(zoom);
7474

7575
m_webviewController->add_AcceleratorKeyPressed(
@@ -85,11 +85,15 @@ class CWebWindow
8585
return m_parent->OnZoomFactorChanged(sender, args);
8686
}).Get(), nullptr);
8787

88-
ICoreWebView2Settings* Settings;
89-
m_webview->get_Settings(&Settings);
90-
Settings->put_IsScriptEnabled(TRUE);
91-
Settings->put_AreDefaultScriptDialogsEnabled(TRUE);
92-
Settings->put_IsWebMessageEnabled(TRUE);
88+
wil::com_ptr_t<ICoreWebView2Settings> settings;
89+
m_webview->get_Settings(&settings);
90+
settings->put_IsScriptEnabled(TRUE);
91+
settings->put_AreDefaultScriptDialogsEnabled(TRUE);
92+
settings->put_IsWebMessageEnabled(TRUE);
93+
settings->put_AreDevToolsEnabled(TRUE);
94+
auto settings2 = settings.try_query<ICoreWebView2Settings2>();
95+
if (settings2)
96+
settings2->put_UserAgent(userAgent.c_str());
9397

9498
m_webview->add_NewWindowRequested(
9599
Callback<ICoreWebView2NewWindowRequestedEventHandler>(
@@ -136,6 +140,20 @@ class CWebWindow
136140
}).Get(), nullptr);
137141

138142
m_webview->CallDevToolsProtocolMethod(L"Page.enable", L"{}", nullptr);
143+
m_webview->CallDevToolsProtocolMethod(L"Network.enable", L"{}", nullptr);
144+
m_webview->CallDevToolsProtocolMethod(L"Log.enable", L"{}", nullptr);
145+
146+
wil::com_ptr<ICoreWebView2DevToolsProtocolEventReceiver> receiver;
147+
for (const auto* event : { L"Network.requestWillBeSent", L"Network.responseReceived", L"Log.entryAdded"})
148+
{
149+
std::wstring event2 = event;
150+
m_webview->GetDevToolsProtocolEventReceiver(event, &receiver);
151+
receiver->add_DevToolsProtocolEventReceived(
152+
Callback<ICoreWebView2DevToolsProtocolEventReceivedEventHandler>(
153+
[this, event2](ICoreWebView2* sender, ICoreWebView2DevToolsProtocolEventReceivedEventArgs* args) -> HRESULT {
154+
return m_parent->OnDevToolsProtocolEventReceived(sender, args, event2);
155+
}).Get(), nullptr);
156+
}
139157

140158
if (args && deferral)
141159
{
@@ -181,7 +199,7 @@ class CWebWindow
181199
}
182200

183201
HRESULT Create(HINSTANCE hInstance, HWND hWndParent, const wchar_t* url, const wchar_t* userDataFolder,
184-
const SIZE& size, bool fitToWindow, double zoom,
202+
const SIZE& size, bool fitToWindow, double zoom, std::wstring& userAgent,
185203
IWebDiffCallback* callback, std::function<void (WebDiffEvent::EVENT_TYPE)> eventHandler)
186204
{
187205
m_fitToWindow = fitToWindow;
@@ -236,7 +254,7 @@ class CWebWindow
236254
SendMessage(m_hEdit, WM_SETFONT, (WPARAM)m_hEditFont, 0);
237255
SendMessage(m_hToolbar, TB_ADDBUTTONS, (WPARAM)std::size(tbb), (LPARAM)&tbb);
238256
SendMessage(m_hToolbar, WM_SETFONT, (WPARAM)m_hToolbarFont, 0);
239-
return InitializeWebView(url, zoom, userDataFolder, callback);
257+
return InitializeWebView(url, zoom, userAgent, userDataFolder, callback);
240258
}
241259

242260
bool Destroy()
@@ -264,9 +282,9 @@ class CWebWindow
264282
return true;
265283
}
266284

267-
void NewTab(const wchar_t* url, double zoom, IWebDiffCallback* callback)
285+
void NewTab(const wchar_t* url, double zoom, const std::wstring& userAgent, IWebDiffCallback* callback)
268286
{
269-
m_tabs.emplace_back(new CWebTab(this, url, zoom, callback));
287+
m_tabs.emplace_back(new CWebTab(this, url, zoom, userAgent, callback));
270288

271289
TCITEM tcItem{};
272290
tcItem.mask = TCIF_TEXT;
@@ -381,6 +399,30 @@ class CWebWindow
381399
pWebViewController->put_ZoomFactor(std::clamp(zoom, 0.25, 5.0));
382400
}
383401

402+
std::wstring GetUserAgent() const
403+
{
404+
if (m_activeTab < 0)
405+
return L"";
406+
wil::com_ptr_t<ICoreWebView2Settings> settings;
407+
wil::unique_cotaskmem_string userAgent;
408+
GetActiveWebView()->get_Settings(&settings);
409+
auto settings2 = settings.try_query<ICoreWebView2Settings2>();
410+
if (settings2)
411+
settings2->get_UserAgent(&userAgent);
412+
return userAgent.get();
413+
}
414+
415+
void SetUserAgent(const std::wstring& userAgent)
416+
{
417+
if (m_activeTab < 0)
418+
return;
419+
wil::com_ptr_t<ICoreWebView2Settings> settings;
420+
GetActiveWebView()->get_Settings(&settings);
421+
auto settings2 = settings.try_query<ICoreWebView2Settings2>();
422+
if (settings2)
423+
settings2->put_UserAgent(userAgent.c_str());
424+
}
425+
384426
bool IsFocused() const
385427
{
386428
HWND hwndCurrent = GetFocus();
@@ -766,14 +808,14 @@ class CWebWindow
766808

767809
private:
768810

769-
HRESULT InitializeWebView(const wchar_t *url, double zoom, const wchar_t *userDataFolder, IWebDiffCallback* callback)
811+
HRESULT InitializeWebView(const wchar_t* url, double zoom, const std::wstring& userAgent, const wchar_t* userDataFolder, IWebDiffCallback* callback)
770812
{
771813
std::shared_ptr<std::wstring> url2(new std::wstring(url));
772814
HRESULT hr = CreateCoreWebView2EnvironmentWithOptions(nullptr, userDataFolder, nullptr,
773815
Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(
774-
[this, url2, zoom, callback](HRESULT result, ICoreWebView2Environment* env) -> HRESULT {
816+
[this, url2, zoom, userAgent, callback](HRESULT result, ICoreWebView2Environment* env) -> HRESULT {
775817
m_webviewEnvironment = env;
776-
m_tabs.emplace_back(new CWebTab(this, url2->c_str(), zoom, callback));
818+
m_tabs.emplace_back(new CWebTab(this, url2->c_str(), zoom, userAgent, callback));
777819

778820
TCITEM tcItem{};
779821
tcItem.mask = TCIF_TEXT;
@@ -1019,7 +1061,7 @@ class CWebWindow
10191061
}
10201062
wil::unique_file fp;
10211063
std::filesystem::path path(dirname);
1022-
path /= L"error.log";
1064+
path /= L"[Error].log";
10231065
_wfopen_s(&fp, path.c_str(), L"at,ccs=UTF-8");
10241066
fwprintf(fp.get(), L"url=%s hr=%08x: %s", url.c_str(), hr, msg.c_str());
10251067
}
@@ -1098,6 +1140,10 @@ class CWebWindow
10981140
PostMessage(m_hWnd, WM_KEYDOWN, virtualKey, lParam);
10991141
handled = true;
11001142
}
1143+
else if (virtualKey == VK_F12)
1144+
{
1145+
GetActiveWebView()->OpenDevToolsWindow();
1146+
}
11011147
else if (vkmenu && virtualKey == 'D')
11021148
{
11031149
::SendMessage(m_hEdit, EM_SETSEL, 0, -1);
@@ -1134,7 +1180,7 @@ class CWebWindow
11341180
GetActiveWebViewController()->put_IsVisible(false);
11351181
ICoreWebView2Deferral* deferral;
11361182
args->GetDeferral(&deferral);
1137-
CWebTab* pWebTab{ new CWebTab(this, 1.0, args, deferral) };
1183+
CWebTab* pWebTab{ new CWebTab(this, GetZoom(), GetUserAgent(), args, deferral)};
11381184
m_tabs.emplace_back(pWebTab);
11391185
TCITEM tcItem{};
11401186
tcItem.mask = TCIF_TEXT;
@@ -1201,6 +1247,13 @@ class CWebWindow
12011247
return S_OK;
12021248
}
12031249

1250+
HRESULT OnDevToolsProtocolEventReceived(ICoreWebView2* sender, ICoreWebView2DevToolsProtocolEventReceivedEventArgs* args, const std::wstring& event)
1251+
{
1252+
wil::unique_cotaskmem_string parameterObjectAsJson;
1253+
args->get_ParameterObjectAsJson(&parameterObjectAsJson);
1254+
return S_OK;
1255+
}
1256+
12041257
void OnHScroll(UINT nSBCode, UINT nPos)
12051258
{
12061259
SCROLLINFO si{ sizeof SCROLLINFO, SIF_POS | SIF_RANGE | SIF_PAGE | SIF_TRACKPOS };

src/WinWebDiffLib/WinWebDiffLib.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ struct IWebDiffWindow
8484
virtual void SetDiffColorAlpha(double diffColorAlpha) = 0;
8585
virtual double GetZoom() const = 0;
8686
virtual void SetZoom(double zoom) = 0;
87+
virtual const wchar_t* GetUserAgent() const = 0;
88+
virtual void SetUserAgent(const wchar_t* userAgent) = 0;
8789
virtual bool GetFitToWindow() const = 0;
8890
virtual void SetFitToWindow(bool fitToWindow) = 0;
8991
virtual SIZE GetSize() const = 0;

0 commit comments

Comments
 (0)