Skip to content

Commit

Permalink
This doesn't immediately crash, but it does crash when you start aski…
Browse files Browse the repository at this point in the history
…ng for the actual text ranges. That's not what you want.
  • Loading branch information
zadjii-msft committed Aug 16, 2021
1 parent d5920a8 commit 4150609
Show file tree
Hide file tree
Showing 10 changed files with 54 additions and 11 deletions.
17 changes: 13 additions & 4 deletions src/cascadia/TerminalControl/InteractivityAutomationPeer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_controlPadding = padding;
}

void InteractivityAutomationPeer::SetParentProvider(Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple parentProvider)
{
_parentProvider = parentProvider;
}

// Method Description:
// - Signals the ui automation client that the terminal's selection has
// changed and should be updated
Expand Down Expand Up @@ -111,7 +116,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
THROW_IF_FAILED(_uiaProvider->RangeFromChild(/* IRawElementProviderSimple */ nullptr,
&returnVal));

const auto parentProvider = this->ProviderFromPeer(*this);
// const auto parentProvider = this->ProviderFromPeer(*this);
const auto parentProvider = _parentProvider;
const auto xutr = winrt::make_self<XamlUiaTextRange>(returnVal, parentProvider);
return xutr.as<XamlAutomation::ITextRangeProvider>();
}
Expand All @@ -121,7 +127,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
UIA::ITextRangeProvider* returnVal;
THROW_IF_FAILED(_uiaProvider->RangeFromPoint({ screenLocation.X, screenLocation.Y }, &returnVal));

const auto parentProvider = this->ProviderFromPeer(*this);
// const auto parentProvider = this->ProviderFromPeer(*this);
const auto parentProvider = _parentProvider;
const auto xutr = winrt::make_self<XamlUiaTextRange>(returnVal, parentProvider);
return xutr.as<XamlAutomation::ITextRangeProvider>();
}
Expand All @@ -131,7 +138,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
UIA::ITextRangeProvider* returnVal;
THROW_IF_FAILED(_uiaProvider->get_DocumentRange(&returnVal));

const auto parentProvider = this->ProviderFromPeer(*this);
// const auto parentProvider = this->ProviderFromPeer(*this);
const auto parentProvider = _parentProvider;
const auto xutr = winrt::make_self<XamlUiaTextRange>(returnVal, parentProvider);
return xutr.as<XamlAutomation::ITextRangeProvider>();
}
Expand Down Expand Up @@ -194,7 +202,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation

