include/sfx2/AccessibilityIssue.hxx | 2 + sw/inc/AccessibilityCheckStrings.hrc | 1 sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx | 12 ++++++++ sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt |binary sw/source/core/access/AccessibilityCheck.cxx | 21 ++++++++++++--- 5 files changed, 33 insertions(+), 3 deletions(-)
New commits: commit de02e5560168060af0b0c9be847af01c4fadec0b Author: offtkp <parisop...@gmail.com> AuthorDate: Thu Oct 13 19:35:06 2022 +0300 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Fri Oct 21 08:53:31 2022 +0200 a11y: Add check for short hyperlinks Add accessibility check and relevant test for a document that uses short hyperlinks Change-Id: I5d6bfe345b50d6d42dc04e9e2f7f853cf5f63a84 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141338 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/include/sfx2/AccessibilityIssue.hxx b/include/sfx2/AccessibilityIssue.hxx index 085863cbd405..60700bad8d35 100644 --- a/include/sfx2/AccessibilityIssue.hxx +++ b/include/sfx2/AccessibilityIssue.hxx @@ -29,6 +29,8 @@ enum class AccessibilityIssueID NO_ALT_SHAPE, TABLE_MERGE_SPLIT, TEXT_FORMATTING, + HYPERLINK_IS_TEXT, + HYPERLINK_SHORT, }; class SFX2_DLLPUBLIC AccessibilityIssue diff --git a/sw/inc/AccessibilityCheckStrings.hrc b/sw/inc/AccessibilityCheckStrings.hrc index 9c45cb84ecd9..77b93378869f 100644 --- a/sw/inc/AccessibilityCheckStrings.hrc +++ b/sw/inc/AccessibilityCheckStrings.hrc @@ -17,6 +17,7 @@ #define STR_TABLE_MERGE_SPLIT NC_("STR_TABLE_MERGE_SPLIT", "Table '%OBJECT_NAME%' contains merges or splits") #define STR_FAKE_NUMBERING NC_("STR_FAKE_NUMBERING", "Fake numbering '%NUMBERING%'") #define STR_HYPERLINK_TEXT_IS_LINK NC_("STR_HYPERLINK_TEXT_IS_LINK", "Hyperlink text is the same as the link address '%LINK%'") +#define STR_HYPERLINK_TEXT_IS_SHORT NC_("STR_HYPERLINK_TEXT_IS_SHORT", "Hyperlink text is too short.") #define STR_TEXT_CONTRAST NC_("STR_TEXT_CONTRAST", "Text contrast is too low.") #define STR_TEXT_BLINKING NC_("STR_TEXT_BLINKING", "Blinking text.") #define STR_AVOID_FOOTNOTES NC_("STR_AVOID_FOOTNOTES", "Avoid footnotes.") diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx index 98b08b5a207c..75cf071c1e69 100644 --- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx +++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx @@ -93,6 +93,18 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckSpacebarSpace) CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[0]->m_eIssueID); } +CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testHyperlinks) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "HyperlinkTest.odt"); + CPPUNIT_ASSERT(pDoc); + sw::AccessibilityCheck aCheck(pDoc); + aCheck.check(); + auto& aIssues = aCheck.getIssueCollection().getIssues(); + CPPUNIT_ASSERT_EQUAL(size_t(2), aIssues.size()); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::HYPERLINK_SHORT, aIssues[0]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::HYPERLINK_IS_TEXT, aIssues[1]->m_eIssueID); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt b/sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt new file mode 100644 index 000000000000..1eba1932ce21 Binary files /dev/null and b/sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt differ diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx index 9746e17c0794..9195fcfcbd52 100644 --- a/sw/source/core/access/AccessibilityCheck.cxx +++ b/sw/source/core/access/AccessibilityCheck.cxx @@ -254,7 +254,8 @@ public: class HyperlinkCheck : public NodeCheck { private: - void checkTextRange(uno::Reference<text::XTextRange> const& xTextRange) + void checkTextRange(uno::Reference<text::XTextRange> const& xTextRange, SwTextNode* pTextNode, + sal_Int32 nStart) { uno::Reference<beans::XPropertySet> xProperties(xTextRange, uno::UNO_QUERY); if (!xProperties->getPropertySetInfo()->hasPropertyByName("HyperLinkURL")) @@ -269,7 +270,19 @@ private: { OUString sIssueText = SwResId(STR_HYPERLINK_TEXT_IS_LINK).replaceFirst("%LINK%", sHyperlink); - lclAddIssue(m_rIssueCollection, sIssueText); + lclAddIssue(m_rIssueCollection, sIssueText, + sfx::AccessibilityIssueID::HYPERLINK_IS_TEXT); + } + else if (sText.getLength() <= 5) + { + auto pIssue = lclAddIssue(m_rIssueCollection, SwResId(STR_HYPERLINK_TEXT_IS_SHORT), + sfx::AccessibilityIssueID::HYPERLINK_SHORT); + pIssue->setIssueObject(IssueObject::TEXT); + pIssue->setNode(pTextNode); + SwDoc& rDocument = pTextNode->GetDoc(); + pIssue->setDoc(rDocument); + pIssue->setStart(nStart); + pIssue->setEnd(nStart + sText.getLength()); } } } @@ -293,12 +306,14 @@ public: uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParagraph, uno::UNO_QUERY); uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration(); + sal_Int32 nStart = 0; while (xRunEnum->hasMoreElements()) { uno::Reference<text::XTextRange> xRun(xRunEnum->nextElement(), uno::UNO_QUERY); if (xRun.is()) { - checkTextRange(xRun); + checkTextRange(xRun, pTextNode, nStart); + nStart += xRun->getString().getLength(); } } }