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:

committed by
Commit Bot

parent
77146d33d9
commit
b898d15a0d
@ -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.
|
||||
|
Reference in New Issue
Block a user