Skip to content

Commit

Permalink
Updates for Win32, WPF, WinForms, UWP and WinUI3 sample apps from 120…
Browse files Browse the repository at this point in the history
….0.2210.55
  • Loading branch information
WebView2GithubBot committed Dec 4, 2023
1 parent 85e53c9 commit 639dbe1
Show file tree
Hide file tree
Showing 12 changed files with 250 additions and 37 deletions.
6 changes: 6 additions & 0 deletions SampleApps/WebView2APISample/AppWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include "ScenarioExtensionsManagement.h"
#include "ScenarioIFrameDevicePermission.h"
#include "ScenarioNavigateWithWebResourceRequest.h"
#include "ScenarioAcceleratorKeyPressed.h"
#include "ScenarioNotificationReceived.h"
#include "ScenarioPermissionManagement.h"
#include "ScenarioSharedBuffer.h"
Expand Down Expand Up @@ -651,6 +652,11 @@ bool AppWindow::ExecuteWebViewCommands(WPARAM wParam, LPARAM lParam)
{
return PrintToPdfStream();
}
case IDM_SCENARIO_ACCELERATOR_KEY_PRESSED:
{
NewComponent<ScenarioAcceleratorKeyPressed>(this);
return true;
}
}
return false;
}
Expand Down
48 changes: 23 additions & 25 deletions SampleApps/WebView2APISample/ProcessComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,26 +244,26 @@ void ProcessComponent::AppendFrameInfo(
CHECK_FAILURE(frameInfo->get_Source(&sourceRaw));
std::wstring source = sourceRaw.get()[0] ? sourceRaw.get() : L"none";

wil::com_ptr<ICoreWebView2ExperimentalFrameInfo> frameInfoExperimental;
CHECK_FAILURE(frameInfo->QueryInterface(IID_PPV_ARGS(&frameInfoExperimental)));
frameInfoExperimental->get_FrameId(&frameId);
frameInfoExperimental->get_FrameKind(&frameKind);
wil::com_ptr<ICoreWebView2FrameInfo2> frameInfo2;
CHECK_FAILURE(frameInfo->QueryInterface(IID_PPV_ARGS(&frameInfo2)));
frameInfo2->get_FrameId(&frameId);
frameInfo2->get_FrameKind(&frameKind);

wil::com_ptr<ICoreWebView2FrameInfo> parentFrameInfo;
CHECK_FAILURE(frameInfoExperimental->get_ParentFrameInfo(&parentFrameInfo));
CHECK_FAILURE(frameInfo2->get_ParentFrameInfo(&parentFrameInfo));
if (parentFrameInfo)
{
CHECK_FAILURE(parentFrameInfo->QueryInterface(IID_PPV_ARGS(&frameInfoExperimental)));
CHECK_FAILURE(frameInfoExperimental->get_FrameId(&parentFrameId));
CHECK_FAILURE(parentFrameInfo->QueryInterface(IID_PPV_ARGS(&frameInfo2)));
CHECK_FAILURE(frameInfo2->get_FrameId(&parentFrameId));
}

wil::com_ptr<ICoreWebView2FrameInfo> mainFrameInfo = GetAncestorMainFrameInfo(frameInfo);
if (mainFrameInfo == frameInfo)
{
type = L"main frame";
}
CHECK_FAILURE(mainFrameInfo->QueryInterface(IID_PPV_ARGS(&frameInfoExperimental)));
CHECK_FAILURE(frameInfoExperimental->get_FrameId(&mainFrameId));
CHECK_FAILURE(mainFrameInfo->QueryInterface(IID_PPV_ARGS(&frameInfo2)));
CHECK_FAILURE(frameInfo2->get_FrameId(&mainFrameId));

wil::com_ptr<ICoreWebView2FrameInfo> childFrameInfo =
GetAncestorMainFrameDirectChildFrameInfo(frameInfo);
Expand All @@ -273,8 +273,8 @@ void ProcessComponent::AppendFrameInfo(
}
if (childFrameInfo)
{
CHECK_FAILURE(childFrameInfo->QueryInterface(IID_PPV_ARGS(&frameInfoExperimental)));
CHECK_FAILURE(frameInfoExperimental->get_FrameId(&childFrameId));
CHECK_FAILURE(childFrameInfo->QueryInterface(IID_PPV_ARGS(&frameInfo2)));
CHECK_FAILURE(frameInfo2->get_FrameId(&childFrameId));
}

result << L"{frame name:" << name << L" | frame Id:" << frameId << L" | parent frame Id:"
Expand All @@ -293,12 +293,12 @@ wil::com_ptr<ICoreWebView2FrameInfo> ProcessComponent::GetAncestorMainFrameInfo(
wil::com_ptr<ICoreWebView2FrameInfo> frameInfo)
{
wil::com_ptr<ICoreWebView2FrameInfo> mainFrameInfo;
wil::com_ptr<ICoreWebView2ExperimentalFrameInfo> frameInfoExperimental;
wil::com_ptr<ICoreWebView2FrameInfo2> frameInfo2;
while (frameInfo)
{
mainFrameInfo = frameInfo;
CHECK_FAILURE(frameInfo->QueryInterface(IID_PPV_ARGS(&frameInfoExperimental)));
CHECK_FAILURE(frameInfoExperimental->get_ParentFrameInfo(&frameInfo));
CHECK_FAILURE(frameInfo->QueryInterface(IID_PPV_ARGS(&frameInfo2)));
CHECK_FAILURE(frameInfo2->get_ParentFrameInfo(&frameInfo));
}
return mainFrameInfo;
}
Expand All @@ -320,30 +320,28 @@ wil::com_ptr<ICoreWebView2FrameInfo> ProcessComponent::GetAncestorMainFrameDirec
{
wil::com_ptr<ICoreWebView2FrameInfo> mainFrameInfo;
wil::com_ptr<ICoreWebView2FrameInfo> childFrameInfo;
wil::com_ptr<ICoreWebView2ExperimentalFrameInfo> frameInfoExperimental;
wil::com_ptr<ICoreWebView2FrameInfo2> frameInfo2;
while (frameInfo)
{
childFrameInfo = mainFrameInfo;
mainFrameInfo = frameInfo;
CHECK_FAILURE(frameInfo->QueryInterface(IID_PPV_ARGS(&frameInfoExperimental)));
CHECK_FAILURE(frameInfoExperimental->get_ParentFrameInfo(&frameInfo));
CHECK_FAILURE(frameInfo->QueryInterface(IID_PPV_ARGS(&frameInfo2)));
CHECK_FAILURE(frameInfo2->get_ParentFrameInfo(&frameInfo));
}
return childFrameInfo;
}

void ProcessComponent::ShowProcessExtendedInfo()
{
auto environmentExperimental13 =
m_webViewEnvironment.try_query<ICoreWebView2ExperimentalEnvironment13>();
if (environmentExperimental13)
auto environment13 = m_webViewEnvironment.try_query<ICoreWebView2Environment13>();
if (environment13)
{
//! [GetProcessExtendedInfos]
CHECK_FAILURE(environmentExperimental13->GetProcessExtendedInfos(
Callback<ICoreWebView2ExperimentalGetProcessExtendedInfosCompletedHandler>(
CHECK_FAILURE(environment13->GetProcessExtendedInfos(
Callback<ICoreWebView2GetProcessExtendedInfosCompletedHandler>(
[this](
HRESULT error,
ICoreWebView2ExperimentalProcessExtendedInfoCollection* processCollection)
-> HRESULT
ICoreWebView2ProcessExtendedInfoCollection* processCollection) -> HRESULT
{
UINT32 processCount = 0;
UINT32 rendererProcessCount = 0;
Expand All @@ -352,7 +350,7 @@ void ProcessComponent::ShowProcessExtendedInfo()
std::wstringstream rendererProcessInfos;
for (UINT32 i = 0; i < processCount; i++)
{
Microsoft::WRL::ComPtr<ICoreWebView2ExperimentalProcessExtendedInfo>
Microsoft::WRL::ComPtr<ICoreWebView2ProcessExtendedInfo>
processExtendedInfo;
CHECK_FAILURE(
processCollection->GetValueAtIndex(i, &processExtendedInfo));
Expand Down
145 changes: 145 additions & 0 deletions SampleApps/WebView2APISample/ScenarioAcceleratorKeyPressed.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
// Copyright (C) Microsoft Corporation. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "stdafx.h"

#include "ScenarioAcceleratorKeyPressed.h"

#include "AppWindow.h"
#include "CheckFailure.h"

using namespace Microsoft::WRL;

static constexpr WCHAR c_samplePath[] = L"ScenarioAcceleratorKeyPressed.html";
ScenarioAcceleratorKeyPressed::ScenarioAcceleratorKeyPressed(AppWindow* appWindow)
: m_appWindow(appWindow), m_controller(appWindow->GetWebViewController()),
m_webView(appWindow->GetWebView())
{
m_sampleUri = m_appWindow->GetLocalUri(c_samplePath);
wil::com_ptr<ICoreWebView2Settings> settings;
CHECK_FAILURE(m_webView->get_Settings(&settings));
m_settings3 = settings.try_query<ICoreWebView2Settings3>();
// Setup the web message received event handler before navigating to
// ensure we don't miss any messages.
CHECK_FAILURE(m_webView->add_WebMessageReceived(
Microsoft::WRL::Callback<ICoreWebView2WebMessageReceivedEventHandler>(
[this](ICoreWebView2* sender, ICoreWebView2WebMessageReceivedEventArgs* args)
{
wil::unique_cotaskmem_string uri;
CHECK_FAILURE(args->get_Source(&uri));

// Always validate that the origin of the message is what you expect.
if (uri.get() != m_sampleUri)
{
return S_OK;
}
wil::unique_cotaskmem_string messageRaw;
CHECK_FAILURE(args->TryGetWebMessageAsString(&messageRaw));
std::wstring message = messageRaw.get();
std::wstring reply;

if (message.compare(0, 26, L"DisableBrowserAccelerators") == 0)
{
CHECK_FAILURE(m_settings3->put_AreBrowserAcceleratorKeysEnabled(FALSE));
MessageBox(
nullptr,
L"Browser-specific accelerator keys, for example: \n"
L"Ctrl+F and F3 for Find on Page\n"
L"Ctrl+P for Print\n"
L"Ctrl+R and F5 for Reload\n"
L"Ctrl+Plus and Ctrl+Minus for zooming\n"
L"Ctrl+Shift-C and F12 for DevTools\n"
L"Special keys for browser functions, such as Back, Forward, and "
L"Search \n"
L"will be disabled after the next navigation except for F7.",
L"Settings change", MB_OK);
}
else if (message.compare(0, 25, L"EnableBrowserAccelerators") == 0)
{
CHECK_FAILURE(m_settings3->put_AreBrowserAcceleratorKeysEnabled(TRUE));
MessageBox(
nullptr,
L"Browser-specific accelerator keys, for example: \n"
L"Ctrl+F and F3 for Find on Page\n"
L"Ctrl+R and F5 for Reload\n"
L"Ctrl+Plus and Ctrl+Minus for zooming\n"
L"Ctrl+Shift-C and F12 for DevTools\n"
L"Special keys for browser functions, such as Back, Forward, and "
L"Search \n"
L"will be enabled after the next navigation except for Ctr + P.",
L"Settings change", MB_OK);
}
return S_OK;
})
.Get(),
&m_webMessageReceivedToken));

//! [IsBrowserAcceleratorKeyEnabled]
if (m_settings3)
{
// Register a handler for the AcceleratorKeyPressed event.
CHECK_FAILURE(m_controller->add_AcceleratorKeyPressed(
Callback<ICoreWebView2AcceleratorKeyPressedEventHandler>(
[this](
ICoreWebView2Controller* sender,
ICoreWebView2AcceleratorKeyPressedEventArgs* args) -> HRESULT
{
COREWEBVIEW2_KEY_EVENT_KIND kind;
CHECK_FAILURE(args->get_KeyEventKind(&kind));
// We only care about key down events.
if (kind == COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN ||
kind == COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN)
{
UINT key;
CHECK_FAILURE(args->get_VirtualKey(&key));

wil::com_ptr<ICoreWebView2AcceleratorKeyPressedEventArgs2> args2;

args->QueryInterface(IID_PPV_ARGS(&args2));
if (args2)
{
if (key == 'P' && (GetKeyState(VK_CONTROL) < 0))
{
// tell the browser to skip the key
CHECK_FAILURE(args2->put_IsBrowserAcceleratorKeyEnabled(FALSE));
}
if (key == VK_F7)
{
// tell the browser to process the key
CHECK_FAILURE(args2->put_IsBrowserAcceleratorKeyEnabled(TRUE));
}
}
}
return S_OK;
})
.Get(),
&m_acceleratorKeyPressedToken));
}
//! [IsBrowserAcceleratorKeyEnabled]

// Turn off this scenario if we navigate away from the sample page
CHECK_FAILURE(m_webView->add_ContentLoading(
Callback<ICoreWebView2ContentLoadingEventHandler>(
[this](ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args) -> HRESULT
{
wil::unique_cotaskmem_string uri;
sender->get_Source(&uri);
if (uri.get() != m_sampleUri)
{
m_appWindow->DeleteComponent(this);
}
return S_OK;
})
.Get(),
&m_contentLoadingToken));

CHECK_FAILURE(m_webView->Navigate(m_sampleUri.c_str()));
}

ScenarioAcceleratorKeyPressed::~ScenarioAcceleratorKeyPressed()
{
m_webView->remove_WebMessageReceived(m_webMessageReceivedToken);
m_controller->remove_AcceleratorKeyPressed(m_acceleratorKeyPressedToken);
m_webView->remove_ContentLoading(m_contentLoadingToken);
}
29 changes: 29 additions & 0 deletions SampleApps/WebView2APISample/ScenarioAcceleratorKeyPressed.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Copyright (C) Microsoft Corporation. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once
#include "stdafx.h"

#include <string>

#include "AppWindow.h"
#include "ComponentBase.h"

class ScenarioAcceleratorKeyPressed : public ComponentBase
{
public:
ScenarioAcceleratorKeyPressed(AppWindow* appWindow);
~ScenarioAcceleratorKeyPressed() override;

private:
EventRegistrationToken m_acceleratorKeyPressedToken = {};
EventRegistrationToken m_contentLoadingToken = {};
EventRegistrationToken m_webMessageReceivedToken = {};

AppWindow* m_appWindow = nullptr;
std::wstring m_sampleUri;
wil::com_ptr<ICoreWebView2Controller> m_controller;
wil::com_ptr<ICoreWebView2> m_webView;
wil::com_ptr<ICoreWebView2Settings3> m_settings3;
};
15 changes: 7 additions & 8 deletions SampleApps/WebView2APISample/ScenarioWebViewEventMonitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -993,21 +993,20 @@ void ScenarioWebViewEventMonitor::InitializeEventView(ICoreWebView2* webviewEven
L"{ \"kind\": \"event\", \"name\": \"FrameCreated\", \"args\": {";
message += L"\"frame\": " + EncodeQuote(name.get());

auto webView2Experimental23 = wil::com_ptr<ICoreWebView2>(sender)
.try_query<ICoreWebView2Experimental23>();
if (webView2Experimental23)
auto webView2_20 =
wil::com_ptr<ICoreWebView2>(sender).try_query<ICoreWebView2_20>();
if (webView2_20)
{
UINT32 frameId = 0;
CHECK_FAILURE(webView2Experimental23->get_FrameId(&frameId));
CHECK_FAILURE(webView2_20->get_FrameId(&frameId));
message +=
L",\"sender main frame id\": " + std::to_wstring((int)frameId);
}
auto experimentalFrame5 =
webviewFrame.try_query<ICoreWebView2ExperimentalFrame5>();
if (experimentalFrame5)
auto frame5 = webviewFrame.try_query<ICoreWebView2Frame5>();
if (frame5)
{
UINT32 frameId = 0;
CHECK_FAILURE(experimentalFrame5->get_FrameId(&frameId));
CHECK_FAILURE(frame5->get_FrameId(&frameId));
message += L",\"frame id\": " + std::to_wstring((int)frameId);
}
message +=
Expand Down
1 change: 1 addition & 0 deletions SampleApps/WebView2APISample/WebView2APISample.rc
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ BEGIN
MENUITEM "Web Messaging", IDM_SCENARIO_POST_WEB_MESSAGE
MENUITEM "WebView Event Monitor", IDM_SCENARIO_WEB_VIEW_EVENT_MONITOR
MENUITEM "Shared Buffer", IDM_SCENARIO_SHARED_BUFFER
MENUITEM "Accelerator Key Pressed", IDM_SCENARIO_ACCELERATOR_KEY_PRESSED
END
POPUP "&Audio"
BEGIN
Expand Down
9 changes: 7 additions & 2 deletions SampleApps/WebView2APISample/WebView2APISample.vcxproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
Expand Down Expand Up @@ -225,6 +225,7 @@
<ClInclude Include="ProcessComponent.h" />
<ClInclude Include="HostObjectSampleImpl.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="ScenarioAcceleratorKeyPressed.h" />
<ClInclude Include="ScenarioAddHostObject.h" />
<ClInclude Include="ScenarioAuthentication.h" />
<ClInclude Include="ScenarioClientCertificateRequested.h" />
Expand Down Expand Up @@ -272,6 +273,7 @@
<ClCompile Include="PermissionDialog.cpp" />
<ClCompile Include="ProcessComponent.cpp" />
<ClCompile Include="HostObjectSampleImpl.cpp" />
<ClCompile Include="ScenarioAcceleratorKeyPressed.cpp" />
<ClCompile Include="ScenarioAddHostObject.cpp" />
<ClCompile Include="ScenarioAuthentication.cpp" />
<ClCompile Include="ScenarioClientCertificateRequested.cpp" />
Expand Down Expand Up @@ -336,6 +338,9 @@
<CopyFileToFolders Include="assets/extensions/example-devtools-extension/panel.js">
<DestinationFolders>$(OutDir)\assets</DestinationFolders>
</CopyFileToFolders>
<CopyFileToFolders Include="assets/ScenarioAcceleratorKeyPressed.html">
<DestinationFolders>$(OutDir)\assets</DestinationFolders>
</CopyFileToFolders>
<CopyFileToFolders Include="assets/ScenarioCustomScheme.html">
<DestinationFolders>$(OutDir)\assets</DestinationFolders>
</CopyFileToFolders>
Expand Down Expand Up @@ -434,4 +439,4 @@
<Error Condition="!Exists('..\packages\Microsoft.Windows.ImplementationLibrary.1.0.220201.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Windows.ImplementationLibrary.1.0.220201.1\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
<Error Condition="!Exists('..\packages\Microsoft.Web.WebView2.1.0.2194-prerelease\build\native\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Web.WebView2.1.0.2194-prerelease\build\native\Microsoft.Web.WebView2.targets'))" />
</Target>
</Project>
</Project>
Loading

0 comments on commit 639dbe1

Please sign in to comment.