toolkit: convert AccessibleStatusBar test to C++
Just translate the test and add required or handy CppUnit helpers. Change-Id: Ib8ccd3490876c6302cca85e69f4d61600f7aec84 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133844 Tested-by: Jenkins Tested-by: Caolán McNamara <caolanm@redhat.com> Reviewed-by: Caolán McNamara <caolanm@redhat.com>
This commit is contained in:
committed by
Caolán McNamara
parent
1d5ed2fdd1
commit
d2a5b4bc0b
@@ -0,0 +1,65 @@
|
||||
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||
#
|
||||
# This file is part of the LibreOffice project.
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#
|
||||
|
||||
$(eval $(call gb_CppunitTest_CppunitTest,toolkit_a11y))
|
||||
|
||||
$(eval $(call gb_CppunitTest_add_exception_objects,toolkit_a11y, \
|
||||
toolkit/qa/cppunit/a11y/AccessibleStatusBarTest \
|
||||
toolkit/qa/cppunit/a11y/AccessibilityTools \
|
||||
toolkit/qa/cppunit/a11y/XAccessibleComponentTester \
|
||||
toolkit/qa/cppunit/a11y/XAccessibleContextTester \
|
||||
toolkit/qa/cppunit/a11y/XAccessibleEventBroadcasterTester \
|
||||
toolkit/qa/cppunit/a11y/XAccessibleExtendedComponentTester \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_libraries,toolkit_a11y, \
|
||||
basegfx \
|
||||
comphelper \
|
||||
cppu \
|
||||
cppuhelper \
|
||||
sal \
|
||||
salhelper \
|
||||
test \
|
||||
tk \
|
||||
tl \
|
||||
unotest \
|
||||
vcl \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_api,toolkit_a11y,\
|
||||
offapi \
|
||||
udkapi \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_externals,toolkit_a11y,\
|
||||
boost_headers \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_sdk_api,toolkit_a11y))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_ure,toolkit_a11y))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_configuration,toolkit_a11y))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_vcl,toolkit_a11y))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_rdb,toolkit_a11y,services))
|
||||
|
||||
#~ $(eval $(call gb_CppunitTest_use_components,toolkit_a11y,\
|
||||
#~ comphelper/util/comphelp \
|
||||
#~ configmgr/source/configmgr \
|
||||
#~ framework/util/fwk \
|
||||
#~ i18npool/util/i18npool \
|
||||
#~ sfx2/util/sfx \
|
||||
#~ toolkit/util/tk \
|
||||
#~ ucb/source/core/ucb1 \
|
||||
#~ ucb/source/ucp/file/ucpfile1 \
|
||||
#~ ))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
||||
@@ -27,6 +27,7 @@ $(eval $(call gb_Module_add_targets,toolkit,\
|
||||
ifneq ($(OS),WNT)
|
||||
$(eval $(call gb_Module_add_check_targets,toolkit,\
|
||||
CppunitTest_toolkit \
|
||||
CppunitTest_toolkit_a11y \
|
||||
))
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,315 +0,0 @@
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
package complex.toolkit;
|
||||
|
||||
import complex.toolkit.accessibility._XAccessibleEventBroadcaster;
|
||||
import complex.toolkit.accessibility._XAccessibleExtendedComponent;
|
||||
import complex.toolkit.accessibility._XAccessibleComponent;
|
||||
import complex.toolkit.accessibility._XAccessibleContext;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.Level;
|
||||
import util.SOfficeFactory;
|
||||
import util.AccessibilityTools;
|
||||
import com.sun.star.awt.XWindow;
|
||||
import com.sun.star.lang.XMultiServiceFactory;
|
||||
import com.sun.star.lang.XComponent;
|
||||
import com.sun.star.lang.XServiceInfo;
|
||||
import com.sun.star.sheet.XSpreadsheetDocument;
|
||||
import com.sun.star.text.XTextDocument;
|
||||
import com.sun.star.uno.XInterface;
|
||||
import com.sun.star.uno.UnoRuntime;
|
||||
import com.sun.star.util.XCloseable;
|
||||
import com.sun.star.accessibility.AccessibleRole;
|
||||
import com.sun.star.accessibility.XAccessible;
|
||||
import com.sun.star.accessibility.XAccessibleContext;
|
||||
import com.sun.star.awt.XExtendedToolkit;
|
||||
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import org.openoffice.test.OfficeConnection;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class AccessibleStatusBar {
|
||||
|
||||
XInterface testObject = null;
|
||||
XMultiServiceFactory xMSF = null;
|
||||
XWindow xWindow = null;
|
||||
|
||||
private XMultiServiceFactory getMSF()
|
||||
{
|
||||
return UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
|
||||
}
|
||||
|
||||
/**
|
||||
* Check document types
|
||||
*/
|
||||
@Test
|
||||
public void checkDocs() {
|
||||
checkWriterDoc();
|
||||
checkMathDoc();
|
||||
checkDrawDoc();
|
||||
checkImpressDoc();
|
||||
checkCalcDoc();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the interfaces on a writer document
|
||||
*/
|
||||
public void checkWriterDoc() {
|
||||
xMSF = getMSF();
|
||||
SOfficeFactory xSOF = SOfficeFactory.getFactory(xMSF);
|
||||
XTextDocument xTextDoc = null;
|
||||
try {
|
||||
System.out.println("****** Open a new writer document");
|
||||
xTextDoc = xSOF.createTextDoc("_blank");
|
||||
getTestObject();
|
||||
}
|
||||
catch(com.sun.star.uno.Exception e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
runAllInterfaceTests();
|
||||
|
||||
if (xTextDoc != null) {
|
||||
XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xTextDoc);
|
||||
try {
|
||||
xClose.close(false);
|
||||
}
|
||||
catch(com.sun.star.util.CloseVetoException e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the interfaces on a math document
|
||||
*/
|
||||
public void checkMathDoc() {
|
||||
xMSF = getMSF();
|
||||
SOfficeFactory xSOF = SOfficeFactory.getFactory(xMSF);
|
||||
XComponent xMathDoc = null;
|
||||
try {
|
||||
System.out.println("****** Open a new math document");
|
||||
xMathDoc = xSOF.createMathDoc("_blank");
|
||||
getTestObject();
|
||||
}
|
||||
catch(com.sun.star.uno.Exception e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
runAllInterfaceTests();
|
||||
|
||||
if (xMathDoc != null) {
|
||||
XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xMathDoc);
|
||||
try {
|
||||
xClose.close(false);
|
||||
}
|
||||
catch(com.sun.star.util.CloseVetoException e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the interfaces on a draw document
|
||||
*/
|
||||
public void checkDrawDoc() {
|
||||
xMSF = getMSF();
|
||||
SOfficeFactory xSOF = SOfficeFactory.getFactory(xMSF);
|
||||
XComponent xDrawDoc = null;
|
||||
try {
|
||||
System.out.println("****** Open a new draw document");
|
||||
xDrawDoc = xSOF.createDrawDoc("_blank");
|
||||
getTestObject();
|
||||
}
|
||||
catch(com.sun.star.uno.Exception e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
runAllInterfaceTests();
|
||||
|
||||
if (xDrawDoc != null) {
|
||||
XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xDrawDoc);
|
||||
try {
|
||||
xClose.close(false);
|
||||
}
|
||||
catch(com.sun.star.util.CloseVetoException e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the interfaces on an impress document
|
||||
*/
|
||||
public void checkImpressDoc() {
|
||||
xMSF = getMSF();
|
||||
SOfficeFactory xSOF = SOfficeFactory.getFactory(xMSF);
|
||||
XComponent xImpressDoc = null;
|
||||
try {
|
||||
System.out.println("****** Open a new impress document");
|
||||
xImpressDoc = xSOF.createImpressDoc("_blank");
|
||||
getTestObject();
|
||||
}
|
||||
catch(com.sun.star.uno.Exception e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
runAllInterfaceTests();
|
||||
|
||||
if (xImpressDoc != null) {
|
||||
XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xImpressDoc);
|
||||
try {
|
||||
xClose.close(false);
|
||||
}
|
||||
catch(com.sun.star.util.CloseVetoException e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Test the interfaces on a calc document
|
||||
*/
|
||||
public void checkCalcDoc() {
|
||||
xMSF = getMSF();
|
||||
SOfficeFactory xSOF = SOfficeFactory.getFactory(xMSF);
|
||||
XSpreadsheetDocument xSpreadsheetDoc = null;
|
||||
try {
|
||||
System.out.println("****** Open a new calc document");
|
||||
xSpreadsheetDoc = xSOF.createCalcDoc("_blank");
|
||||
util.utils.waitForEventIdle(xMSF);
|
||||
getTestObject();
|
||||
}
|
||||
catch(com.sun.star.uno.Exception e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
runAllInterfaceTests();
|
||||
|
||||
if (xSpreadsheetDoc != null) {
|
||||
XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xSpreadsheetDoc);
|
||||
try {
|
||||
xClose.close(false);
|
||||
}
|
||||
catch(com.sun.star.util.CloseVetoException e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void getTestObject() {
|
||||
try {
|
||||
XInterface xIfc = (XInterface) xMSF.createInstance(
|
||||
"com.sun.star.awt.Toolkit") ;
|
||||
XExtendedToolkit tk = UnoRuntime.queryInterface(XExtendedToolkit.class, xIfc);
|
||||
|
||||
util.utils.waitForEventIdle(xMSF);
|
||||
xWindow = UnoRuntime.queryInterface(XWindow.class, tk.getActiveTopWindow());
|
||||
|
||||
util.utils.waitForEventIdle(xMSF);
|
||||
XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow);
|
||||
XAccessibleContext parentContext = null;
|
||||
|
||||
System.out.println("Get the accessible status bar.");
|
||||
parentContext = AccessibilityTools.getAccessibleObjectForRole(
|
||||
xRoot, AccessibleRole.STATUS_BAR, "");
|
||||
util.utils.waitForEventIdle(xMSF);
|
||||
System.out.println("...OK.");
|
||||
|
||||
XServiceInfo xSI = UnoRuntime.queryInterface(XServiceInfo.class, parentContext);
|
||||
String[] services = xSI.getSupportedServiceNames();
|
||||
System.out.println("*****");
|
||||
System.out.println("* Implementation Name: " + xSI.getImplementationName());
|
||||
for (int i=0; i<services.length; i++)
|
||||
{
|
||||
System.out.println("* ServiceName " + i + ": " + services[i]);
|
||||
}
|
||||
System.out.println("*****");
|
||||
testObject=parentContext;
|
||||
}
|
||||
catch(com.sun.star.uno.Exception e) {
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", e );
|
||||
}
|
||||
catch(Throwable t) {
|
||||
System.out.println("Got throwable:");
|
||||
Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, "caught an exception", t );
|
||||
}
|
||||
}
|
||||
|
||||
public void runAllInterfaceTests() {
|
||||
System.out.println("*** Now testing XAccessibleComponent ***");
|
||||
_XAccessibleComponent _xAccCompTest =
|
||||
new _XAccessibleComponent(testObject);
|
||||
assertTrue("failed: XAccessibleComponent::getBounds", _xAccCompTest._getBounds());
|
||||
assertTrue("failed: XAccessibleComponent::contains", _xAccCompTest._containsPoint());
|
||||
assertTrue("failed: XAccessibleComponent::getAccessibleAt", _xAccCompTest._getAccessibleAtPoint());
|
||||
assertTrue("failed: XAccessibleComponent::getBackground", _xAccCompTest._getBackground());
|
||||
assertTrue("failed: XAccessibleComponent::getForeground", _xAccCompTest._getForeground());
|
||||
assertTrue("failed: XAccessibleComponent::getLocation", _xAccCompTest._getLocation());
|
||||
assertTrue("failed: XAccessibleComponent::getLocationOnScreen", _xAccCompTest._getLocationOnScreen());
|
||||
assertTrue("failed: XAccessibleComponent::getSize", _xAccCompTest._getSize());
|
||||
assertTrue("failed: XAccessibleComponent::grabFocus", _xAccCompTest._grabFocus());
|
||||
|
||||
System.out.println("*** Now testing XAccessibleContext ***");
|
||||
_XAccessibleContext _xAccContext =
|
||||
new _XAccessibleContext(testObject);
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleChildCount", _xAccContext._getAccessibleChildCount());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleChild", _xAccContext._getAccessibleChild());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleDescription", _xAccContext._getAccessibleDescription());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleName", _xAccContext._getAccessibleName());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleParent", _xAccContext._getAccessibleParent());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleIndexInParent", _xAccContext._getAccessibleIndexInParent());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleRelationSet", _xAccContext._getAccessibleRelationSet());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleRole", _xAccContext._getAccessibleRole());
|
||||
assertTrue("failed: XAccessibleContext::getAccessibleStateSet", _xAccContext._getAccessibleStateSet());
|
||||
assertTrue("failed: XAccessibleContext::getLocale", _xAccContext._getLocale());
|
||||
|
||||
System.out.println("*** Now testing XAccessibleExtendedComponent ***");
|
||||
_XAccessibleExtendedComponent _xAccExtComp =
|
||||
new _XAccessibleExtendedComponent(testObject);
|
||||
assertTrue("failed: XAccessibleExtendedComponent::getFont", _xAccExtComp._getFont());
|
||||
assertTrue("failed: XAccessibleExtendedComponent::getTitledBorderText", _xAccExtComp._getTitledBorderText());
|
||||
assertTrue("failed: XAccessibleExtendedComponent::getToolTipText", _xAccExtComp._getToolTipText());
|
||||
|
||||
System.out.println("*** Now testing XAccessibleEventBroadcaster ***");
|
||||
_XAccessibleEventBroadcaster _xAccEvBcast =
|
||||
new _XAccessibleEventBroadcaster(testObject, xWindow);
|
||||
assertTrue("failed: XAccessibleEventBroadcaster::addEventListener", _xAccEvBcast._addEventListener(xMSF));
|
||||
assertTrue("failed: XAccessibleEventBroadcaster::removeEventListener", _xAccEvBcast._removeEventListener(xMSF));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpConnection() throws Exception {
|
||||
System.out.println("setUpConnection()");
|
||||
connection.setUp();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void tearDownConnection()
|
||||
throws InterruptedException, com.sun.star.uno.Exception
|
||||
{
|
||||
System.out.println("tearDownConnection()");
|
||||
connection.tearDown();
|
||||
}
|
||||
|
||||
private static final OfficeConnection connection = new OfficeConnection();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,515 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include "AccessibilityTools.hxx"
|
||||
|
||||
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
|
||||
#include <com/sun/star/accessibility/AccessibleRole.hpp>
|
||||
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessible.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
|
||||
#include <sal/log.hxx>
|
||||
#include <vcl/scheduler.hxx>
|
||||
#include <vcl/timer.hxx>
|
||||
|
||||
using namespace css;
|
||||
|
||||
/* FIXME: mostly copied from sw/qa/extras/accessibility/accessible_relation_set.cxx */
|
||||
css::uno::Reference<css::accessibility::XAccessibleContext>
|
||||
AccessibilityTools::getAccessibleObjectForRole(
|
||||
const css::uno::Reference<css::accessibility::XAccessible>& xacc, sal_Int16 role)
|
||||
{
|
||||
css::uno::Reference<css::accessibility::XAccessibleContext> ac = xacc->getAccessibleContext();
|
||||
bool isShowing
|
||||
= ac->getAccessibleStateSet()->contains(accessibility::AccessibleStateType::SHOWING);
|
||||
|
||||
if ((ac->getAccessibleRole() == role) && isShowing)
|
||||
{
|
||||
return ac;
|
||||
}
|
||||
else
|
||||
{
|
||||
int count = ac->getAccessibleChildCount();
|
||||
|
||||
for (int i = 0; i < count && i < AccessibilityTools::MAX_CHILDREN; i++)
|
||||
{
|
||||
css::uno::Reference<css::accessibility::XAccessibleContext> ac2
|
||||
= AccessibilityTools::getAccessibleObjectForRole(ac->getAccessibleChild(i), role);
|
||||
if (ac2.is())
|
||||
return ac2;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
/* FIXME: end copy */
|
||||
|
||||
bool AccessibilityTools::equals(const uno::Reference<accessibility::XAccessible>& xacc1,
|
||||
const uno::Reference<accessibility::XAccessible>& xacc2)
|
||||
{
|
||||
if (!xacc1.is() || !xacc2.is())
|
||||
return xacc1.is() == xacc2.is();
|
||||
return equals(xacc1->getAccessibleContext(), xacc2->getAccessibleContext());
|
||||
}
|
||||
|
||||
bool AccessibilityTools::equals(const uno::Reference<accessibility::XAccessibleContext>& xctx1,
|
||||
const uno::Reference<accessibility::XAccessibleContext>& xctx2)
|
||||
{
|
||||
if (!xctx1.is() || !xctx2.is())
|
||||
return xctx1.is() == xctx2.is();
|
||||
|
||||
if (xctx1->getAccessibleRole() != xctx2->getAccessibleRole())
|
||||
return false;
|
||||
|
||||
if (xctx1->getAccessibleName() != xctx2->getAccessibleName())
|
||||
return false;
|
||||
|
||||
if (xctx1->getAccessibleDescription() != xctx2->getAccessibleDescription())
|
||||
return false;
|
||||
|
||||
if (xctx1->getAccessibleChildCount() != xctx2->getAccessibleChildCount())
|
||||
return false;
|
||||
|
||||
/* this one was not in the Java version */
|
||||
if (xctx1->getAccessibleIndexInParent() != xctx2->getAccessibleIndexInParent())
|
||||
return false;
|
||||
|
||||
return equals(xctx1->getAccessibleParent(), xctx2->getAccessibleParent());
|
||||
}
|
||||
|
||||
bool AccessibilityTools::equals(const uno::Reference<accessibility::XAccessibleStateSet>& xsts1,
|
||||
const uno::Reference<accessibility::XAccessibleStateSet>& xsts2)
|
||||
{
|
||||
if (!xsts1.is() || !xsts2.is())
|
||||
return xsts1.is() == xsts2.is();
|
||||
return xsts1->getStates() == xsts2->getStates();
|
||||
}
|
||||
|
||||
OUString AccessibilityTools::getRoleName(const sal_Int16 role)
|
||||
{
|
||||
switch (role)
|
||||
{
|
||||
case accessibility::AccessibleRole::UNKNOWN:
|
||||
return "UNKNOWN";
|
||||
case accessibility::AccessibleRole::ALERT:
|
||||
return "ALERT";
|
||||
case accessibility::AccessibleRole::BUTTON_DROPDOWN:
|
||||
return "BUTTON_DROPDOWN";
|
||||
case accessibility::AccessibleRole::BUTTON_MENU:
|
||||
return "BUTTON_MENU";
|
||||
case accessibility::AccessibleRole::CANVAS:
|
||||
return "CANVAS";
|
||||
case accessibility::AccessibleRole::CAPTION:
|
||||
return "CAPTION";
|
||||
case accessibility::AccessibleRole::CHART:
|
||||
return "CHART";
|
||||
case accessibility::AccessibleRole::CHECK_BOX:
|
||||
return "CHECK_BOX";
|
||||
case accessibility::AccessibleRole::CHECK_MENU_ITEM:
|
||||
return "CHECK_MENU_ITEM";
|
||||
case accessibility::AccessibleRole::COLOR_CHOOSER:
|
||||
return "COLOR_CHOOSER";
|
||||
case accessibility::AccessibleRole::COLUMN_HEADER:
|
||||
return "COLUMN_HEADER";
|
||||
case accessibility::AccessibleRole::COMBO_BOX:
|
||||
return "COMBO_BOX";
|
||||
case accessibility::AccessibleRole::COMMENT:
|
||||
return "COMMENT";
|
||||
case accessibility::AccessibleRole::COMMENT_END:
|
||||
return "COMMENT_END";
|
||||
case accessibility::AccessibleRole::DATE_EDITOR:
|
||||
return "DATE_EDITOR";
|
||||
case accessibility::AccessibleRole::DESKTOP_ICON:
|
||||
return "DESKTOP_ICON";
|
||||
case accessibility::AccessibleRole::DESKTOP_PANE:
|
||||
return "DESKTOP_PANE";
|
||||
case accessibility::AccessibleRole::DIALOG:
|
||||
return "DIALOG";
|
||||
case accessibility::AccessibleRole::DIRECTORY_PANE:
|
||||
return "DIRECTORY_PANE";
|
||||
case accessibility::AccessibleRole::DOCUMENT:
|
||||
return "DOCUMENT";
|
||||
case accessibility::AccessibleRole::DOCUMENT_PRESENTATION:
|
||||
return "DOCUMENT_PRESENTATION";
|
||||
case accessibility::AccessibleRole::DOCUMENT_SPREADSHEET:
|
||||
return "DOCUMENT_SPREADSHEET";
|
||||
case accessibility::AccessibleRole::DOCUMENT_TEXT:
|
||||
return "DOCUMENT_TEXT";
|
||||
case accessibility::AccessibleRole::EDIT_BAR:
|
||||
return "EDIT_BAR";
|
||||
case accessibility::AccessibleRole::EMBEDDED_OBJECT:
|
||||
return "EMBEDDED_OBJECT";
|
||||
case accessibility::AccessibleRole::END_NOTE:
|
||||
return "END_NOTE";
|
||||
case accessibility::AccessibleRole::FILE_CHOOSER:
|
||||
return "FILE_CHOOSER";
|
||||
case accessibility::AccessibleRole::FILLER:
|
||||
return "FILLER";
|
||||
case accessibility::AccessibleRole::FONT_CHOOSER:
|
||||
return "FONT_CHOOSER";
|
||||
case accessibility::AccessibleRole::FOOTER:
|
||||
return "FOOTER";
|
||||
case accessibility::AccessibleRole::FOOTNOTE:
|
||||
return "FOOTNOTE";
|
||||
case accessibility::AccessibleRole::FORM:
|
||||
return "FORM";
|
||||
case accessibility::AccessibleRole::FRAME:
|
||||
return "FRAME";
|
||||
case accessibility::AccessibleRole::GLASS_PANE:
|
||||
return "GLASS_PANE";
|
||||
case accessibility::AccessibleRole::GRAPHIC:
|
||||
return "GRAPHIC";
|
||||
case accessibility::AccessibleRole::GROUP_BOX:
|
||||
return "GROUP_BOX";
|
||||
case accessibility::AccessibleRole::HEADER:
|
||||
return "HEADER";
|
||||
case accessibility::AccessibleRole::HEADING:
|
||||
return "HEADING";
|
||||
case accessibility::AccessibleRole::HYPER_LINK:
|
||||
return "HYPER_LINK";
|
||||
case accessibility::AccessibleRole::ICON:
|
||||
return "ICON";
|
||||
case accessibility::AccessibleRole::IMAGE_MAP:
|
||||
return "IMAGE_MAP";
|
||||
case accessibility::AccessibleRole::INTERNAL_FRAME:
|
||||
return "INTERNAL_FRAME";
|
||||
case accessibility::AccessibleRole::LABEL:
|
||||
return "LABEL";
|
||||
case accessibility::AccessibleRole::LAYERED_PANE:
|
||||
return "LAYERED_PANE";
|
||||
case accessibility::AccessibleRole::LIST:
|
||||
return "LIST";
|
||||
case accessibility::AccessibleRole::LIST_ITEM:
|
||||
return "LIST_ITEM";
|
||||
case accessibility::AccessibleRole::MENU:
|
||||
return "MENU";
|
||||
case accessibility::AccessibleRole::MENU_BAR:
|
||||
return "MENU_BAR";
|
||||
case accessibility::AccessibleRole::MENU_ITEM:
|
||||
return "MENU_ITEM";
|
||||
case accessibility::AccessibleRole::NOTE:
|
||||
return "NOTE";
|
||||
case accessibility::AccessibleRole::OPTION_PANE:
|
||||
return "OPTION_PANE";
|
||||
case accessibility::AccessibleRole::PAGE:
|
||||
return "PAGE";
|
||||
case accessibility::AccessibleRole::PAGE_TAB:
|
||||
return "PAGE_TAB";
|
||||
case accessibility::AccessibleRole::PAGE_TAB_LIST:
|
||||
return "PAGE_TAB_LIST";
|
||||
case accessibility::AccessibleRole::PANEL:
|
||||
return "PANEL";
|
||||
case accessibility::AccessibleRole::PARAGRAPH:
|
||||
return "PARAGRAPH";
|
||||
case accessibility::AccessibleRole::PASSWORD_TEXT:
|
||||
return "PASSWORD_TEXT";
|
||||
case accessibility::AccessibleRole::POPUP_MENU:
|
||||
return "POPUP_MENU";
|
||||
case accessibility::AccessibleRole::PROGRESS_BAR:
|
||||
return "PROGRESS_BAR";
|
||||
case accessibility::AccessibleRole::PUSH_BUTTON:
|
||||
return "PUSH_BUTTON";
|
||||
case accessibility::AccessibleRole::RADIO_BUTTON:
|
||||
return "RADIO_BUTTON";
|
||||
case accessibility::AccessibleRole::RADIO_MENU_ITEM:
|
||||
return "RADIO_MENU_ITEM";
|
||||
case accessibility::AccessibleRole::ROOT_PANE:
|
||||
return "ROOT_PANE";
|
||||
case accessibility::AccessibleRole::ROW_HEADER:
|
||||
return "ROW_HEADER";
|
||||
case accessibility::AccessibleRole::RULER:
|
||||
return "RULER";
|
||||
case accessibility::AccessibleRole::SCROLL_BAR:
|
||||
return "SCROLL_BAR";
|
||||
case accessibility::AccessibleRole::SCROLL_PANE:
|
||||
return "SCROLL_PANE";
|
||||
case accessibility::AccessibleRole::SECTION:
|
||||
return "SECTION";
|
||||
case accessibility::AccessibleRole::SEPARATOR:
|
||||
return "SEPARATOR";
|
||||
case accessibility::AccessibleRole::SHAPE:
|
||||
return "SHAPE";
|
||||
case accessibility::AccessibleRole::SLIDER:
|
||||
return "SLIDER";
|
||||
case accessibility::AccessibleRole::SPIN_BOX:
|
||||
return "SPIN_BOX";
|
||||
case accessibility::AccessibleRole::SPLIT_PANE:
|
||||
return "SPLIT_PANE";
|
||||
case accessibility::AccessibleRole::STATIC:
|
||||
return "STATIC";
|
||||
case accessibility::AccessibleRole::STATUS_BAR:
|
||||
return "STATUS_BAR";
|
||||
case accessibility::AccessibleRole::TABLE:
|
||||
return "TABLE";
|
||||
case accessibility::AccessibleRole::TABLE_CELL:
|
||||
return "TABLE_CELL";
|
||||
case accessibility::AccessibleRole::TEXT:
|
||||
return "TEXT";
|
||||
case accessibility::AccessibleRole::TEXT_FRAME:
|
||||
return "TEXT_FRAME";
|
||||
case accessibility::AccessibleRole::TOGGLE_BUTTON:
|
||||
return "TOGGLE_BUTTON";
|
||||
case accessibility::AccessibleRole::TOOL_BAR:
|
||||
return "TOOL_BAR";
|
||||
case accessibility::AccessibleRole::TOOL_TIP:
|
||||
return "TOOL_TIP";
|
||||
case accessibility::AccessibleRole::TREE:
|
||||
return "TREE";
|
||||
case accessibility::AccessibleRole::TREE_ITEM:
|
||||
return "TREE_ITEM";
|
||||
case accessibility::AccessibleRole::TREE_TABLE:
|
||||
return "TREE_TABLE";
|
||||
case accessibility::AccessibleRole::VIEW_PORT:
|
||||
return "VIEW_PORT";
|
||||
case accessibility::AccessibleRole::WINDOW:
|
||||
return "WINDOW";
|
||||
};
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
OUString AccessibilityTools::getStateName(const sal_Int16 state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case accessibility::AccessibleStateType::ACTIVE:
|
||||
return "ACTIVE";
|
||||
case accessibility::AccessibleStateType::ARMED:
|
||||
return "ARMED";
|
||||
case accessibility::AccessibleStateType::BUSY:
|
||||
return "BUSY";
|
||||
case accessibility::AccessibleStateType::CHECKED:
|
||||
return "CHECKED";
|
||||
case accessibility::AccessibleStateType::COLLAPSE:
|
||||
return "COLLAPSE";
|
||||
case accessibility::AccessibleStateType::DEFAULT:
|
||||
return "DEFAULT";
|
||||
case accessibility::AccessibleStateType::DEFUNC:
|
||||
return "DEFUNC";
|
||||
case accessibility::AccessibleStateType::EDITABLE:
|
||||
return "EDITABLE";
|
||||
case accessibility::AccessibleStateType::ENABLED:
|
||||
return "ENABLED";
|
||||
case accessibility::AccessibleStateType::EXPANDABLE:
|
||||
return "EXPANDABLE";
|
||||
case accessibility::AccessibleStateType::EXPANDED:
|
||||
return "EXPANDED";
|
||||
case accessibility::AccessibleStateType::FOCUSABLE:
|
||||
return "FOCUSABLE";
|
||||
case accessibility::AccessibleStateType::FOCUSED:
|
||||
return "FOCUSED";
|
||||
case accessibility::AccessibleStateType::HORIZONTAL:
|
||||
return "HORIZONTAL";
|
||||
case accessibility::AccessibleStateType::ICONIFIED:
|
||||
return "ICONIFIED";
|
||||
case accessibility::AccessibleStateType::INDETERMINATE:
|
||||
return "INDETERMINATE";
|
||||
case accessibility::AccessibleStateType::INVALID:
|
||||
return "INVALID";
|
||||
case accessibility::AccessibleStateType::MANAGES_DESCENDANTS:
|
||||
return "MANAGES_DESCENDANTS";
|
||||
case accessibility::AccessibleStateType::MODAL:
|
||||
return "MODAL";
|
||||
case accessibility::AccessibleStateType::MOVEABLE:
|
||||
return "MOVEABLE";
|
||||
case accessibility::AccessibleStateType::MULTI_LINE:
|
||||
return "MULTI_LINE";
|
||||
case accessibility::AccessibleStateType::MULTI_SELECTABLE:
|
||||
return "MULTI_SELECTABLE";
|
||||
case accessibility::AccessibleStateType::OFFSCREEN:
|
||||
return "OFFSCREEN";
|
||||
case accessibility::AccessibleStateType::OPAQUE:
|
||||
return "OPAQUE";
|
||||
case accessibility::AccessibleStateType::PRESSED:
|
||||
return "PRESSED";
|
||||
case accessibility::AccessibleStateType::RESIZABLE:
|
||||
return "RESIZABLE";
|
||||
case accessibility::AccessibleStateType::SELECTABLE:
|
||||
return "SELECTABLE";
|
||||
case accessibility::AccessibleStateType::SELECTED:
|
||||
return "SELECTED";
|
||||
case accessibility::AccessibleStateType::SENSITIVE:
|
||||
return "SENSITIVE";
|
||||
case accessibility::AccessibleStateType::SHOWING:
|
||||
return "SHOWING";
|
||||
case accessibility::AccessibleStateType::SINGLE_LINE:
|
||||
return "SINGLE_LINE";
|
||||
case accessibility::AccessibleStateType::STALE:
|
||||
return "STALE";
|
||||
case accessibility::AccessibleStateType::TRANSIENT:
|
||||
return "TRANSIENT";
|
||||
case accessibility::AccessibleStateType::VERTICAL:
|
||||
return "VERTICAL";
|
||||
case accessibility::AccessibleStateType::VISIBLE:
|
||||
return "VISIBLE";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
OUString AccessibilityTools::getEventIdName(const sal_Int16 event_id)
|
||||
{
|
||||
switch (event_id)
|
||||
{
|
||||
case accessibility::AccessibleEventId::ACTION_CHANGED:
|
||||
return "ACTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::ACTIVE_DESCENDANT_CHANGED:
|
||||
return "ACTIVE_DESCENDANT_CHANGED";
|
||||
case accessibility::AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS:
|
||||
return "ACTIVE_DESCENDANT_CHANGED_NOFOCUS";
|
||||
case accessibility::AccessibleEventId::BOUNDRECT_CHANGED:
|
||||
return "BOUNDRECT_CHANGED";
|
||||
case accessibility::AccessibleEventId::CARET_CHANGED:
|
||||
return "CARET_CHANGED";
|
||||
case accessibility::AccessibleEventId::CHILD:
|
||||
return "CHILD";
|
||||
case accessibility::AccessibleEventId::COLUMN_CHANGED:
|
||||
return "COLUMN_CHANGED";
|
||||
case accessibility::AccessibleEventId::CONTENT_FLOWS_FROM_RELATION_CHANGED:
|
||||
return "CONTENT_FLOWS_FROM_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::CONTENT_FLOWS_TO_RELATION_CHANGED:
|
||||
return "CONTENT_FLOWS_TO_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::CONTROLLED_BY_RELATION_CHANGED:
|
||||
return "CONTROLLED_BY_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::CONTROLLER_FOR_RELATION_CHANGED:
|
||||
return "CONTROLLER_FOR_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::DESCRIPTION_CHANGED:
|
||||
return "DESCRIPTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::HYPERTEXT_CHANGED:
|
||||
return "HYPERTEXT_CHANGED";
|
||||
case accessibility::AccessibleEventId::INVALIDATE_ALL_CHILDREN:
|
||||
return "INVALIDATE_ALL_CHILDREN";
|
||||
case accessibility::AccessibleEventId::LABELED_BY_RELATION_CHANGED:
|
||||
return "LABELED_BY_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::LABEL_FOR_RELATION_CHANGED:
|
||||
return "LABEL_FOR_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::LISTBOX_ENTRY_COLLAPSED:
|
||||
return "LISTBOX_ENTRY_COLLAPSED";
|
||||
case accessibility::AccessibleEventId::LISTBOX_ENTRY_EXPANDED:
|
||||
return "LISTBOX_ENTRY_EXPANDED";
|
||||
case accessibility::AccessibleEventId::MEMBER_OF_RELATION_CHANGED:
|
||||
return "MEMBER_OF_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::NAME_CHANGED:
|
||||
return "NAME_CHANGED";
|
||||
case accessibility::AccessibleEventId::PAGE_CHANGED:
|
||||
return "PAGE_CHANGED";
|
||||
case accessibility::AccessibleEventId::ROLE_CHANGED:
|
||||
return "ROLE_CHANGED";
|
||||
case accessibility::AccessibleEventId::SECTION_CHANGED:
|
||||
return "SECTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::SELECTION_CHANGED:
|
||||
return "SELECTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::SELECTION_CHANGED_ADD:
|
||||
return "SELECTION_CHANGED_ADD";
|
||||
case accessibility::AccessibleEventId::SELECTION_CHANGED_REMOVE:
|
||||
return "SELECTION_CHANGED_REMOVE";
|
||||
case accessibility::AccessibleEventId::SELECTION_CHANGED_WITHIN:
|
||||
return "SELECTION_CHANGED_WITHIN";
|
||||
case accessibility::AccessibleEventId::STATE_CHANGED:
|
||||
return "STATE_CHANGED";
|
||||
case accessibility::AccessibleEventId::SUB_WINDOW_OF_RELATION_CHANGED:
|
||||
return "SUB_WINDOW_OF_RELATION_CHANGED";
|
||||
case accessibility::AccessibleEventId::TABLE_CAPTION_CHANGED:
|
||||
return "TABLE_CAPTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::TABLE_COLUMN_DESCRIPTION_CHANGED:
|
||||
return "TABLE_COLUMN_DESCRIPTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::TABLE_COLUMN_HEADER_CHANGED:
|
||||
return "TABLE_COLUMN_HEADER_CHANGED";
|
||||
case accessibility::AccessibleEventId::TABLE_MODEL_CHANGED:
|
||||
return "TABLE_MODEL_CHANGED";
|
||||
case accessibility::AccessibleEventId::TABLE_ROW_DESCRIPTION_CHANGED:
|
||||
return "TABLE_ROW_DESCRIPTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::TABLE_ROW_HEADER_CHANGED:
|
||||
return "TABLE_ROW_HEADER_CHANGED";
|
||||
case accessibility::AccessibleEventId::TABLE_SUMMARY_CHANGED:
|
||||
return "TABLE_SUMMARY_CHANGED";
|
||||
case accessibility::AccessibleEventId::TEXT_ATTRIBUTE_CHANGED:
|
||||
return "TEXT_ATTRIBUTE_CHANGED";
|
||||
case accessibility::AccessibleEventId::TEXT_CHANGED:
|
||||
return "TEXT_CHANGED";
|
||||
case accessibility::AccessibleEventId::TEXT_SELECTION_CHANGED:
|
||||
return "TEXT_SELECTION_CHANGED";
|
||||
case accessibility::AccessibleEventId::VALUE_CHANGED:
|
||||
return "VALUE_CHANGED";
|
||||
case accessibility::AccessibleEventId::VISIBLE_DATA_CHANGED:
|
||||
return "VISIBLE_DATA_CHANGED";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
OUString AccessibilityTools::debugName(accessibility::XAccessibleContext* ctx)
|
||||
{
|
||||
return "role=" + AccessibilityTools::getRoleName(ctx->getAccessibleRole()) + " name=\""
|
||||
+ ctx->getAccessibleName() + "\" description=\"" + ctx->getAccessibleDescription()
|
||||
+ "\"";
|
||||
}
|
||||
|
||||
OUString AccessibilityTools::debugName(accessibility::XAccessible* acc)
|
||||
{
|
||||
return debugName(acc->getAccessibleContext().get());
|
||||
}
|
||||
|
||||
OUString AccessibilityTools::debugName(accessibility::XAccessibleStateSet* xsts)
|
||||
{
|
||||
OUString name;
|
||||
|
||||
for (auto state : xsts->getStates())
|
||||
{
|
||||
if (name.getLength())
|
||||
name += " | ";
|
||||
name += AccessibilityTools::getStateName(state);
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
OUString AccessibilityTools::debugName(const accessibility::AccessibleEventObject* evobj)
|
||||
{
|
||||
return "(AccessibleEventObject) { id=" + getEventIdName(evobj->EventId)
|
||||
+ " old=" + evobj->OldValue.getValueTypeName()
|
||||
+ " new=" + evobj->NewValue.getValueTypeName() + " }";
|
||||
}
|
||||
|
||||
bool AccessibilityTools::Await(const std::function<bool()>& cUntilCallback, sal_uInt64 nTimeoutMs)
|
||||
{
|
||||
bool success = false;
|
||||
Timer aTimer("wait for event");
|
||||
aTimer.SetTimeout(nTimeoutMs);
|
||||
aTimer.Start();
|
||||
do
|
||||
{
|
||||
Scheduler::ProcessEventsToIdle();
|
||||
success = cUntilCallback();
|
||||
} while (!success && aTimer.IsActive());
|
||||
SAL_WARN_IF(!success, "test", "timeout reached");
|
||||
return success;
|
||||
}
|
||||
|
||||
void AccessibilityTools::Wait(sal_uInt64 nTimeoutMs)
|
||||
{
|
||||
Timer aTimer("wait for event");
|
||||
aTimer.SetTimeout(nTimeoutMs);
|
||||
aTimer.Start();
|
||||
std::cout << "waiting for " << nTimeoutMs << "ms... ";
|
||||
do
|
||||
{
|
||||
Scheduler::ProcessEventsToIdle();
|
||||
} while (aTimer.IsActive());
|
||||
std::cout << "ok." << std::endl;
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,158 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
#include <cppunit/TestAssert.h>
|
||||
|
||||
#include <com/sun/star/accessibility/AccessibleEventObject.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessible.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleStateSet.hpp>
|
||||
|
||||
class AccessibilityTools
|
||||
{
|
||||
public:
|
||||
/** Maximum number of children to work on. This is especially useful for
|
||||
* Calc which has a million elements, if not more. */
|
||||
static const sal_Int32 MAX_CHILDREN = 500;
|
||||
|
||||
static css::uno::Reference<css::accessibility::XAccessibleContext>
|
||||
getAccessibleObjectForRole(const css::uno::Reference<css::accessibility::XAccessible>& xacc,
|
||||
sal_Int16 role);
|
||||
|
||||
static bool equals(const css::uno::Reference<css::accessibility::XAccessible>& xacc1,
|
||||
const css::uno::Reference<css::accessibility::XAccessible>& xacc2);
|
||||
static bool equals(const css::uno::Reference<css::accessibility::XAccessibleContext>& xctx1,
|
||||
const css::uno::Reference<css::accessibility::XAccessibleContext>& xctx2);
|
||||
static bool equals(const css::uno::Reference<css::accessibility::XAccessibleStateSet>& xsts1,
|
||||
const css::uno::Reference<css::accessibility::XAccessibleStateSet>& xsts2);
|
||||
|
||||
static OUString getRoleName(const sal_Int16 role);
|
||||
static OUString getStateName(const sal_Int16 state);
|
||||
static OUString getEventIdName(const sal_Int16 event_id);
|
||||
|
||||
template <typename T> static std::string debugString(const css::uno::Reference<T>& x)
|
||||
{
|
||||
return debugString(x.get());
|
||||
}
|
||||
|
||||
template <typename T> static std::string debugString(const T& x) { return debugString(&x); }
|
||||
|
||||
template <typename T> static std::string debugString(const T* p)
|
||||
{
|
||||
/* only the forwarding to debugName() might actually dereference @c p,
|
||||
* and we rely on specializations to be as constant as possible and not
|
||||
* violate the cast here. In practice it'll be the case for all types
|
||||
* handle if we carefully write the specializations. In most case the
|
||||
* specialization could take a const itself if the methods were
|
||||
* properly marked const, but well. */
|
||||
return debugString(const_cast<T*>(p));
|
||||
}
|
||||
|
||||
template <typename T> static std::string debugString(T* p)
|
||||
{
|
||||
CPPUNIT_NS::OStringStream ost;
|
||||
|
||||
ost << "(" << static_cast<const void*>(p) << ")";
|
||||
if (p != nullptr)
|
||||
ost << " " << debugName(p);
|
||||
|
||||
return ost.str();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Process events until a condition or a timeout
|
||||
* @param cUntilCallback Callback condition
|
||||
* @param nTimeoutMs Maximum time in ms to wait for condition
|
||||
* @returns @c true if the condition was met, or @c false if the timeout
|
||||
* has been reached.
|
||||
*
|
||||
* Processes events until idle, and either until the given condition
|
||||
* becomes @c true or a timeout is reached.
|
||||
*
|
||||
* This is similar to Scheduler::ProcessEventsToIdle() but awaits a
|
||||
* condition up to a timeout. This is useful if the waited-on condition
|
||||
* might happen after the first idle time. The timeout helps in case the
|
||||
* condition is not satisfied in reasonable time.
|
||||
*
|
||||
* @p cUntilCallback is called each time the scheduler reaches idle to check
|
||||
* whether the condition is met.
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
* ProcessEvents([&]() { return taskHasRun; });
|
||||
* @endcode
|
||||
*
|
||||
* @see Scheduler::ProcessEventsToIdle()
|
||||
*/
|
||||
static bool Await(const std::function<bool()>& cUntilCallback, sal_uInt64 nTimeoutMs = 3000);
|
||||
|
||||
/**
|
||||
* @brief Process events for a given time
|
||||
* @param nTimeoutMs Time to dispatch events for
|
||||
*
|
||||
* Process events for a given time. This can be useful if waiting is in
|
||||
* order but there is no actual condition to wait on (e.g. expect
|
||||
* something *not* to happen). This similar in spirit to
|
||||
* @c sleep(nTimeoutMs), but dispatches events during the wait.
|
||||
*
|
||||
* This function should be used sparsely because waiting a given time is
|
||||
* rarely a good solution for a problem, but in some specific situations
|
||||
* there is no better alternative (like, again, waiting for something not
|
||||
* to happen).
|
||||
*/
|
||||
static void Wait(sal_uInt64 nTimeoutMs);
|
||||
|
||||
private:
|
||||
static OUString debugName(css::accessibility::XAccessibleContext* xctx);
|
||||
static OUString debugName(css::accessibility::XAccessible* xacc);
|
||||
static OUString debugName(css::accessibility::XAccessibleStateSet* xsts);
|
||||
static OUString debugName(const css::accessibility::AccessibleEventObject* evobj);
|
||||
};
|
||||
|
||||
CPPUNIT_NS_BEGIN
|
||||
/* How to generate those automatically? We don't want to match all types
|
||||
* not to mess up cppunit for types we don't support */
|
||||
#define AT_ASSERTION_TRAITS(T) \
|
||||
template <> struct assertion_traits<css::uno::Reference<T>> \
|
||||
{ \
|
||||
static bool equal(const css::uno::Reference<T>& x, const css::uno::Reference<T>& y) \
|
||||
{ \
|
||||
return AccessibilityTools::equals(x, y); \
|
||||
} \
|
||||
\
|
||||
static std::string toString(const css::uno::Reference<T>& x) \
|
||||
{ \
|
||||
return AccessibilityTools::debugString(x); \
|
||||
} \
|
||||
}
|
||||
|
||||
AT_ASSERTION_TRAITS(css::accessibility::XAccessible);
|
||||
AT_ASSERTION_TRAITS(css::accessibility::XAccessibleContext);
|
||||
AT_ASSERTION_TRAITS(css::accessibility::XAccessibleStateSet);
|
||||
|
||||
#undef AT_ASSERTION_TRAITS
|
||||
|
||||
CPPUNIT_NS_END
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,184 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <com/sun/star/accessibility/AccessibleRole.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessible.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
#include <com/sun/star/awt/XWindow.hpp>
|
||||
#include <com/sun/star/awt/XTopWindow.hpp>
|
||||
#include <com/sun/star/beans/PropertyValue.hpp>
|
||||
#include <com/sun/star/frame/Desktop.hpp>
|
||||
#include <com/sun/star/frame/XFrame.hpp>
|
||||
#include <com/sun/star/lang/XComponent.hpp>
|
||||
#include <com/sun/star/lang/XServiceInfo.hpp>
|
||||
#include <com/sun/star/uno/Reference.hxx>
|
||||
#include <com/sun/star/util/XCloseable.hpp>
|
||||
|
||||
#include <comphelper/sequence.hxx>
|
||||
#include <rtl/ustrbuf.hxx>
|
||||
#include <test/bootstrapfixture.hxx>
|
||||
#include <vcl/scheduler.hxx>
|
||||
|
||||
#include "AccessibilityTools.hxx"
|
||||
#include "XAccessibleComponentTester.hxx"
|
||||
#include "XAccessibleContextTester.hxx"
|
||||
#include "XAccessibleExtendedComponentTester.hxx"
|
||||
#include "XAccessibleEventBroadcasterTester.hxx"
|
||||
|
||||
using namespace css;
|
||||
|
||||
namespace
|
||||
{
|
||||
class AccessibleStatusBarTest : public test::BootstrapFixture
|
||||
{
|
||||
private:
|
||||
uno::Reference<frame::XDesktop2> mxDesktop;
|
||||
|
||||
uno::Reference<accessibility::XAccessibleContext>
|
||||
getTestObject(const uno::Reference<awt::XWindow>& xWindow);
|
||||
void runAllTests(const uno::Reference<awt::XWindow>& xWindow);
|
||||
uno::Reference<lang::XComponent> openDocument(std::string_view sKind);
|
||||
void testDocument(std::string_view sKind);
|
||||
|
||||
void testWriterDoc() { testDocument("swriter"); }
|
||||
void testMathDoc() { testDocument("smath"); }
|
||||
void testDrawDoc() { testDocument("sdraw"); }
|
||||
void testImpressDoc() { testDocument("simpress"); }
|
||||
void testCalcDoc() { testDocument("scalc"); }
|
||||
|
||||
public:
|
||||
virtual void setUp() override;
|
||||
|
||||
CPPUNIT_TEST_SUITE(AccessibleStatusBarTest);
|
||||
CPPUNIT_TEST(testWriterDoc);
|
||||
CPPUNIT_TEST(testMathDoc);
|
||||
CPPUNIT_TEST(testDrawDoc);
|
||||
CPPUNIT_TEST(testImpressDoc);
|
||||
CPPUNIT_TEST(testCalcDoc);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
};
|
||||
|
||||
void AccessibleStatusBarTest::setUp()
|
||||
{
|
||||
test::BootstrapFixture::setUp();
|
||||
|
||||
mxDesktop = frame::Desktop::create(mxComponentContext);
|
||||
}
|
||||
|
||||
uno::Reference<accessibility::XAccessibleContext>
|
||||
AccessibleStatusBarTest::getTestObject(const uno::Reference<awt::XWindow>& xWindow)
|
||||
{
|
||||
uno::Reference<accessibility::XAccessible> xAccessible(xWindow, uno::UNO_QUERY_THROW);
|
||||
std::cout << "got accessible: " << xAccessible << std::endl;
|
||||
std::cout << "accessible name: " << AccessibilityTools::debugString(xAccessible) << std::endl;
|
||||
|
||||
auto xContext = AccessibilityTools::getAccessibleObjectForRole(
|
||||
xAccessible, accessibility::AccessibleRole::STATUS_BAR);
|
||||
std::cout << "got context: " << xContext << std::endl;
|
||||
std::cout << "context name: " << AccessibilityTools::debugString(xContext) << std::endl;
|
||||
|
||||
Scheduler::ProcessEventsToIdle(); // not sure why?
|
||||
|
||||
uno::Reference<lang::XServiceInfo> xSI(xContext, uno::UNO_QUERY_THROW);
|
||||
std::cout << "implementation name: " << xSI->getImplementationName() << std::endl;
|
||||
auto serviceNames = xSI->getSupportedServiceNames();
|
||||
std::cout << "has " << serviceNames.size() << " services:" << std::endl;
|
||||
for (auto& service : serviceNames)
|
||||
std::cout << " * service: " << service << std::endl;
|
||||
|
||||
return xContext;
|
||||
}
|
||||
|
||||
void AccessibleStatusBarTest::runAllTests(const uno::Reference<awt::XWindow>& xWindow)
|
||||
{
|
||||
auto xContext = getTestObject(xWindow);
|
||||
|
||||
uno::Reference<accessibility::XAccessibleComponent> xAccessibleComponent(xContext,
|
||||
uno::UNO_QUERY_THROW);
|
||||
XAccessibleComponentTester componentTester(xAccessibleComponent);
|
||||
componentTester.testAll();
|
||||
|
||||
XAccessibleContextTester contextTester(xContext);
|
||||
contextTester.testAll();
|
||||
|
||||
uno::Reference<accessibility::XAccessibleExtendedComponent> xAccessibleExtendedComponent(
|
||||
xContext, uno::UNO_QUERY_THROW);
|
||||
XAccessibleExtendedComponentTester extendedComponentTester(xAccessibleExtendedComponent);
|
||||
extendedComponentTester.testAll();
|
||||
|
||||
uno::Reference<accessibility::XAccessibleEventBroadcaster> xAccessibleEventBroadcaster(
|
||||
xContext, uno::UNO_QUERY_THROW);
|
||||
XAccessibleEventBroadcasterTester eventBroadcasterTester(xAccessibleEventBroadcaster, xWindow);
|
||||
eventBroadcasterTester.testAll();
|
||||
}
|
||||
|
||||
uno::Reference<lang::XComponent> AccessibleStatusBarTest::openDocument(std::string_view sKind)
|
||||
{
|
||||
/* not sure what's that about, but from SOfficeFactory.java:openDoc() */
|
||||
// that noargs thing for load attributes
|
||||
std::vector<beans::PropertyValue> aArgs;
|
||||
if (sKind == "simpress")
|
||||
{
|
||||
beans::PropertyValue aValue;
|
||||
aValue.Name = "OpenFlags";
|
||||
aValue.Handle = -1;
|
||||
aValue.Value <<= OUString("S");
|
||||
aValue.State = beans::PropertyState_DIRECT_VALUE;
|
||||
aArgs.push_back(aValue);
|
||||
}
|
||||
|
||||
rtl::OUStringBuffer sURL("private:factory/");
|
||||
sURL.appendAscii(sKind.data(), sKind.length());
|
||||
|
||||
return mxDesktop->loadComponentFromURL(sURL.makeStringAndClear(), "_blank", 40,
|
||||
comphelper::containerToSequence(aArgs));
|
||||
}
|
||||
|
||||
void AccessibleStatusBarTest::testDocument(std::string_view sKind)
|
||||
{
|
||||
auto xDoc = openDocument(sKind);
|
||||
std::cout << "got document: " << xDoc << std::endl;
|
||||
CPPUNIT_ASSERT(xDoc.is());
|
||||
uno::Reference<frame::XModel> xModel(xDoc, uno::UNO_QUERY_THROW);
|
||||
std::cout << "got model: " << xModel << std::endl;
|
||||
uno::Reference<awt::XWindow> xWindow(
|
||||
xModel->getCurrentController()->getFrame()->getContainerWindow());
|
||||
std::cout << "got window: " << xWindow << std::endl;
|
||||
uno::Reference<awt::XTopWindow> xTopWindow(xWindow, uno::UNO_QUERY_THROW);
|
||||
std::cout << "got top window: " << xTopWindow << std::endl;
|
||||
xTopWindow->toFront();
|
||||
|
||||
Scheduler::ProcessEventsToIdle();
|
||||
|
||||
runAllTests(xWindow);
|
||||
|
||||
// close document
|
||||
uno::Reference<css::util::XCloseable> xCloseable(xDoc, uno::UNO_QUERY_THROW);
|
||||
xCloseable->close(false);
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION(AccessibleStatusBarTest);
|
||||
} // namespace
|
||||
|
||||
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,290 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include "XAccessibleComponentTester.hxx"
|
||||
|
||||
#include <cppunit/TestAssert.h>
|
||||
|
||||
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessible.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
#include <com/sun/star/awt/Point.hpp>
|
||||
#include <com/sun/star/uno/Reference.hxx>
|
||||
|
||||
#include <tools/color.hxx>
|
||||
|
||||
#include "AccessibilityTools.hxx"
|
||||
|
||||
using namespace css;
|
||||
|
||||
/**
|
||||
* @brief Checks the component's bounds
|
||||
*
|
||||
* Checks the X and Y coordinates are non-negative, and that the width and
|
||||
* height are greater than 0.
|
||||
*
|
||||
* Coherence with @c getLocation() is tested in the test for the
|
||||
* latter.
|
||||
*/
|
||||
void XAccessibleComponentTester::testBounds()
|
||||
{
|
||||
auto bounds = mxComponent->getBounds();
|
||||
std::cout << "bounds: " << bounds.Width << "x" << bounds.Height << std::showpos << bounds.X
|
||||
<< bounds.Y << std::noshowpos << std::endl;
|
||||
CPPUNIT_ASSERT_GREATEREQUAL(0, bounds.X);
|
||||
CPPUNIT_ASSERT_GREATEREQUAL(0, bounds.Y);
|
||||
CPPUNIT_ASSERT_GREATER(0, bounds.Width);
|
||||
CPPUNIT_ASSERT_GREATER(0, bounds.Height);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tests results of XAccessibleComponent::getSize()
|
||||
*
|
||||
* Succeeds if the size is the same as in bounds.
|
||||
*/
|
||||
void XAccessibleComponentTester::testSize()
|
||||
{
|
||||
auto bounds = mxComponent->getBounds();
|
||||
auto size = mxComponent->getSize();
|
||||
CPPUNIT_ASSERT_EQUAL(bounds.Width, size.Width);
|
||||
CPPUNIT_ASSERT_EQUAL(bounds.Height, size.Height);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tests results of XAccessibleComponent::getBounds()
|
||||
*
|
||||
* First checks 4 inner bounds (upper, lower, left and right) of component
|
||||
* bounding box to contain at least one point of the component. Second 4 outer
|
||||
* bounds are checked to not contain any component points.
|
||||
*
|
||||
* Succeeds if inner bounds contain component points and outer bounds don't
|
||||
* contain any component points.
|
||||
*/
|
||||
void XAccessibleComponentTester::testContainsPoint()
|
||||
{
|
||||
auto bounds = mxComponent->getBounds();
|
||||
|
||||
/* upper end */
|
||||
int curX = 0;
|
||||
while (!mxComponent->containsPoint(awt::Point(curX, 0)) && curX < bounds.Width)
|
||||
curX++;
|
||||
CPPUNIT_ASSERT_MESSAGE("Upper bound of box contains no component points", curX < bounds.Width);
|
||||
std::cout << "Upper bound of box contains point (" << curX << ",0)" << std::endl;
|
||||
/* lower end */
|
||||
curX = 0;
|
||||
while (!mxComponent->containsPoint(awt::Point(curX, bounds.Height - 1)) && curX < bounds.Width)
|
||||
curX++;
|
||||
CPPUNIT_ASSERT_MESSAGE("Lower bound of box contains no component points", curX < bounds.Width);
|
||||
std::cout << "Lower bound of box contains point (" << curX << "," << (bounds.Height - 1) << ")"
|
||||
<< std::endl;
|
||||
/* left end */
|
||||
int curY = 0;
|
||||
while (!mxComponent->containsPoint(awt::Point(0, curY)) && curY < bounds.Height)
|
||||
curY++;
|
||||
CPPUNIT_ASSERT_MESSAGE("Left bound of box contains no component points", curY < bounds.Height);
|
||||
std::cout << "Left bound of box contains point (0," << curY << ")" << std::endl;
|
||||
/* right end */
|
||||
curY = 0;
|
||||
while (!mxComponent->containsPoint(awt::Point(bounds.Width - 1, curY)) && curY < bounds.Height)
|
||||
curY++;
|
||||
CPPUNIT_ASSERT_MESSAGE("Right bound of box contains no component points", curY < bounds.Height);
|
||||
std::cout << "Right bound of box contains point (" << (bounds.Width - 1) << "," << curY << ")"
|
||||
<< std::endl;
|
||||
/* no match outside the bounds */
|
||||
for (int x = -1; x <= bounds.Width; x++)
|
||||
{
|
||||
CPPUNIT_ASSERT_MESSAGE("Outer upper bound CONTAINS a component point",
|
||||
!mxComponent->containsPoint(awt::Point(x, -1)));
|
||||
CPPUNIT_ASSERT_MESSAGE("Outer lower bound CONTAINS a component point",
|
||||
!mxComponent->containsPoint(awt::Point(x, bounds.Height)));
|
||||
}
|
||||
for (int y = -1; y <= bounds.Height; y++)
|
||||
{
|
||||
CPPUNIT_ASSERT_MESSAGE("Outer left bound CONTAINS a component point",
|
||||
!mxComponent->containsPoint(awt::Point(-1, y)));
|
||||
CPPUNIT_ASSERT_MESSAGE("Outer right bound CONTAINS a component point",
|
||||
!mxComponent->containsPoint(awt::Point(bounds.Width, y)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tests results of XAccessibleComponent::getAccessibleAtPoint()
|
||||
*
|
||||
* Iterates through all children which implement
|
||||
* <code>XAccessibleComponent</code> (if they exist) determines their
|
||||
* boundaries and tries to get each child by <code>getAccessibleAtPoint</code>
|
||||
* passing point which belongs to the child.
|
||||
* Also the point is checked which doesn't belong to child boundary box.
|
||||
*
|
||||
* Succeeds if in the first cases the right children are returned, and in the
|
||||
* second <code>null</code> or another child is returned.
|
||||
*/
|
||||
void XAccessibleComponentTester::testAccessibleAtPoint()
|
||||
{
|
||||
int count = mxContext->getAccessibleChildCount();
|
||||
std::cout << "Found " << count << " children" << std::endl;
|
||||
for (int i = 0; i < count && i < AccessibilityTools::MAX_CHILDREN; i++)
|
||||
{
|
||||
auto child = mxContext->getAccessibleChild(i);
|
||||
uno::Reference<accessibility::XAccessibleContext> childContext(
|
||||
child->getAccessibleContext(), uno::UNO_SET_THROW);
|
||||
std::cout << "* Found child: " << AccessibilityTools::debugString(child) << std::endl;
|
||||
std::cout << " states: "
|
||||
<< AccessibilityTools::debugString(childContext->getAccessibleStateSet())
|
||||
<< std::endl;
|
||||
uno::Reference<accessibility::XAccessibleComponent> xChildComponent(childContext,
|
||||
uno::UNO_QUERY);
|
||||
std::cout << " component: " << xChildComponent << std::endl;
|
||||
if (!xChildComponent)
|
||||
continue;
|
||||
|
||||
auto childBounds = xChildComponent->getBounds();
|
||||
if (childBounds.X == -1)
|
||||
continue;
|
||||
std::cout << " bounds: " << childBounds.Width << "x" << childBounds.Height << std::showpos
|
||||
<< childBounds.X << childBounds.Y << std::noshowpos << std::endl;
|
||||
|
||||
std::cout << "finding the point which lies on the component" << std::endl;
|
||||
int curX = 0;
|
||||
int curY = 0;
|
||||
while (!xChildComponent->containsPoint(awt::Point(curX, curY)) && curX < childBounds.Width)
|
||||
{
|
||||
curX++;
|
||||
curY++;
|
||||
}
|
||||
if (curX >= childBounds.Width)
|
||||
{
|
||||
std::cout << "Couldn't find a point with contains" << std::endl;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Child found at point +" << childBounds.X + curX << "+"
|
||||
<< childBounds.Y + curY << std::endl;
|
||||
}
|
||||
|
||||
// trying the point laying on child
|
||||
auto xAccAtPoint
|
||||
= mxComponent->getAccessibleAtPoint(awt::Point(childBounds.X, childBounds.Y));
|
||||
CPPUNIT_ASSERT_MESSAGE("Child not found at point", xAccAtPoint.is());
|
||||
if (!AccessibilityTools::equals(child, xAccAtPoint))
|
||||
{
|
||||
auto idxExpected = childContext->getAccessibleIndexInParent();
|
||||
auto idxResult = xAccAtPoint->getAccessibleContext()->getAccessibleIndexInParent();
|
||||
std::cout << "The child found (" << AccessibilityTools::debugString(xAccAtPoint)
|
||||
<< ") is not the expected one (" << AccessibilityTools::debugString(child)
|
||||
<< ")" << std::endl;
|
||||
if (idxExpected < idxResult)
|
||||
{
|
||||
std::cout << "-- it probably is hidden behind? Skipping." << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("The child found is NOT the expected one", child,
|
||||
xAccAtPoint);
|
||||
}
|
||||
}
|
||||
|
||||
// trying the point NOT laying on child
|
||||
xAccAtPoint
|
||||
= mxComponent->getAccessibleAtPoint(awt::Point(childBounds.X - 1, childBounds.Y - 1));
|
||||
if (xAccAtPoint.is())
|
||||
{
|
||||
CPPUNIT_ASSERT_MESSAGE("Child found OUTSIDE its bounds",
|
||||
!AccessibilityTools::equals(child, xAccAtPoint));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tests reults of XAccessibleComponent::getLocation()
|
||||
*
|
||||
* Succeeds if the location is the same as location of boundary obtained by
|
||||
* the <code>getBounds()</code> method.
|
||||
*/
|
||||
void XAccessibleComponentTester::testLocation()
|
||||
{
|
||||
auto bounds = mxComponent->getBounds();
|
||||
auto location = mxComponent->getLocation();
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid X location", bounds.X, location.X);
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Y location", bounds.Y, location.Y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Tests results of XAccessibleComponent::getLocationOnScreen()
|
||||
* @returns @c true on success.
|
||||
*
|
||||
* Get the screen location of the component and its parent
|
||||
* (if it exists and supports <code>XAccessibleComponent</code>).
|
||||
*
|
||||
* Succeeds component screen location equals to screen location of its parent
|
||||
* plus location of the component relative to the parent.
|
||||
*/
|
||||
void XAccessibleComponentTester::testLocationOnScreen()
|
||||
{
|
||||
auto location = mxComponent->getLocationOnScreen();
|
||||
std::cout << "location on screen: +" << location.X << "+" << location.Y << std::endl;
|
||||
|
||||
auto xParent = mxContext->getAccessibleParent();
|
||||
if (!xParent.is())
|
||||
std::cout << "No parent" << std::endl;
|
||||
else
|
||||
{
|
||||
std::cout << "Found parent: " << AccessibilityTools::debugString(xParent) << std::endl;
|
||||
uno::Reference<accessibility::XAccessibleComponent> xParentComponent(
|
||||
xParent->getAccessibleContext(), uno::UNO_QUERY);
|
||||
if (!xParentComponent.is())
|
||||
std::cout << "Parent is not a Component" << std::endl;
|
||||
else
|
||||
{
|
||||
auto bounds = mxComponent->getBounds();
|
||||
auto parentLocation = xParentComponent->getLocationOnScreen();
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid X screen location", parentLocation.X + bounds.X,
|
||||
location.X);
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Y screen location", parentLocation.Y + bounds.Y,
|
||||
location.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Just calls the method.
|
||||
*/
|
||||
void XAccessibleComponentTester::testGrabFocus() { mxComponent->grabFocus(); }
|
||||
|
||||
/**
|
||||
* Just calls the method.
|
||||
*/
|
||||
void XAccessibleComponentTester::testGetForeground()
|
||||
{
|
||||
auto color = mxComponent->getForeground();
|
||||
std::cout << "foreground color: " << Color(ColorAlpha, color) << std::endl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Just calls the method.
|
||||
*/
|
||||
void XAccessibleComponentTester::testGetBackground()
|
||||
{
|
||||
auto color = mxComponent->getBackground();
|
||||
std::cout << "background color: " << Color(ColorAlpha, color) << std::endl;
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,66 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <com/sun/star/uno/Reference.hxx>
|
||||
#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
|
||||
#include "AccessibilityTools.hxx"
|
||||
|
||||
class XAccessibleComponentTester
|
||||
{
|
||||
private:
|
||||
const css::uno::Reference<css::accessibility::XAccessibleComponent> mxComponent;
|
||||
const css::uno::Reference<css::accessibility::XAccessibleContext> mxContext;
|
||||
|
||||
public:
|
||||
XAccessibleComponentTester(
|
||||
const css::uno::Reference<css::accessibility::XAccessibleComponent>& component)
|
||||
: mxComponent(component)
|
||||
, mxContext(component, css::uno::UNO_QUERY_THROW)
|
||||
{
|
||||
}
|
||||
|
||||
void testBounds();
|
||||
void testSize();
|
||||
void testContainsPoint();
|
||||
void testAccessibleAtPoint();
|
||||
void testLocation();
|
||||
void testLocationOnScreen();
|
||||
void testGrabFocus();
|
||||
void testGetForeground();
|
||||
void testGetBackground();
|
||||
|
||||
void testAll()
|
||||
{
|
||||
testBounds();
|
||||
testSize();
|
||||
testContainsPoint();
|
||||
testAccessibleAtPoint();
|
||||
testLocation();
|
||||
testLocationOnScreen();
|
||||
testGrabFocus();
|
||||
testGetForeground();
|
||||
testGetBackground();
|
||||
}
|
||||
};
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,164 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include "XAccessibleContextTester.hxx"
|
||||
|
||||
#include <cppunit/TestAssert.h>
|
||||
|
||||
#include <com/sun/star/uno/Reference.hxx>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
|
||||
#include "AccessibilityTools.hxx"
|
||||
|
||||
/**
|
||||
* @brief Tries to get every child and checks its parent.
|
||||
*
|
||||
* Checks that the parent of every child and the tested component are the same object.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleChild()
|
||||
{
|
||||
int count = mxContext->getAccessibleChildCount();
|
||||
for (int i = 0; i < count && i < AccessibilityTools::MAX_CHILDREN; i++)
|
||||
{
|
||||
auto child = mxContext->getAccessibleChild(i);
|
||||
auto childCtx = child->getAccessibleContext();
|
||||
|
||||
std::cout << " Child " << i << ": " << AccessibilityTools::debugString(childCtx)
|
||||
<< std::endl;
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("child's parent context is not parent's context!",
|
||||
childCtx->getAccessibleParent()->getAccessibleContext(),
|
||||
mxContext);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calls the method.
|
||||
*
|
||||
* Checks that the child count is non-negative.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleChildCount()
|
||||
{
|
||||
auto childCount = mxContext->getAccessibleChildCount();
|
||||
std::cout << childCount << " children found." << std::endl;
|
||||
CPPUNIT_ASSERT_GREATEREQUAL(0, childCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the accessible description of the component.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleDescription()
|
||||
{
|
||||
auto desc = mxContext->getAccessibleDescription();
|
||||
std::cout << "The description is '" << desc << "'" << std::endl;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Checks the index in parent
|
||||
*
|
||||
* Checks that the parent's child and the tested component are the same objects.
|
||||
*
|
||||
* Retrieves the index of tested component in its parent.
|
||||
* Then gets the parent's child by this index and compares
|
||||
* it with tested component.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleIndexInParent()
|
||||
{
|
||||
int idx = mxContext->getAccessibleIndexInParent();
|
||||
std::cout << "The index in parent is " << idx << std::endl;
|
||||
|
||||
auto parent = mxContext->getAccessibleParent();
|
||||
CPPUNIT_ASSERT(parent.is());
|
||||
auto parentCtx = parent->getAccessibleContext();
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("Parent's child context at our index is not us!", mxContext,
|
||||
parentCtx->getAccessibleChild(idx)->getAccessibleContext());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the accessible name of the component.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleName()
|
||||
{
|
||||
auto name = mxContext->getAccessibleName();
|
||||
std::cout << "The name is '" << name << "'" << std::endl;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Just gets the parent.
|
||||
*
|
||||
* Checks that the parent is not null.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleParent()
|
||||
{
|
||||
// assume that the component is not ROOT
|
||||
auto parent = mxContext->getAccessibleParent();
|
||||
std::cout << "The parent is " << AccessibilityTools::debugString(parent) << std::endl;
|
||||
CPPUNIT_ASSERT_MESSAGE("parent is not set", parent.is());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Just gets the relation set.
|
||||
*
|
||||
* Checks that the relation set is not null.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleRelationSet()
|
||||
{
|
||||
auto relSet = mxContext->getAccessibleRelationSet();
|
||||
CPPUNIT_ASSERT_MESSAGE("relation set is not set", relSet.is());
|
||||
}
|
||||
|
||||
/**
|
||||
* @breif Get the accessible role of component.
|
||||
*
|
||||
* Checks that the role is a non-negative number.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleRole()
|
||||
{
|
||||
sal_Int16 role = mxContext->getAccessibleRole();
|
||||
std::cout << "The role is " << role << " (" << AccessibilityTools::getRoleName(role) << ")"
|
||||
<< std::endl;
|
||||
CPPUNIT_ASSERT_GREATEREQUAL(static_cast<sal_Int16>(0), role);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Just gets the state set.
|
||||
*
|
||||
* Checks that the state set is not null.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetAccessibleStateSet()
|
||||
{
|
||||
auto stateSet = mxContext->getAccessibleStateSet();
|
||||
std::cout << "The state set is: " << AccessibilityTools::debugString(stateSet) << std::endl;
|
||||
CPPUNIT_ASSERT_MESSAGE("state set is not set", stateSet.is());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the locale.
|
||||
*
|
||||
* Checks that @c Country and @c Language fields of locale structure are not empty.
|
||||
*/
|
||||
void XAccessibleContextTester::testGetLocale()
|
||||
{
|
||||
auto loc = mxContext->getLocale();
|
||||
std::cout << "The locale is " << loc.Language << "," << loc.Country << std::endl;
|
||||
CPPUNIT_ASSERT_GREATER(0, loc.Language.getLength());
|
||||
CPPUNIT_ASSERT_GREATER(0, loc.Country.getLength());
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,62 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <com/sun/star/uno/Reference.hxx>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
|
||||
class XAccessibleContextTester
|
||||
{
|
||||
protected:
|
||||
const css::uno::Reference<css::accessibility::XAccessibleContext> mxContext;
|
||||
|
||||
public:
|
||||
XAccessibleContextTester(const css::uno::Reference<css::accessibility::XAccessibleContext>& ctx)
|
||||
: mxContext(ctx)
|
||||
{
|
||||
}
|
||||
|
||||
void testGetAccessibleChild();
|
||||
void testGetAccessibleChildCount();
|
||||
void testGetAccessibleDescription();
|
||||
void testGetAccessibleIndexInParent();
|
||||
void testGetAccessibleName();
|
||||
void testGetAccessibleParent();
|
||||
void testGetAccessibleRelationSet();
|
||||
void testGetAccessibleRole();
|
||||
void testGetAccessibleStateSet();
|
||||
void testGetLocale();
|
||||
|
||||
void testAll()
|
||||
{
|
||||
testGetAccessibleChild();
|
||||
testGetAccessibleChildCount();
|
||||
testGetAccessibleDescription();
|
||||
testGetAccessibleIndexInParent();
|
||||
testGetAccessibleName();
|
||||
testGetAccessibleParent();
|
||||
testGetAccessibleRelationSet();
|
||||
testGetAccessibleRole();
|
||||
testGetAccessibleStateSet();
|
||||
testGetLocale();
|
||||
}
|
||||
};
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,186 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include "XAccessibleEventBroadcasterTester.hxx"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <cppunit/TestAssert.h>
|
||||
|
||||
#include <com/sun/star/accessibility/AccessibleEventObject.hpp>
|
||||
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessible.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleEventListener.hpp>
|
||||
#include <com/sun/star/awt/PosSize.hpp>
|
||||
#include <com/sun/star/awt/Rectangle.hpp>
|
||||
#include <com/sun/star/awt/XWindow.hpp>
|
||||
#include <com/sun/star/lang/EventObject.hpp>
|
||||
|
||||
#include <cppuhelper/implbase.hxx>
|
||||
#include <rtl/ref.hxx>
|
||||
#include <sal/log.hxx>
|
||||
|
||||
#include "AccessibilityTools.hxx"
|
||||
|
||||
using namespace css;
|
||||
|
||||
namespace
|
||||
{
|
||||
class EvListener : public cppu::WeakImplHelper<accessibility::XAccessibleEventListener>
|
||||
{
|
||||
public:
|
||||
bool mbGotEvent;
|
||||
|
||||
EvListener()
|
||||
: mbGotEvent(false)
|
||||
{
|
||||
}
|
||||
|
||||
// XEventListener
|
||||
virtual void SAL_CALL disposing(const lang::EventObject&) override {}
|
||||
|
||||
// XAccessibleEventListener
|
||||
virtual void SAL_CALL notifyEvent(const accessibility::AccessibleEventObject& aEvent) override
|
||||
{
|
||||
std::cout << "Listener got event: " << AccessibilityTools::debugString(aEvent) << std::endl;
|
||||
uno::Reference<accessibility::XAccessible> xOld(aEvent.OldValue, uno::UNO_QUERY);
|
||||
if (xOld.is())
|
||||
std::cout << "Old: " << AccessibilityTools::debugString(xOld) << std::endl;
|
||||
|
||||
uno::Reference<accessibility::XAccessible> xNew(aEvent.NewValue, uno::UNO_QUERY);
|
||||
if (xNew.is())
|
||||
std::cout << "New: " << AccessibilityTools::debugString(xNew) << std::endl;
|
||||
|
||||
mbGotEvent = true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
XAccessibleEventBroadcasterTester::XAccessibleEventBroadcasterTester(
|
||||
const uno::Reference<accessibility::XAccessibleEventBroadcaster>& xBroadcaster,
|
||||
const uno::Reference<awt::XWindow>& xWindow)
|
||||
: mxBroadcaster(xBroadcaster)
|
||||
, mxWindow(xWindow)
|
||||
{
|
||||
}
|
||||
|
||||
bool XAccessibleEventBroadcasterTester::isTransient(
|
||||
const uno::Reference<accessibility::XAccessibleEventBroadcaster> xBroadcaster)
|
||||
{
|
||||
uno::Reference<accessibility::XAccessibleContext> xCtx(xBroadcaster, uno::UNO_QUERY_THROW);
|
||||
return isTransient(xCtx);
|
||||
}
|
||||
|
||||
bool XAccessibleEventBroadcasterTester::isTransient(
|
||||
const uno::Reference<accessibility::XAccessibleContext> xCtx)
|
||||
{
|
||||
return (
|
||||
xCtx->getAccessibleStateSet()->contains(accessibility::AccessibleStateType::TRANSIENT)
|
||||
&& xCtx->getAccessibleParent()->getAccessibleContext()->getAccessibleStateSet()->contains(
|
||||
accessibility::AccessibleStateType::MANAGES_DESCENDANTS));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Generates an event on @c mxBroadcaster.
|
||||
*
|
||||
* This method indirectly alters the state of @c mxBroadcaster so that an
|
||||
* accessible event will be fired for it. It can be called as many times as
|
||||
* needed and triggers an event each time.
|
||||
*/
|
||||
void XAccessibleEventBroadcasterTester::fireEvent()
|
||||
{
|
||||
awt::Rectangle newPosSize = mxWindow->getPosSize();
|
||||
newPosSize.Width = newPosSize.Width - 20;
|
||||
newPosSize.Height = newPosSize.Height - 20;
|
||||
newPosSize.X = newPosSize.X + 20;
|
||||
newPosSize.Y = newPosSize.Y + 20;
|
||||
mxWindow->setPosSize(newPosSize.X, newPosSize.Y, newPosSize.Width, newPosSize.Height,
|
||||
awt::PosSize::POSSIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a listener and fires events by mean of object relation.
|
||||
*
|
||||
* Asserts that the listener was properly called.
|
||||
*/
|
||||
void XAccessibleEventBroadcasterTester::testAddEventListener()
|
||||
{
|
||||
rtl::Reference<EvListener> xListener(new EvListener);
|
||||
mxBroadcaster->addAccessibleEventListener(xListener);
|
||||
bool transient = isTransient(mxBroadcaster);
|
||||
|
||||
std::cout << "firing event" << std::endl;
|
||||
fireEvent();
|
||||
|
||||
AccessibilityTools::Await([&xListener]() { return xListener->mbGotEvent; });
|
||||
|
||||
if (!transient)
|
||||
CPPUNIT_ASSERT_MESSAGE("listener wasn't called", xListener->mbGotEvent);
|
||||
else
|
||||
CPPUNIT_ASSERT_MESSAGE("Object is Transient, listener isn't expected to be called",
|
||||
!xListener->mbGotEvent);
|
||||
|
||||
mxBroadcaster->removeAccessibleEventListener(xListener);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Similar to @c testAddEventListener() but also removes the listener
|
||||
*
|
||||
* Adds an event listener just like @c testAddEventListener(), and then removes it and verifies an
|
||||
* event doesn't trigger the supposedly removed listener.
|
||||
*
|
||||
* @see testAddEventListener()
|
||||
*/
|
||||
void XAccessibleEventBroadcasterTester::testRemoveEventListener()
|
||||
{
|
||||
/* there is nothing we can really test for transient objects */
|
||||
if (isTransient(mxBroadcaster))
|
||||
{
|
||||
std::cerr << "could not test removing listener on transient object " << mxBroadcaster
|
||||
<< std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
rtl::Reference<EvListener> xListener(new EvListener);
|
||||
mxBroadcaster->addAccessibleEventListener(xListener);
|
||||
|
||||
std::cout << "firing event (with listener)" << std::endl;
|
||||
fireEvent();
|
||||
|
||||
AccessibilityTools::Await([&xListener]() { return xListener->mbGotEvent; });
|
||||
|
||||
CPPUNIT_ASSERT_MESSAGE("listener wasn't called", xListener->mbGotEvent);
|
||||
|
||||
/* reset listener, remove it and try again */
|
||||
xListener->mbGotEvent = false;
|
||||
|
||||
std::cout << "removing listener" << std::endl;
|
||||
mxBroadcaster->removeAccessibleEventListener(xListener);
|
||||
|
||||
std::cout << "firing event (without listener)" << std::endl;
|
||||
fireEvent();
|
||||
|
||||
AccessibilityTools::Wait(500);
|
||||
|
||||
CPPUNIT_ASSERT_MESSAGE("removed listener was called", !xListener->mbGotEvent);
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,54 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <com/sun/star/uno/Reference.hxx>
|
||||
#include <com/sun/star/accessibility/XAccessibleContext.hpp>
|
||||
#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
|
||||
#include <com/sun/star/awt/XWindow.hpp>
|
||||
|
||||
class XAccessibleEventBroadcasterTester
|
||||
{
|
||||
private:
|
||||
const css::uno::Reference<css::accessibility::XAccessibleEventBroadcaster> mxBroadcaster;
|
||||
const css::uno::Reference<css::awt::XWindow> mxWindow;
|
||||
|
||||
static bool isTransient(
|
||||
const css::uno::Reference<css::accessibility::XAccessibleEventBroadcaster> xBroadcaster);
|
||||
static bool isTransient(const css::uno::Reference<css::accessibility::XAccessibleContext> xCtx);
|
||||
|
||||
void fireEvent();
|
||||
|
||||
public:
|
||||
XAccessibleEventBroadcasterTester(
|
||||
const css::uno::Reference<css::accessibility::XAccessibleEventBroadcaster>& xBroadcaster,
|
||||
const css::uno::Reference<css::awt::XWindow>& xWindow);
|
||||
|
||||
void testAddEventListener();
|
||||
void testRemoveEventListener();
|
||||
|
||||
void testAll()
|
||||
{
|
||||
testAddEventListener();
|
||||
testRemoveEventListener();
|
||||
}
|
||||
};
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,53 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include "XAccessibleExtendedComponentTester.hxx"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <com/sun/star/accessibility/XAccessibleExtendedComponent.hpp>
|
||||
|
||||
/**
|
||||
* @brief Just calls the method.
|
||||
*/
|
||||
void XAccessibleExtendedComponentTester::testGetFont()
|
||||
{
|
||||
auto font = mxExtendedComponent->getFont();
|
||||
std::cout << "font: " << font << std::endl;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Just calls the method.
|
||||
*/
|
||||
void XAccessibleExtendedComponentTester::testGetTitledBorderText()
|
||||
{
|
||||
auto titleBorderText = mxExtendedComponent->getTitledBorderText();
|
||||
std::cout << "getTitledBorderText(): '" << titleBorderText << "'" << std::endl;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Just calls the method.
|
||||
*/
|
||||
void XAccessibleExtendedComponentTester::testGetToolTipText()
|
||||
{
|
||||
auto toolTipText = mxExtendedComponent->getToolTipText();
|
||||
std::cout << "getToolTipText(): '" << toolTipText << "'" << std::endl;
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -0,0 +1,50 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <com/sun/star/uno/Reference.hxx>
|
||||
#include <com/sun/star/accessibility/XAccessibleExtendedComponent.hpp>
|
||||
|
||||
class XAccessibleExtendedComponentTester
|
||||
{
|
||||
protected:
|
||||
const css::uno::Reference<css::accessibility::XAccessibleExtendedComponent> mxExtendedComponent;
|
||||
|
||||
public:
|
||||
XAccessibleExtendedComponentTester(
|
||||
const css::uno::Reference<css::accessibility::XAccessibleExtendedComponent>&
|
||||
extendedComponent)
|
||||
: mxExtendedComponent(extendedComponent)
|
||||
{
|
||||
}
|
||||
|
||||
void testGetFont();
|
||||
void testGetTitledBorderText();
|
||||
void testGetToolTipText();
|
||||
|
||||
void testAll()
|
||||
{
|
||||
testGetFont();
|
||||
testGetTitledBorderText();
|
||||
testGetToolTipText();
|
||||
}
|
||||
};
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -33,7 +33,6 @@
|
||||
#i52607 -o toolkit.AccessiblePopupMenu
|
||||
#i86107,i86110 -o toolkit.AccessibleRadioButton
|
||||
-o toolkit.AccessibleScrollBar
|
||||
#i111225 -o toolkit.AccessibleStatusBar
|
||||
-o toolkit.AccessibleStatusBarItem
|
||||
#i109643 -o toolkit.AccessibleTabControl
|
||||
#i109643 -o toolkit.AccessibleTabPage
|
||||
|
||||
Reference in New Issue
Block a user