Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1167)

Unified Diff: pdf/pdfium/pdfium_engine.cc

Issue 2924343005: Add functionality for copying text within form text fields and form combobox text fields (Closed)
Patch Set: Changed combobox selection and fix for text selection bug Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pdf/pdfium/pdfium_engine.cc
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index afc8b71633bcd2bbab24880da6b033316bfe63a9..91aeb00b19450dc7c8693b84a309a9e1e4e39d90 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -1625,6 +1625,29 @@ void PDFiumEngine::FitContentsToPrintableAreaIfRequired(
void PDFiumEngine::SaveSelectedFormForPrint() {
FORM_ForceToKillFocus(form_);
client_->FormTextFieldFocusChange(false);
+ SetInFormTextArea(false);
+}
+
+void PDFiumEngine::SetFormSelectedText(FPDF_FORMHANDLE form_handle,
+ FPDF_PAGE page) {
+ size_t form_sel_text_len =
+ FORM_GetSelectedText(form_handle, page, nullptr, 0);
+
+ // Initial length = 2 (not 0) because chars are two bytes and
Lei Zhang 2017/06/20 00:26:24 This statement is confusing. It can be read as: ch
drgage 2017/06/20 23:14:27 Done.
+ // NUL char is included in count.
+ if (form_sel_text_len <= 2)
dsinclair 2017/06/20 15:21:44 Is this check needed? Won't we just end up creatin
Lei Zhang 2017/06/20 21:21:22 Might as well bale out early if we knows continuin
drgage 2017/06/20 23:14:27 Done.
drgage 2017/06/20 23:14:27 Yeah, you're right. I just wasn't sure if I should
dsinclair 2017/06/21 13:03:28 Leaving it is fine, early exiting does make it a b
drgage 2017/06/23 22:16:13 Done.
+ return;
+
+ base::string16 selected_form_text16;
+ PDFiumAPIStringBufferSizeInBytesAdapter<base::string16> string_adapter(
+ &selected_form_text16, form_sel_text_len, false);
+ string_adapter.Close(FORM_GetSelectedText(
+ form_handle, page, string_adapter.GetData(), form_sel_text_len));
+
+ std::string selected_form_text = UTF16ToUTF8(selected_form_text16);
+ if (!selected_form_text.empty()) {
+ pp::PDF::SetSelectedText(GetPluginInstance(), selected_form_text.c_str());
+ }
}
void PDFiumEngine::PrintEnd() {
@@ -1721,18 +1744,26 @@ bool PDFiumEngine::OnMouseDown(const pp::MouseInputEvent& event) {
FORM_OnLButtonDown(form_, pages_[page_index]->GetPage(), 0, page_x, page_y);
if (form_type > FPDF_FORMFIELD_UNKNOWN) { // returns -1 sometimes...
- mouse_down_state_.Set(PDFiumPage::NONSELECTABLE_AREA, target);
+ mouse_down_state_.Set(form_type == FPDF_FORMFIELD_TEXTFIELD
Lei Zhang 2017/06/20 00:26:24 What about FPDF_FORMFIELD_COMBOBOX?
drgage 2017/06/20 23:14:27 I think I got confused while refactoring this yest
+ ? PDFiumPage::FORM_TEXT_AREA
+ : PDFiumPage::NONSELECTABLE_AREA,
+ target);
+
bool is_valid_control = (form_type == FPDF_FORMFIELD_TEXTFIELD ||
form_type == FPDF_FORMFIELD_COMBOBOX);
+
+// TODO(bug_62400): figure out selection and copying
+// for XFA fields
#if defined(PDF_ENABLE_XFA)
is_valid_control |= (form_type == FPDF_FORMFIELD_XFA);
#endif
client_->FormTextFieldFocusChange(is_valid_control);
+ SetInFormTextArea(is_valid_control);
return true; // Return now before we get into the selection code.
}
}
-
client_->FormTextFieldFocusChange(false);
+ SetInFormTextArea(false);
if (area != PDFiumPage::TEXT_AREA)
return true; // Return true so WebKit doesn't do its own highlighting.
@@ -1808,11 +1839,13 @@ bool PDFiumEngine::OnMouseUp(const pp::MouseInputEvent& event) {
client_->NavigateTo(target.url, disposition);
client_->FormTextFieldFocusChange(false);
+ SetInFormTextArea(false);
return true;
}
if (area == PDFiumPage::DOCLINK_AREA) {
client_->ScrollToPage(target.page);
client_->FormTextFieldFocusChange(false);
+ SetInFormTextArea(false);
dsinclair 2017/06/20 15:21:43 Should we add a SetFormTextAreaStatus(bool) or som
drgage 2017/06/20 23:14:27 I could do this, or I could add the line "client_-
dsinclair 2017/06/21 13:03:28 Moving the FormTextFieldFocusChange into SetInForm
drgage 2017/06/23 22:16:12 Done.
return true;
}
}
@@ -1828,6 +1861,9 @@ bool PDFiumEngine::OnMouseUp(const pp::MouseInputEvent& event) {
FORM_OnLButtonUp(form_, pages_[page_index]->GetPage(), 0, page_x, page_y);
}
+ if (area == PDFiumPage::FORM_TEXT_AREA)
+ SetFormSelectedText(form_, pages_[last_page_mouse_down_]->GetPage());
+
if (!selecting_)
return false;
@@ -1859,6 +1895,7 @@ bool PDFiumEngine::OnMouseMove(const pp::MouseInputEvent& event) {
cursor = PP_CURSORTYPE_HAND;
break;
case PDFiumPage::NONSELECTABLE_AREA:
+ case PDFiumPage::FORM_TEXT_AREA:
default:
switch (form_type) {
case FPDF_FORMFIELD_PUSHBUTTON:
@@ -1985,6 +2022,13 @@ bool PDFiumEngine::OnKeyDown(const pp::KeyboardInputEvent& event) {
OnChar(synthesized);
}
+ // If form selected text is empty and key pressed within form text area,
+ // plugin text selection should be cleared.
+ if (FORM_GetSelectedText(form_, pages_[last_page_mouse_down_]->GetPage(),
Lei Zhang 2017/06/20 00:26:24 Since the conditional is evaluated from left to ri
drgage 2017/06/20 23:14:27 Done.
+ nullptr, 0) <= 2 &&
+ in_form_text_area_)
+ pp::PDF::SetSelectedText(GetPluginInstance(), "");
+
return rv;
}
@@ -1992,6 +2036,11 @@ bool PDFiumEngine::OnKeyUp(const pp::KeyboardInputEvent& event) {
if (last_page_mouse_down_ == -1)
return false;
+ if (in_form_text_area_) {
+ if (event.GetKeyCode() == ui::VKEY_SHIFT)
+ SetFormSelectedText(form_, pages_[last_page_mouse_down_]->GetPage());
+ }
+
return !!FORM_OnKeyUp(form_, pages_[last_page_mouse_down_]->GetPage(),
event.GetKeyCode(), event.GetModifiers());
}
@@ -3553,6 +3602,10 @@ void PDFiumEngine::SetSelecting(bool selecting) {
client_->IsSelectingChanged(selecting);
}
+void PDFiumEngine::SetInFormTextArea(bool in_form_text_area) {
+ in_form_text_area_ = in_form_text_area;
+}
+
void PDFiumEngine::ScheduleTouchTimer(const pp::TouchInputEvent& evt) {
touch_timers_[++next_touch_timer_id_] = evt;
client_->ScheduleTouchTimerCallback(next_touch_timer_id_,

Powered by Google App Engine
This is Rietveld 408576698