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_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,
|
|||||||
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 {
|
|||||||
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 @@
|
|||||||
// 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 {
|
|||||||
// 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 {
|
|||||||
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.
|
||||||
|
Reference in New Issue
Block a user