blob: f07126652b7ee3d589bb15790823ccd516eb594f [file] [log] [blame]
Neha Gupta44f1f202019-12-11 08:42:19 +00001// Copyright 2019 The PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +00005#include <vector>
6
Neha Gupta44f1f202019-12-11 08:42:19 +00007#include "fpdfsdk/cpdfsdk_annotiterator.h"
Lei Zhang20143282022-04-08 21:16:52 +00008#include "fpdfsdk/cpdfsdk_baannot.h"
Neha Gupta44f1f202019-12-11 08:42:19 +00009#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
10#include "fpdfsdk/cpdfsdk_helpers.h"
11#include "fpdfsdk/cpdfsdk_pageview.h"
Neha Gupta44f1f202019-12-11 08:42:19 +000012#include "testing/embedder_test.h"
Tom Sepez9c78c0d2021-01-27 20:13:14 +000013#include "third_party/base/check.h"
Lei Zhangce725742020-10-02 02:02:44 +000014#include "third_party/base/check_op.h"
Neha Gupta44f1f202019-12-11 08:42:19 +000015
Lei Zhang20143282022-04-08 21:16:52 +000016class CPDFSDK_BAAnnotTest : public EmbedderTest {
Neha Gupta44f1f202019-12-11 08:42:19 +000017 public:
18 void SetUp() override {
Neha Gupta44f1f202019-12-11 08:42:19 +000019 EmbedderTest::SetUp();
Lei Zhang20143282022-04-08 21:16:52 +000020 SetUpBAAnnot();
Neha Gupta44f1f202019-12-11 08:42:19 +000021 }
22
23 void TearDown() override {
24 UnloadPage(m_page);
25 EmbedderTest::TearDown();
26 }
27
Lei Zhang20143282022-04-08 21:16:52 +000028 void SetUpBAAnnot() {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +000029 ASSERT_TRUE(OpenDocument("links_highlights_annots.pdf"));
Neha Gupta44f1f202019-12-11 08:42:19 +000030 m_page = LoadPage(0);
31 ASSERT_TRUE(m_page);
32
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000033 m_pFormFillEnv =
Neha Gupta44f1f202019-12-11 08:42:19 +000034 CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle());
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000035 ASSERT_TRUE(m_pFormFillEnv);
36 m_pPageView =
Tom Sepezcee8fbd2021-06-04 19:21:40 +000037 m_pFormFillEnv->GetOrCreatePageView(IPDFPageFromFPDFPage(m_page));
Neha Gupta44f1f202019-12-11 08:42:19 +000038 ASSERT_TRUE(m_pPageView);
Neha Gupta44f1f202019-12-11 08:42:19 +000039 }
40
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000041 CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; }
Neha Gupta44f1f202019-12-11 08:42:19 +000042 CPDFSDK_PageView* GetPageView() const { return m_pPageView; }
Neha Gupta44f1f202019-12-11 08:42:19 +000043
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000044 CPDFSDK_Annot* GetNthFocusableAnnot(size_t n) {
45 DCHECK_NE(n, 0);
46 CPDFSDK_AnnotIterator ai(GetPageView(),
47 m_pFormFillEnv->GetFocusableAnnotSubtypes());
48 CPDFSDK_Annot* pAnnot = ai.GetFirstAnnot();
Tom Sepez9c78c0d2021-01-27 20:13:14 +000049 DCHECK(pAnnot);
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000050
51 for (size_t i = 1; i < n; i++) {
52 pAnnot = ai.GetNextAnnot(pAnnot);
Tom Sepez9c78c0d2021-01-27 20:13:14 +000053 DCHECK(pAnnot);
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000054 }
55
56 return pAnnot;
57 }
58
Neha Gupta44f1f202019-12-11 08:42:19 +000059 private:
60 FPDF_PAGE m_page = nullptr;
61 CPDFSDK_PageView* m_pPageView = nullptr;
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000062 CPDFSDK_FormFillEnvironment* m_pFormFillEnv = nullptr;
Neha Gupta44f1f202019-12-11 08:42:19 +000063};
64
Lei Zhang20143282022-04-08 21:16:52 +000065TEST_F(CPDFSDK_BAAnnotTest, TabToLinkOrHighlightAnnot) {
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000066 std::vector<CPDF_Annot::Subtype> focusable_annot_types = {
67 CPDF_Annot::Subtype::WIDGET, CPDF_Annot::Subtype::LINK,
68 CPDF_Annot::Subtype::HIGHLIGHT};
69
70 GetFormFillEnv()->SetFocusableAnnotSubtypes(focusable_annot_types);
71
72 // Get link annot.
73 CPDFSDK_Annot* pAnnot = GetNthFocusableAnnot(2);
Neha Gupta44f1f202019-12-11 08:42:19 +000074 ASSERT_TRUE(pAnnot);
75 EXPECT_EQ(pAnnot->GetAnnotSubtype(), CPDF_Annot::Subtype::LINK);
76
Lei Zhang2ea512b2022-04-08 21:10:01 +000077 {
78 ObservedPtr<CPDFSDK_Annot> observer(pAnnot);
79 EXPECT_TRUE(CPDFSDK_Annot::OnSetFocus(observer, {}));
80 EXPECT_TRUE(CPDFSDK_Annot::OnKillFocus(observer, {}));
81 }
Neha Gupta44f1f202019-12-11 08:42:19 +000082
Badhri Ravikumar5540fdb2020-04-03 22:34:28 +000083 // Get highlight annot.
84 pAnnot = GetNthFocusableAnnot(4);
85 ASSERT_TRUE(pAnnot);
86 EXPECT_EQ(pAnnot->GetAnnotSubtype(), CPDF_Annot::Subtype::HIGHLIGHT);
Neha Gupta44f1f202019-12-11 08:42:19 +000087
Lei Zhang2ea512b2022-04-08 21:10:01 +000088 {
89 ObservedPtr<CPDFSDK_Annot> observer(pAnnot);
90 EXPECT_TRUE(CPDFSDK_Annot::OnSetFocus(observer, {}));
91 EXPECT_TRUE(CPDFSDK_Annot::OnKillFocus(observer, {}));
92 }
Neha Gupta44f1f202019-12-11 08:42:19 +000093}