diff --git a/autotests/data/checkbox_ro.pdf b/autotests/data/checkbox_ro.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e5d62b02d2191551432faf7dceb08858345da7ea GIT binary patch literal 41601 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 MZf<2=6;h)A0mOWYf&c&j literal 0 Hc$@ #include @@ -105,6 +107,7 @@ void testRClickOnSelectionModeShoulShowFollowTheLinkMenu(); void testClickAnywhereAfterSelectionShouldUnselect(); void testeRectSelectionStartingOnLinks(); + void testCheckBoxReadOnly(); private: void simulateMouseSelection(double startX, double startY, double endX, double endY, QWidget *target); @@ -1281,6 +1284,83 @@ QTRY_COMPARE(part.m_pageView->cursor().shape(), Qt::OpenHandCursor); } +void PartTest::testCheckBoxReadOnly() +{ +#ifndef HAVE_POPPLER_0_63 + return; +#endif + + const QString testFile = QStringLiteral( KDESRCDIR "data/checkbox_ro.pdf" ); + Okular::Part part(nullptr, nullptr, QVariantList()); + part.openDocument( testFile ); + + // The test document uses the activation action of checkboxes + // to update the read only state. For this we need the part so that + // undo / redo activates the activation action. + + QVERIFY( part.m_document->isOpened() ); + + const Okular::Page* page = part.m_document->page( 0 ); + + QMap fields; + + // Field names in test document are: + // CBMakeRW, CBMakeRO, TargetDefaultRO, TargetDefaultRW + + for ( Okular::FormField *ff: page->formFields() ) + { + fields.insert( ff->name(), static_cast< Okular::FormField* >( ff ) ); + } + + // First grab all fields and check that the setup is as expected. + auto cbMakeRW = dynamic_cast< Okular::FormFieldButton* > ( fields[QStringLiteral( "CBMakeRW" )] ); + auto cbMakeRO = dynamic_cast< Okular::FormFieldButton* > ( fields[QStringLiteral( "CBMakeRO" )] ); + + auto targetDefaultRW = dynamic_cast< Okular::FormFieldText* > ( fields[QStringLiteral( "TargetDefaultRw" )] ); + auto targetDefaultRO = dynamic_cast< Okular::FormFieldText* > ( fields[QStringLiteral( "TargetDefaultRo" )] ); + + QVERIFY( cbMakeRW ); + QVERIFY( cbMakeRO ); + QVERIFY( targetDefaultRW ); + QVERIFY( targetDefaultRO ); + + QVERIFY( !cbMakeRW->state() ); + QVERIFY( !cbMakeRO->state() ); + + QVERIFY( !targetDefaultRW->isReadOnly() ); + QVERIFY( targetDefaultRO->isReadOnly() ); + + QList< Okular::FormFieldButton* > btns; + btns << cbMakeRW << cbMakeRO; + + // Now check both boxes + QList< bool > btnStates; + btnStates << true << true; + + part.m_document->editFormButtons( 0, btns, btnStates ); + + // Read only should be inverted + QVERIFY( targetDefaultRW->isReadOnly() ); + QVERIFY( !targetDefaultRO->isReadOnly() ); + + // Test that undo / redo works + QVERIFY( part.m_document->canUndo() ); + part.m_document->undo(); + QVERIFY( !targetDefaultRW->isReadOnly() ); + QVERIFY( targetDefaultRO->isReadOnly() ); + + part.m_document->redo(); + QVERIFY( targetDefaultRW->isReadOnly() ); + QVERIFY( !targetDefaultRO->isReadOnly() ); + + btnStates.clear(); + btnStates << false << true; + + part.m_document->editFormButtons( 0, btns, btnStates ); + QVERIFY( targetDefaultRW->isReadOnly() ); + QVERIFY( targetDefaultRO->isReadOnly() ); +} + } int main(int argc, char *argv[])