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_, |