0

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/+/2154432
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Ian Prest <iapres@microsoft.com>
Commit-Queue: Badhri Ravikumar <bravi@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#760239}
This commit is contained in:
Badhri Ravikumar
2020-04-17 22:31:36 +00:00
committed by Commit Bot
parent 77146d33d9
commit b898d15a0d
3 changed files with 84 additions and 0 deletions

@ -51,6 +51,8 @@ PDFiumFormFiller::PDFiumFormFiller(PDFiumEngine* engine, bool enable_javascript)
FPDF_FORMFILLINFO::FFI_DoURIAction = Form_DoURIAction;
FPDF_FORMFILLINFO::FFI_DoGoToAction = Form_DoGoToAction;
FPDF_FORMFILLINFO::FFI_OnFocusChange = Form_OnFocusChange;
FPDF_FORMFILLINFO::FFI_DoURIActionWithKeyboardModifier =
Form_DoURIActionWithKeyboardModifier;
#if defined(PDF_ENABLE_XFA)
FPDF_FORMFILLINFO::xfa_disabled = false;
FPDF_FORMFILLINFO::FFI_EmailTo = Form_EmailTo;
@ -311,6 +313,24 @@ void PDFiumFormFiller::Form_DoGoToAction(FPDF_FORMFILLINFO* param,
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)
// static

@ -69,6 +69,9 @@ class PDFiumFormFiller : public FPDF_FORMFILLINFO, public IPDF_JSPLATFORM {
int zoom_mode,
float* position_array,
int size_of_array);
static void Form_DoURIActionWithKeyboardModifier(FPDF_FORMFILLINFO* param,
FPDF_BYTESTRING uri,
int modifiers);
#if defined(PDF_ENABLE_XFA)
static void Form_EmailTo(FPDF_FORMFILLINFO* param,

@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "build/build_config.h"
#include "pdf/pdfium/pdfium_engine.h"
#include "pdf/pdfium/pdfium_test_base.h"
#include "pdf/test/test_client.h"
@ -25,6 +26,7 @@ class FormFillerTestClient : public TestClient {
// Mock PDFEngine::Client methods.
MOCK_METHOD1(ScrollToX, void(int));
MOCK_METHOD2(ScrollToY, void(int, bool));
MOCK_METHOD2(NavigateTo, void(const std::string&, WindowOpenDisposition));
};
} // namespace
@ -43,8 +45,67 @@ class FormFillerTest : public PDFiumTestBase {
engine->form_filler_.Form_OnFocusChange(&engine->form_filler_, annot,
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) {
struct {
// Initial scroll position of the document.