Use ComPtr smart pointer to make transfer of ownership explicit
With ComPtr, transfer of ownership is explicit in the code because we see the 'Detach' function being used. Task-number: QTBUG-126530 Change-Id: I815c22f21b4a9b174d0d49ceb014bbffe41b6e82 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> (cherry picked from commit d7edf2894c94271c3794a85ecf24a24ce92d2fcd) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
89ba182737
commit
f5ff1096ec
@ -271,31 +271,31 @@ HRESULT QWindowsUiaMainProvider::GetPatternProvider(PATTERNID idPattern, IUnknow
|
|||||||
switch (idPattern) {
|
switch (idPattern) {
|
||||||
case UIA_WindowPatternId:
|
case UIA_WindowPatternId:
|
||||||
if (accessible->parent() && (accessible->parent()->role() == QAccessible::Application)) {
|
if (accessible->parent() && (accessible->parent()->role() == QAccessible::Application)) {
|
||||||
*pRetVal = new QWindowsUiaWindowProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaWindowProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_TextPatternId:
|
case UIA_TextPatternId:
|
||||||
case UIA_TextPattern2Id:
|
case UIA_TextPattern2Id:
|
||||||
// All text controls.
|
// All text controls.
|
||||||
if (accessible->textInterface()) {
|
if (accessible->textInterface()) {
|
||||||
*pRetVal = new QWindowsUiaTextProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaTextProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_ValuePatternId:
|
case UIA_ValuePatternId:
|
||||||
// All non-static controls support the Value pattern.
|
// All non-static controls support the Value pattern.
|
||||||
if (accessible->role() != QAccessible::StaticText)
|
if (accessible->role() != QAccessible::StaticText)
|
||||||
*pRetVal = new QWindowsUiaValueProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaValueProvider>(id()).Detach();
|
||||||
break;
|
break;
|
||||||
case UIA_RangeValuePatternId:
|
case UIA_RangeValuePatternId:
|
||||||
// Controls providing a numeric value within a range (e.g., sliders, scroll bars, dials).
|
// Controls providing a numeric value within a range (e.g., sliders, scroll bars, dials).
|
||||||
if (accessible->valueInterface()) {
|
if (accessible->valueInterface()) {
|
||||||
*pRetVal = new QWindowsUiaRangeValueProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaRangeValueProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_TogglePatternId:
|
case UIA_TogglePatternId:
|
||||||
// Checkboxes and other checkable controls.
|
// Checkboxes and other checkable controls.
|
||||||
if (accessible->state().checkable)
|
if (accessible->state().checkable)
|
||||||
*pRetVal = new QWindowsUiaToggleProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaToggleProvider>(id()).Detach();
|
||||||
break;
|
break;
|
||||||
case UIA_SelectionPatternId:
|
case UIA_SelectionPatternId:
|
||||||
case UIA_SelectionPattern2Id:
|
case UIA_SelectionPattern2Id:
|
||||||
@ -303,7 +303,7 @@ HRESULT QWindowsUiaMainProvider::GetPatternProvider(PATTERNID idPattern, IUnknow
|
|||||||
if (accessible->selectionInterface()
|
if (accessible->selectionInterface()
|
||||||
|| accessible->role() == QAccessible::List
|
|| accessible->role() == QAccessible::List
|
||||||
|| accessible->role() == QAccessible::PageTabList) {
|
|| accessible->role() == QAccessible::PageTabList) {
|
||||||
*pRetVal = new QWindowsUiaSelectionProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaSelectionProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_SelectionItemPatternId:
|
case UIA_SelectionItemPatternId:
|
||||||
@ -312,41 +312,41 @@ HRESULT QWindowsUiaMainProvider::GetPatternProvider(PATTERNID idPattern, IUnknow
|
|||||||
|| (accessible->role() == QAccessible::RadioButton)
|
|| (accessible->role() == QAccessible::RadioButton)
|
||||||
|| (accessible->role() == QAccessible::ListItem)
|
|| (accessible->role() == QAccessible::ListItem)
|
||||||
|| (accessible->role() == QAccessible::PageTab)) {
|
|| (accessible->role() == QAccessible::PageTab)) {
|
||||||
*pRetVal = new QWindowsUiaSelectionItemProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaSelectionItemProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_TablePatternId:
|
case UIA_TablePatternId:
|
||||||
// Table/tree.
|
// Table/tree.
|
||||||
if (accessible->tableInterface()
|
if (accessible->tableInterface()
|
||||||
&& ((accessible->role() == QAccessible::Table) || (accessible->role() == QAccessible::Tree))) {
|
&& ((accessible->role() == QAccessible::Table) || (accessible->role() == QAccessible::Tree))) {
|
||||||
*pRetVal = new QWindowsUiaTableProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaTableProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_TableItemPatternId:
|
case UIA_TableItemPatternId:
|
||||||
// Item within a table/tree.
|
// Item within a table/tree.
|
||||||
if (accessible->tableCellInterface()
|
if (accessible->tableCellInterface()
|
||||||
&& ((accessible->role() == QAccessible::Cell) || (accessible->role() == QAccessible::TreeItem))) {
|
&& ((accessible->role() == QAccessible::Cell) || (accessible->role() == QAccessible::TreeItem))) {
|
||||||
*pRetVal = new QWindowsUiaTableItemProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaTableItemProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_GridPatternId:
|
case UIA_GridPatternId:
|
||||||
// Table/tree.
|
// Table/tree.
|
||||||
if (accessible->tableInterface()
|
if (accessible->tableInterface()
|
||||||
&& ((accessible->role() == QAccessible::Table) || (accessible->role() == QAccessible::Tree))) {
|
&& ((accessible->role() == QAccessible::Table) || (accessible->role() == QAccessible::Tree))) {
|
||||||
*pRetVal = new QWindowsUiaGridProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaGridProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_GridItemPatternId:
|
case UIA_GridItemPatternId:
|
||||||
// Item within a table/tree.
|
// Item within a table/tree.
|
||||||
if (accessible->tableCellInterface()
|
if (accessible->tableCellInterface()
|
||||||
&& ((accessible->role() == QAccessible::Cell) || (accessible->role() == QAccessible::TreeItem))) {
|
&& ((accessible->role() == QAccessible::Cell) || (accessible->role() == QAccessible::TreeItem))) {
|
||||||
*pRetVal = new QWindowsUiaGridItemProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaGridItemProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_InvokePatternId:
|
case UIA_InvokePatternId:
|
||||||
// Things that have an invokable action (e.g., simple buttons).
|
// Things that have an invokable action (e.g., simple buttons).
|
||||||
if (accessible->actionInterface()) {
|
if (accessible->actionInterface()) {
|
||||||
*pRetVal = new QWindowsUiaInvokeProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaInvokeProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UIA_ExpandCollapsePatternId:
|
case UIA_ExpandCollapsePatternId:
|
||||||
@ -356,7 +356,7 @@ HRESULT QWindowsUiaMainProvider::GetPatternProvider(PATTERNID idPattern, IUnknow
|
|||||||
&& accessible->child(0)->role() == QAccessible::PopupMenu)
|
&& accessible->child(0)->role() == QAccessible::PopupMenu)
|
||||||
|| accessible->role() == QAccessible::ComboBox
|
|| accessible->role() == QAccessible::ComboBox
|
||||||
|| (accessible->role() == QAccessible::TreeItem && accessible->state().expandable)) {
|
|| (accessible->role() == QAccessible::TreeItem && accessible->state().expandable)) {
|
||||||
*pRetVal = new QWindowsUiaExpandCollapseProvider(id());
|
*pRetVal = makeComObject<QWindowsUiaExpandCollapseProvider>(id()).Detach();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <QtGui/qaccessible.h>
|
#include <QtGui/qaccessible.h>
|
||||||
#include <QtCore/qloggingcategory.h>
|
#include <QtCore/qloggingcategory.h>
|
||||||
#include <QtCore/qstring.h>
|
#include <QtCore/qstring.h>
|
||||||
|
#include <QtCore/private/qcomptr_p.h>
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
using namespace QWindowsUiAutomation;
|
using namespace QWindowsUiAutomation;
|
||||||
@ -50,9 +50,9 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTextProvider::GetSelection(SAFEARRAY **pRet
|
|||||||
for (LONG i = 0; i < selCount; ++i) {
|
for (LONG i = 0; i < selCount; ++i) {
|
||||||
int startOffset = 0, endOffset = 0;
|
int startOffset = 0, endOffset = 0;
|
||||||
textInterface->selection((int)i, &startOffset, &endOffset);
|
textInterface->selection((int)i, &startOffset, &endOffset);
|
||||||
auto *textRangeProvider = new QWindowsUiaTextRangeProvider(id(), startOffset, endOffset);
|
ComPtr<IUnknown> textRangeProvider =
|
||||||
SafeArrayPutElement(*pRetVal, &i, static_cast<IUnknown *>(textRangeProvider));
|
makeComObject<QWindowsUiaTextRangeProvider>(id(), startOffset, endOffset);
|
||||||
textRangeProvider->Release();
|
SafeArrayPutElement(*pRetVal, &i, textRangeProvider.Get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -60,9 +60,9 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTextProvider::GetSelection(SAFEARRAY **pRet
|
|||||||
if ((*pRetVal = SafeArrayCreateVector(VT_UNKNOWN, 0, 1))) {
|
if ((*pRetVal = SafeArrayCreateVector(VT_UNKNOWN, 0, 1))) {
|
||||||
LONG i = 0;
|
LONG i = 0;
|
||||||
int cursorPosition = textInterface->cursorPosition();
|
int cursorPosition = textInterface->cursorPosition();
|
||||||
auto *textRangeProvider = new QWindowsUiaTextRangeProvider(id(), cursorPosition, cursorPosition);
|
ComPtr<IUnknown> textRangeProvider = makeComObject<QWindowsUiaTextRangeProvider>(
|
||||||
SafeArrayPutElement(*pRetVal, &i, static_cast<IUnknown *>(textRangeProvider));
|
id(), cursorPosition, cursorPosition);
|
||||||
textRangeProvider->Release();
|
SafeArrayPutElement(*pRetVal, &i, textRangeProvider.Get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -88,9 +88,9 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTextProvider::GetVisibleRanges(SAFEARRAY **
|
|||||||
// Considering the entire text as visible.
|
// Considering the entire text as visible.
|
||||||
if ((*pRetVal = SafeArrayCreateVector(VT_UNKNOWN, 0, 1))) {
|
if ((*pRetVal = SafeArrayCreateVector(VT_UNKNOWN, 0, 1))) {
|
||||||
LONG i = 0;
|
LONG i = 0;
|
||||||
auto *textRangeProvider = new QWindowsUiaTextRangeProvider(id(), 0, textInterface->characterCount());
|
ComPtr<IUnknown> textRangeProvider =
|
||||||
SafeArrayPutElement(*pRetVal, &i, static_cast<IUnknown *>(textRangeProvider));
|
makeComObject<QWindowsUiaTextRangeProvider>(id(), 0, textInterface->characterCount());
|
||||||
textRangeProvider->Release();
|
SafeArrayPutElement(*pRetVal, &i, textRangeProvider.Get());
|
||||||
}
|
}
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
@ -135,7 +135,7 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTextProvider::RangeFromPoint(UiaPoint point
|
|||||||
if (offset < 0 || offset >= textInterface->characterCount())
|
if (offset < 0 || offset >= textInterface->characterCount())
|
||||||
return UIA_E_ELEMENTNOTAVAILABLE;
|
return UIA_E_ELEMENTNOTAVAILABLE;
|
||||||
|
|
||||||
*pRetVal = new QWindowsUiaTextRangeProvider(id(), offset, offset);
|
*pRetVal = makeComObject<QWindowsUiaTextRangeProvider>(id(), offset, offset).Detach();
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,7 +156,8 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTextProvider::get_DocumentRange(ITextRangeP
|
|||||||
if (!textInterface)
|
if (!textInterface)
|
||||||
return UIA_E_ELEMENTNOTAVAILABLE;
|
return UIA_E_ELEMENTNOTAVAILABLE;
|
||||||
|
|
||||||
*pRetVal = new QWindowsUiaTextRangeProvider(id(), 0, textInterface->characterCount());
|
*pRetVal = makeComObject<QWindowsUiaTextRangeProvider>(id(), 0, textInterface->characterCount())
|
||||||
|
.Detach();
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +203,8 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTextProvider::GetCaretRange(BOOL *isActive,
|
|||||||
*isActive = accessible->state().focused;
|
*isActive = accessible->state().focused;
|
||||||
|
|
||||||
int cursorPosition = textInterface->cursorPosition();
|
int cursorPosition = textInterface->cursorPosition();
|
||||||
*pRetVal = new QWindowsUiaTextRangeProvider(id(), cursorPosition, cursorPosition);
|
*pRetVal = makeComObject<QWindowsUiaTextRangeProvider>(id(), cursorPosition, cursorPosition)
|
||||||
|
.Detach();
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ HRESULT QWindowsUiaTextRangeProvider::Clone(ITextRangeProvider **pRetVal)
|
|||||||
if (!pRetVal)
|
if (!pRetVal)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
*pRetVal = new QWindowsUiaTextRangeProvider(id(), m_startOffset, m_endOffset);
|
*pRetVal = makeComObject<QWindowsUiaTextRangeProvider>(id(), m_startOffset, m_endOffset).Detach();
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user