File tree Expand file tree Collapse file tree 4 files changed +68
-0
lines changed
Expand file tree Collapse file tree 4 files changed +68
-0
lines changed Original file line number Diff line number Diff line change @@ -21,6 +21,11 @@ namespace winrt::impl
2121 template <typename Interface>
2222 hresult get_runtime_activation_factory (param::hstring const & name, void ** result) noexcept
2323 {
24+ if (winrt_activation_handler)
25+ {
26+ return winrt_activation_handler (*(void **)(&name), guid_of<Interface>(), result);
27+ }
28+
2429 static int32_t (__stdcall * handler)(void * classId, guid const & iid, void ** factory) noexcept ;
2530
2631 impl::load_runtime_function (" RoGetActivationFactory" , handler,
Original file line number Diff line number Diff line change 22__declspec (selectany) int32_t(__stdcall* winrt_to_hresult_handler)(void * address) noexcept {};
33__declspec (selectany) void(__stdcall* winrt_suspend_handler)(void const * token) noexcept {};
44__declspec (selectany) void(__stdcall* winrt_resume_handler)(void const * token) noexcept {};
5+ __declspec (selectany) int32_t(__stdcall* winrt_activation_handler)(void * classId, winrt::guid const & iid, void ** factory) noexcept {};
56
67extern " C"
78{
Original file line number Diff line number Diff line change 1+ #include " winrt/Windows.Foundation.Numerics.h"
2+ #include " catch.hpp"
3+
4+ using namespace winrt ;
5+ using namespace Windows ::Foundation;
6+
7+ namespace
8+ {
9+ struct custom_factory : implements<custom_factory, IUriRuntimeClassFactory>
10+ {
11+ inline static Uri mock_uri{ nullptr };
12+
13+ Uri CreateUri (hstring const & value) const
14+ {
15+ REQUIRE (value == L" http://ignored.com" );
16+ return mock_uri;
17+ }
18+
19+ Uri CreateWithRelativeUri (hstring const &, hstring const &) const
20+ {
21+ throw hresult_not_implemented ();
22+ }
23+ };
24+
25+ int32_t __stdcall handler (void * classId, winrt::guid const & iid, void ** factory) noexcept
26+ {
27+ bool expected = reinterpret_cast <hstring const &>(classId) == L" Windows.Foundation.Uri" ;
28+ REQUIRE (expected);
29+ REQUIRE (iid == guid_of<IUriRuntimeClassFactory>());
30+
31+ *factory = detach_abi (make<custom_factory>());
32+ return 0 ;
33+ }
34+ }
35+
36+ TEST_CASE (" custom_activation" )
37+ {
38+ custom_factory::mock_uri = Uri (L" http://actual.com" );
39+ clear_factory_cache ();
40+
41+ // Set up global handler
42+ REQUIRE (!winrt_activation_handler);
43+ winrt_activation_handler = handler;
44+
45+ // Windows.Foundation.Uri activation factory now returns mock object
46+ auto uri = Uri (L" http://ignored.com" );
47+ REQUIRE (uri.Domain () == L" actual.com" );
48+
49+ // Remove global handler
50+ winrt_activation_handler = nullptr ;
51+ clear_factory_cache ();
52+ }
Original file line number Diff line number Diff line change 315315 <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Debug|x64'" >NotUsing</PrecompiledHeader >
316316 <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Release|x64'" >NotUsing</PrecompiledHeader >
317317 </ClCompile >
318+ <ClCompile Include =" custom_activation.cpp" >
319+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Debug|Win32'" >NotUsing</PrecompiledHeader >
320+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Release|Win32'" >NotUsing</PrecompiledHeader >
321+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Debug|ARM64'" >NotUsing</PrecompiledHeader >
322+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Release|ARM64'" >NotUsing</PrecompiledHeader >
323+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Debug|ARM'" >NotUsing</PrecompiledHeader >
324+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Release|ARM'" >NotUsing</PrecompiledHeader >
325+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Debug|x64'" >NotUsing</PrecompiledHeader >
326+ <PrecompiledHeader Condition =" '$(Configuration)|$(Platform)'=='Release|x64'" >NotUsing</PrecompiledHeader >
327+ </ClCompile >
318328 <ClCompile Include =" custom_error.cpp" />
319329 <ClCompile Include =" delegate.cpp" />
320330 <ClCompile Include =" delegates.cpp" />
You can’t perform that action at this time.
0 commit comments