diff --git a/autotests/data/checkbox_ro.pdf b/autotests/data/checkbox_ro.pdf new file mode 100644 index 000000000..e5d62b02d Binary files /dev/null and b/autotests/data/checkbox_ro.pdf differ diff --git a/autotests/parttest.cpp b/autotests/parttest.cpp index 7fd37c3c9..f2932fb1e 100644 --- a/autotests/parttest.cpp +++ b/autotests/parttest.cpp @@ -19,6 +19,8 @@ #include "../ui/toc.h" #include "../ui/pageview.h" +#include "../generators/poppler/config-okular-poppler.h" + #include #include @@ -105,6 +107,7 @@ class PartTest void testRClickOnSelectionModeShoulShowFollowTheLinkMenu(); void testClickAnywhereAfterSelectionShouldUnselect(); void testeRectSelectionStartingOnLinks(); + void testCheckBoxReadOnly(); private: void simulateMouseSelection(double startX, double startY, double endX, double endY, QWidget *target); @@ -1281,6 +1284,121 @@ void PartTest::test388288() QTRY_COMPARE(part.m_pageView->cursor().shape(), Qt::OpenHandCursor); } +void PartTest::testCheckBoxReadOnly() +{ +#ifndef HAVE_POPPLER_0_64 + 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() ); + + // Now set both to checked again and confirm that + // save / load works. + btnStates.clear(); + btnStates << true << true; + part.m_document->editFormButtons( 0, btns, btnStates ); + + QTemporaryFile saveFile( QString( "%1/okrXXXXXX.pdf" ).arg( QDir::tempPath() ) ); + QVERIFY( saveFile.open() ); + saveFile.close(); + + // Save + QVERIFY( part.saveAs( QUrl::fromLocalFile( saveFile.fileName() ), Part::NoSaveAsFlags ) ); + part.closeUrl(); + + // Load + part.openDocument( saveFile.fileName() ); + QVERIFY( part.m_document->isOpened() ); + + page = part.m_document->page( 0 ); + + fields.clear(); + + for ( Okular::FormField *ff: page->formFields() ) + { + fields.insert( ff->name(), static_cast< Okular::FormField* >( ff ) ); + } + + cbMakeRW = dynamic_cast< Okular::FormFieldButton* > ( fields[QStringLiteral( "CBMakeRW" )] ); + cbMakeRO = dynamic_cast< Okular::FormFieldButton* > ( fields[QStringLiteral( "CBMakeRO" )] ); + + targetDefaultRW = dynamic_cast< Okular::FormFieldText* > ( fields[QStringLiteral( "TargetDefaultRw" )] ); + targetDefaultRO = dynamic_cast< Okular::FormFieldText* > ( fields[QStringLiteral( "TargetDefaultRo" )] ); + + QVERIFY( cbMakeRW->state() ); + QVERIFY( cbMakeRO->state() ); + QVERIFY( targetDefaultRW->isReadOnly() ); + QVERIFY( !targetDefaultRO->isReadOnly() ); +} + } int main(int argc, char *argv[])