std::vector<XamlAutomation::ITextRangeProvider> vec;
vec.reserve(count);
auto parentProvider = this->ProviderFromPeer(*this);
// auto parentProvider = this->ProviderFromPeer(*this);
const auto parentProvider = _parentProvider;
for (int i = 0; i < count; i++)
{
auto xutr = make_self<XamlUiaTextRange>(providers[i].detach(), parentProvider);
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/TerminalControl/InteractivityAutomationPeer.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation

void SetControlBounds(const Windows::Foundation::Rect bounds);
void SetControlPadding(const Core::Padding padding);
void SetParentProvider(Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple parentProvider);

#pragma region IUiaEventDispatcher
void SignalSelectionChanged() override;
Expand Down Expand Up @@ -76,6 +77,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
private:
::Microsoft::WRL::ComPtr<::Microsoft::Terminal::TermControlUiaProvider> _uiaProvider;
winrt::Microsoft::Terminal::Control::implementation::ControlInteractivity* _interactivity;
winrt::Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple _parentProvider{ nullptr };

til::rectangle _controlBounds{};
til::rectangle _controlPadding{};
Expand Down
12 changes: 10 additions & 2 deletions src/cascadia/TerminalControl/InteractivityAutomationPeer.idl
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,21 @@

namespace Microsoft.Terminal.Control
{
[default_interface] runtimeclass InteractivityAutomationPeer :
[default_interface] runtimeclass InteractivityAutomationPeer/* :
Windows.UI.Xaml.Automation.Peers.AutomationPeer,
Windows.UI.Xaml.Automation.Provider.ITextProvider
Windows.UI.Xaml.Automation.Provider.ITextProvider*/
{

Windows.UI.Xaml.Automation.Provider.ITextRangeProvider[] GetSelection();
Windows.UI.Xaml.Automation.Provider.ITextRangeProvider[] GetVisibleRanges();
Windows.UI.Xaml.Automation.Provider.ITextRangeProvider RangeFromChild(Windows.UI.Xaml.Automation.Provider.IRawElementProviderSimple childElement);
Windows.UI.Xaml.Automation.Provider.ITextRangeProvider RangeFromPoint(Windows.Foundation.Point screenLocation);
Windows.UI.Xaml.Automation.Provider.ITextRangeProvider DocumentRange();
Windows.UI.Xaml.Automation.SupportedTextSelection SupportedTextSelection();

void SetControlBounds(Windows.Foundation.Rect bounds);
void SetControlPadding(Microsoft.Terminal.Core.Padding padding);
void SetParentProvider(Windows.UI.Xaml.Automation.Provider.IRawElementProviderSimple provider);

event Windows.Foundation.TypedEventHandler<Object, Object> SelectionChanged;
event Windows.Foundation.TypedEventHandler<Object, Object> TextChanged;
Expand Down
3 changes: 2 additions & 1 deletion src/cascadia/TerminalControl/TermControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation

void TermControl::_createContentWaitThread()
{
_contentWaitThread = std::thread([weakThis = get_weak(), contentPid = _contentProc.GetPID(), contentWaitInterrupt=_contentWaitInterrupt.get()] {
_contentWaitThread = std::thread([weakThis = get_weak(), contentPid = _contentProc.GetPID(), contentWaitInterrupt = _contentWaitInterrupt.get()] {
if (s_waitOnContentProcess(contentPid, contentWaitInterrupt))
{
if (auto control{ weakThis.get() })
Expand Down Expand Up @@ -683,6 +683,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
if (const auto& interactivityAutoPeer{ _interactivity.OnCreateAutomationPeer() })
{
_automationPeer = winrt::make<implementation::TermControlAutomationPeer>(this, interactivityAutoPeer);
interactivityAutoPeer.SetParentProvider(_automationPeer.GetParentProvider());
return _automationPeer;
}
}
Expand Down
6 changes: 6 additions & 0 deletions src/cascadia/TerminalControl/TermControlAutomationPeer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_contentAutomationPeer.SetControlPadding(padding);
}

XamlAutomation::IRawElementProviderSimple TermControlAutomationPeer::GetParentProvider()
{
const auto parentProvider = this->ProviderFromPeer(*this);
return parentProvider;
}

// Method Description:
// - Signals the ui automation client that the terminal's selection has changed and should be updated
// Arguments:
Expand Down
1 change: 1 addition & 0 deletions src/cascadia/TerminalControl/TermControlAutomationPeer.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation

void UpdateControlBounds();
void SetControlPadding(const Core::Padding padding);
Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple GetParentProvider();

#pragma region FrameworkElementAutomationPeer
hstring GetClassNameCore() const;
Expand Down
1 change: 1 addition & 0 deletions src/cascadia/TerminalControl/TermControlAutomationPeer.idl
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ namespace Microsoft.Terminal.Control

void UpdateControlBounds();
void SetControlPadding(Microsoft.Terminal.Core.Padding padding);
Windows.UI.Xaml.Automation.Provider.IRawElementProviderSimple GetParentProvider();
}
}
9 changes: 7 additions & 2 deletions src/cascadia/TerminalControl/TerminalControlLib.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@
<ClInclude Include="TSFInputControl.h">
<DependentUpon>TSFInputControl.xaml</DependentUpon>
</ClInclude>
<ClInclude Include="XamlUiaTextRange.h" />
<ClInclude Include="XamlUiaTextRange.h" >
<DependentUpon>XamlUiaTextRange.idl</DependentUpon>
</ClInclude>
</ItemGroup>
<!-- ========================= Cpp Files ======================== -->
<ItemGroup>
Expand Down Expand Up @@ -103,7 +105,9 @@
<ClCompile Include="InteractivityAutomationPeer.cpp">
<DependentUpon>InteractivityAutomationPeer.idl</DependentUpon>
</ClCompile>
<ClCompile Include="XamlUiaTextRange.cpp" />
<ClCompile Include="XamlUiaTextRange.cpp" >
<DependentUpon>XamlUiaTextRange.idl</DependentUpon>
</ClCompile>
</ItemGroup>
<!-- ========================= idl Files ======================== -->
<ItemGroup>
Expand All @@ -130,6 +134,7 @@
<Midl Include="TSFInputControl.idl">
<DependentUpon>TSFInputControl.xaml</DependentUpon>
</Midl>
<Midl Include="XamlUiaTextRange.idl" />
</ItemGroup>
<!-- ========================= XAML Files ======================== -->
<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions src/cascadia/TerminalControl/XamlUiaTextRange.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ Author(s):
#pragma once

#include "TermControlAutomationPeer.h"
#include "XamlUiaTextRange.g.h"
#include <UIAutomationCore.h>
#include "../types/TermControlUiaTextRange.hpp"

namespace winrt::Microsoft::Terminal::Control::implementation
{
class XamlUiaTextRange :
public winrt::implements<XamlUiaTextRange, Windows::UI::Xaml::Automation::Provider::ITextRangeProvider>
class XamlUiaTextRange : public XamlUiaTextRangeT<XamlUiaTextRange>
{
public:
XamlUiaTextRange(::ITextRangeProvider* uiaProvider, Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple parentProvider) :
Expand Down
10 changes: 10 additions & 0 deletions src/cascadia/TerminalControl/XamlUiaTextRange.idl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

namespace Microsoft.Terminal.Control
{
[default_interface] runtimeclass XamlUiaTextRange :
Windows.UI.Xaml.Automation.Provider.ITextRangeProvider
{
}
}

0 comments on commit 4150609

Please sign in to comment.