diff options
-rw-r--r-- | fpdfsdk/cpdfsdk_pageview.cpp | 11 | ||||
-rw-r--r-- | fpdfsdk/cpdfsdk_pageview.h | 1 | ||||
-rw-r--r-- | fpdfsdk/fpdfformfill.cpp | 11 | ||||
-rw-r--r-- | fpdfsdk/fpdfview_c_api_test.c | 1 | ||||
-rw-r--r-- | public/fpdf_formfill.h | 23 | ||||
-rw-r--r-- | samples/pdfium_test.cc | 8 | ||||
-rw-r--r-- | testing/resources/javascript/mouse_events.evt | 19 | ||||
-rw-r--r-- | testing/resources/javascript/mouse_events.in | 92 | ||||
-rw-r--r-- | testing/resources/javascript/mouse_events_expected.txt | 10 | ||||
-rw-r--r-- | testing/tools/test_runner.py | 2 |
10 files changed, 177 insertions, 1 deletions
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp index 2155b5d3d8..5bdd720596 100644 --- a/fpdfsdk/cpdfsdk_pageview.cpp +++ b/fpdfsdk/cpdfsdk_pageview.cpp @@ -259,6 +259,17 @@ void CPDFSDK_PageView::ReplaceSelection(const CFX_WideString& text) { } } +bool CPDFSDK_PageView::OnFocus(const CFX_PointF& point, uint32_t nFlag) { + CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point)); + if (!pAnnot) { + m_pFormFillEnv->KillFocusAnnot(nFlag); + return false; + } + + m_pFormFillEnv->SetFocusAnnot(&pAnnot); + return true; +} + bool CPDFSDK_PageView::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point)); if (!pAnnot) { diff --git a/fpdfsdk/cpdfsdk_pageview.h b/fpdfsdk/cpdfsdk_pageview.h index c23aaa7988..00e90d73e8 100644 --- a/fpdfsdk/cpdfsdk_pageview.h +++ b/fpdfsdk/cpdfsdk_pageview.h @@ -64,6 +64,7 @@ class CPDFSDK_PageView final : public CPDF_Page::View { CFX_WideString GetSelectedText(); void ReplaceSelection(const CFX_WideString& text); + bool OnFocus(const CFX_PointF& point, uint32_t nFlag); bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag); bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag); #ifdef PDF_ENABLE_XFA diff --git a/fpdfsdk/fpdfformfill.cpp b/fpdfsdk/fpdfformfill.cpp index b36c1dff23..1b5cc483a8 100644 --- a/fpdfsdk/fpdfformfill.cpp +++ b/fpdfsdk/fpdfformfill.cpp @@ -291,6 +291,17 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, return pPageView->OnMouseMove(CFX_PointF(page_x, page_y), modifier); } +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnFocus(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + return pPageView->OnFocus(CFX_PointF(page_x, page_y), modifier); +} + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, diff --git a/fpdfsdk/fpdfview_c_api_test.c b/fpdfsdk/fpdfview_c_api_test.c index 5bad9c8e7b..6f84f353aa 100644 --- a/fpdfsdk/fpdfview_c_api_test.c +++ b/fpdfsdk/fpdfview_c_api_test.c @@ -181,6 +181,7 @@ int CheckPDFiumCApi() { CHK(FORM_DoDocumentAAction); CHK(FORM_DoPageAAction); CHK(FORM_OnMouseMove); + CHK(FORM_OnFocus); CHK(FORM_OnLButtonDown); CHK(FORM_OnLButtonUp); #ifdef PDF_ENABLE_XFA diff --git a/public/fpdf_formfill.h b/public/fpdf_formfill.h index 6a90140097..bf385b3539 100644 --- a/public/fpdf_formfill.h +++ b/public/fpdf_formfill.h @@ -1242,6 +1242,29 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, double page_y); /** + * Function: FORM_OnFocus + * This function focuses the form annotation at a given point. If the + * annotation at the point already has focus, nothing happens. If there + * is no annotation at the point, remove form focus. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + * FPDFDOC_InitFormFillEnvironment. + * page - Handle to the page. Returned by FPDF_LoadPage. + * modifier - Indicates whether various virtual keys are down. + * page_x - Specifies the x-coordinate of the cursor in PDF user + * space. + * page_y - Specifies the y-coordinate of the cursor in PDF user + * space. + * Return Value: + * TRUE if there is an annotation at the given point and it has focus. + **/ +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnFocus(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y); + +/** * Function: FORM_OnLButtonDown * You can call this member function when the user presses the left *mouse button. diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc index 31235f0eff..b94b674286 100644 --- a/samples/pdfium_test.cc +++ b/samples/pdfium_test.cc @@ -965,6 +965,14 @@ void SendPageEvents(FPDF_FORMHANDLE form, } else { fprintf(stderr, "mousemove: bad args\n"); } + } else if (tokens[0] == "focus") { + if (tokens.size() == 3) { + int x = atoi(tokens[1].c_str()); + int y = atoi(tokens[2].c_str()); + FORM_OnFocus(form, page, 0, x, y); + } else { + fprintf(stderr, "focus: bad args\n"); + } } else { fprintf(stderr, "Unrecognized event: %s\n", tokens[0].c_str()); } diff --git a/testing/resources/javascript/mouse_events.evt b/testing/resources/javascript/mouse_events.evt new file mode 100644 index 0000000000..57105063e4 --- /dev/null +++ b/testing/resources/javascript/mouse_events.evt @@ -0,0 +1,19 @@ +# Mouse in, mouse out. +mousemove,125,225 +mousemove,125,100 +# Mouse in, click in field. +mousemove,125,225 +mousedown,left,125,225 +mouseup,left,125,225 +# Mouse out, click elsewhere. +# This should trigger an On Blur event. (Bug 881) +mousemove,125,100 +mousedown,left,125,100 +mouseup,left,125,100 +# Mouse in, focus. +mousemove,125,225 +focus,125,225 +# Mouse out, unfocus. +# This should trigger an On Blur event. (Bug 881) +mousemove,125,100 +focus,125,100 diff --git a/testing/resources/javascript/mouse_events.in b/testing/resources/javascript/mouse_events.in new file mode 100644 index 0000000000..a72162add3 --- /dev/null +++ b/testing/resources/javascript/mouse_events.in @@ -0,0 +1,92 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R + /AcroForm 4 0 R +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [ + 3 0 R + ] +>> +endobj +% Page number 0. +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /Resources << + /Font <</F1 20 0 R>> + >> + /Annots [ 5 0 R ] + /Contents [21 0 R] + /MediaBox [0 0 612 792] +>> +% Forms +{{object 4 0}} << + /Fields [5 0 R] +>> +% Field with actions: +% Cursor enter: E +% Cursor exit: X +% Mouse down: D +% Mouse up: U +% Focus: Fo +% Blur: Bl +{{object 5 0}} << + /FT /Tx + /T (MyField) + /Type /Annot + /Subtype /Widget + /Rect [100 200 150 250] + /AA << + /E 10 0 R + /X 11 0 R + /D 12 0 R + /U 13 0 R + /Fo 14 0 R + /Bl 15 0 R + >> +>> +{{object 10 0}} << + /Type /Action + /S /JavaScript + /JS (app.alert\("enter"\);) +>> +endobj +{{object 11 0}} << + /Type /Action + /S /JavaScript + /JS (app.alert\("exit"\);) +>> +endobj +{{object 12 0}} << + /Type /Action + /S /JavaScript + /JS (app.alert\("down"\);) +>> +endobj +{{object 13 0}} << + /Type /Action + /S /JavaScript + /JS (app.alert\("up"\);) +>> +endobj +{{object 14 0}} << + /Type /Action + /S /JavaScript + /JS (app.alert\("focus"\);) +>> +endobj +{{object 15 0}} << + /Type /Action + /S /JavaScript + /JS (app.alert\("blur"\);) +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF diff --git a/testing/resources/javascript/mouse_events_expected.txt b/testing/resources/javascript/mouse_events_expected.txt new file mode 100644 index 0000000000..3d9b8b6071 --- /dev/null +++ b/testing/resources/javascript/mouse_events_expected.txt @@ -0,0 +1,10 @@ +Alert: enter +Alert: exit +Alert: enter +Alert: down +Alert: focus +Alert: up +Alert: exit +Alert: enter +Alert: focus +Alert: exit diff --git a/testing/tools/test_runner.py b/testing/tools/test_runner.py index 9524b7459b..86e05636ab 100644 --- a/testing/tools/test_runner.py +++ b/testing/tools/test_runner.py @@ -115,7 +115,7 @@ class TestRunner: txt_path = os.path.join(self.working_dir, input_root + '.txt') with open(txt_path, 'w') as outfile: - cmd_to_run = [self.pdfium_test_path, pdf_path] + cmd_to_run = [self.pdfium_test_path, '--send-events', pdf_path] subprocess.check_call(cmd_to_run, stdout=outfile) cmd = [sys.executable, self.text_diff_path, expected_txt_path, txt_path] |