Commit b898d15a authored by Badhri Ravikumar's avatar Badhri Ravikumar Committed by Commit Bot

Implementation of DoURIActionWithKeyboardModifiers API

Support for opening a link in new tab/window exists using mouse. But
after setting focus over link by pressing Tab key, we do not have the
provision to open the link in new tab/window using keyboard shortcut.
This new API carries keyboard modifier value whenever URI action
needs to be performed.

Unit tests are added to validate the newly added API.

Bug: chromium:994500
Change-Id: Id7936c0ec42115f92a790f4d469f65c6194f9d1b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2154432Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarIan Prest <iapres@microsoft.com>
Commit-Queue: Badhri Ravikumar <bravi@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#760239}
parent 77146d33
...@@ -51,6 +51,8 @@ PDFiumFormFiller::PDFiumFormFiller(PDFiumEngine* engine, bool enable_javascript) ...@@ -51,6 +51,8 @@ PDFiumFormFiller::PDFiumFormFiller(PDFiumEngine* engine, bool enable_javascript)
FPDF_FORMFILLINFO::FFI_DoURIAction = Form_DoURIAction; FPDF_FORMFILLINFO::FFI_DoURIAction = Form_DoURIAction;
FPDF_FORMFILLINFO::FFI_DoGoToAction = Form_DoGoToAction; FPDF_FORMFILLINFO::FFI_DoGoToAction = Form_DoGoToAction;
FPDF_FORMFILLINFO::FFI_OnFocusChange = Form_OnFocusChange; FPDF_FORMFILLINFO::FFI_OnFocusChange = Form_OnFocusChange;
FPDF_FORMFILLINFO::FFI_DoURIActionWithKeyboardModifier =
Form_DoURIActionWithKeyboardModifier;
#if defined(PDF_ENABLE_XFA) #if defined(PDF_ENABLE_XFA)
FPDF_FORMFILLINFO::xfa_disabled = false; FPDF_FORMFILLINFO::xfa_disabled = false;
FPDF_FORMFILLINFO::FFI_EmailTo = Form_EmailTo; FPDF_FORMFILLINFO::FFI_EmailTo = Form_EmailTo;
...@@ -311,6 +313,24 @@ void PDFiumFormFiller::Form_DoGoToAction(FPDF_FORMFILLINFO* param, ...@@ -311,6 +313,24 @@ void PDFiumFormFiller::Form_DoGoToAction(FPDF_FORMFILLINFO* param,
engine->ScrollToPage(page_index); engine->ScrollToPage(page_index);
} }
// static
void PDFiumFormFiller::Form_DoURIActionWithKeyboardModifier(
FPDF_FORMFILLINFO* param,
FPDF_BYTESTRING uri,
int modifiers) {
PDFiumEngine* engine = GetEngine(param);
bool middle_button = !!(modifiers & PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN);
bool alt_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_ALTKEY);
bool ctrl_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_CONTROLKEY);
bool meta_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_METAKEY);
bool shift_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_SHIFTKEY);
WindowOpenDisposition disposition = ui::DispositionFromClick(
middle_button, alt_key, ctrl_key, meta_key, shift_key);
engine->client_->NavigateTo(std::string(uri), disposition);
}
#if defined(PDF_ENABLE_XFA) #if defined(PDF_ENABLE_XFA)
// static // static
......
...@@ -69,6 +69,9 @@ class PDFiumFormFiller : public FPDF_FORMFILLINFO, public IPDF_JSPLATFORM { ...@@ -69,6 +69,9 @@ class PDFiumFormFiller : public FPDF_FORMFILLINFO, public IPDF_JSPLATFORM {
int zoom_mode, int zoom_mode,
float* position_array, float* position_array,
int size_of_array); int size_of_array);
static void Form_DoURIActionWithKeyboardModifier(FPDF_FORMFILLINFO* param,
FPDF_BYTESTRING uri,
int modifiers);
#if defined(PDF_ENABLE_XFA) #if defined(PDF_ENABLE_XFA)
static void Form_EmailTo(FPDF_FORMFILLINFO* param, static void Form_EmailTo(FPDF_FORMFILLINFO* param,
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "build/build_config.h"
#include "pdf/pdfium/pdfium_engine.h" #include "pdf/pdfium/pdfium_engine.h"
#include "pdf/pdfium/pdfium_test_base.h" #include "pdf/pdfium/pdfium_test_base.h"
#include "pdf/test/test_client.h" #include "pdf/test/test_client.h"
...@@ -25,6 +26,7 @@ class FormFillerTestClient : public TestClient { ...@@ -25,6 +26,7 @@ class FormFillerTestClient : public TestClient {
// Mock PDFEngine::Client methods. // Mock PDFEngine::Client methods.
MOCK_METHOD1(ScrollToX, void(int)); MOCK_METHOD1(ScrollToX, void(int));
MOCK_METHOD2(ScrollToY, void(int, bool)); MOCK_METHOD2(ScrollToY, void(int, bool));
MOCK_METHOD2(NavigateTo, void(const std::string&, WindowOpenDisposition));
}; };
} // namespace } // namespace
...@@ -43,8 +45,67 @@ class FormFillerTest : public PDFiumTestBase { ...@@ -43,8 +45,67 @@ class FormFillerTest : public PDFiumTestBase {
engine->form_filler_.Form_OnFocusChange(&engine->form_filler_, annot, engine->form_filler_.Form_OnFocusChange(&engine->form_filler_, annot,
page_index); page_index);
} }
void TriggerDoURIActionWithKeyboardModifier(PDFiumEngine* engine,
FPDF_BYTESTRING uri,
int modifiers) {
ASSERT_TRUE(engine);
engine->form_filler_.Form_DoURIActionWithKeyboardModifier(
&engine->form_filler_, uri, modifiers);
}
}; };
TEST_F(FormFillerTest, DoURIActionWithKeyboardModifier) {
FormFillerTestClient client;
std::unique_ptr<PDFiumEngine> engine = InitializeEngine(
&client, FILE_PATH_LITERAL("annotation_form_fields.pdf"));
ASSERT_TRUE(engine);
const char kUri[] = "https://www.google.com/";
{
InSequence sequence;
EXPECT_CALL(client, NavigateTo(kUri, WindowOpenDisposition::CURRENT_TAB))
.Times(1);
EXPECT_CALL(client, NavigateTo(kUri, WindowOpenDisposition::SAVE_TO_DISK))
.Times(1);
EXPECT_CALL(client,
NavigateTo(kUri, WindowOpenDisposition::NEW_BACKGROUND_TAB))
.Times(1);
EXPECT_CALL(client, NavigateTo(kUri, WindowOpenDisposition::NEW_WINDOW))
.Times(1);
EXPECT_CALL(client,
NavigateTo(kUri, WindowOpenDisposition::NEW_FOREGROUND_TAB))
.Times(1);
EXPECT_CALL(client,
NavigateTo(kUri, WindowOpenDisposition::NEW_BACKGROUND_TAB))
.Times(1);
EXPECT_CALL(client,
NavigateTo(kUri, WindowOpenDisposition::NEW_FOREGROUND_TAB))
.Times(1);
}
#if defined(OS_MACOSX)
#define modifier_key PP_INPUTEVENT_MODIFIER_METAKEY;
#else
#define modifier_key PP_INPUTEVENT_MODIFIER_CONTROLKEY
#endif
int modifiers = 0;
TriggerDoURIActionWithKeyboardModifier(engine.get(), kUri, modifiers);
modifiers = PP_INPUTEVENT_MODIFIER_ALTKEY;
TriggerDoURIActionWithKeyboardModifier(engine.get(), kUri, modifiers);
modifiers = modifier_key;
TriggerDoURIActionWithKeyboardModifier(engine.get(), kUri, modifiers);
modifiers = PP_INPUTEVENT_MODIFIER_SHIFTKEY;
TriggerDoURIActionWithKeyboardModifier(engine.get(), kUri, modifiers);
modifiers |= modifier_key;
TriggerDoURIActionWithKeyboardModifier(engine.get(), kUri, modifiers);
modifiers = PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN;
TriggerDoURIActionWithKeyboardModifier(engine.get(), kUri, modifiers);
modifiers |= PP_INPUTEVENT_MODIFIER_SHIFTKEY;
TriggerDoURIActionWithKeyboardModifier(engine.get(), kUri, modifiers);
}
TEST_F(FormFillerTest, FormOnFocusChange) { TEST_F(FormFillerTest, FormOnFocusChange) {
struct { struct {
// Initial scroll position of the document. // Initial scroll position of the document.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment