@@ -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
767809private:
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 (¶meterObjectAsJson);
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 };
0 commit comments