Chromium Code Reviews| Index: pdf/pdfium/pdfium_engine.cc |
| diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc |
| index afc8b71633bcd2bbab24880da6b033316bfe63a9..5a301f2d47669d0677dbf6ff724e47849b68f882 100644 |
| --- a/pdf/pdfium/pdfium_engine.cc |
| +++ b/pdf/pdfium/pdfium_engine.cc |
| @@ -1625,6 +1625,30 @@ void PDFiumEngine::FitContentsToPrintableAreaIfRequired( |
| void PDFiumEngine::SaveSelectedFormForPrint() { |
| FORM_ForceToKillFocus(form_); |
| client_->FormTextFieldFocusChange(false); |
| + SetInFormTextField(false); |
| + SetInFormComboboxTextField(false); |
| +} |
| + |
| +void PDFiumEngine::SetFormSelectedText(const FPDF_FORMHANDLE& form_handle, |
|
Lei Zhang
2017/06/17 02:21:17
We don't do this consistently, so let's try to be
drgage
2017/06/19 21:53:52
Done.
|
| + const FPDF_PAGE& page) { |
| + size_t form_sel_text_len = |
| + FORM_GetSelectedText(form_handle, page, nullptr, 0); |
| + |
| + // Initial length = 2 (not 0) because text is CFX_WideString and |
|
Lei Zhang
2017/06/17 02:21:18
CFX_WideString is suppose to be an implementation
drgage
2017/06/19 21:53:52
Done.
|
| + // sentinel char is included in count. |
|
Lei Zhang
2017/06/17 02:21:17
By "sentinel char" do you really mean NUL characte
drgage
2017/06/19 21:53:52
Done.
|
| + if (form_sel_text_len <= 2) |
| + 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 +1745,33 @@ 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); |
| + if (form_type == FPDF_FORMFIELD_TEXTFIELD) |
| + mouse_down_state_.Set(PDFiumPage::FORM_TEXT_AREA, target); |
| + else if (form_type == FPDF_FORMFIELD_COMBOBOX) |
| + mouse_down_state_.Set(PDFiumPage::FORM_COMBOBOX_TEXT_AREA, target); |
| + else |
| + mouse_down_state_.Set(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 |
| + |
| + // TODO(drgage): implement copying for comboboxes |
| client_->FormTextFieldFocusChange(is_valid_control); |
| + SetInFormTextField(form_type == FPDF_FORMFIELD_TEXTFIELD); |
| + SetInFormComboboxTextField(form_type == FPDF_FORMFIELD_COMBOBOX); |
| return true; // Return now before we get into the selection code. |
| } |
| } |
| client_->FormTextFieldFocusChange(false); |
| + SetInFormTextField(false); |
| + SetInFormComboboxTextField(false); |
| if (area != PDFiumPage::TEXT_AREA) |
| return true; // Return true so WebKit doesn't do its own highlighting. |
| @@ -1808,11 +1847,15 @@ bool PDFiumEngine::OnMouseUp(const pp::MouseInputEvent& event) { |
| client_->NavigateTo(target.url, disposition); |
| client_->FormTextFieldFocusChange(false); |
| + SetInFormTextField(false); |
| + SetInFormComboboxTextField(false); |
| return true; |
| } |
| if (area == PDFiumPage::DOCLINK_AREA) { |
| client_->ScrollToPage(target.page); |
| client_->FormTextFieldFocusChange(false); |
| + SetInFormTextField(false); |
| + SetInFormComboboxTextField(false); |
| return true; |
| } |
| } |
| @@ -1828,6 +1871,11 @@ 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 || |
| + area == PDFiumPage::FORM_COMBOBOX_TEXT_AREA) { |
| + SetFormSelectedText(form_, pages_[last_page_mouse_down_]->GetPage()); |
| + } |
| + |
| if (!selecting_) |
| return false; |
| @@ -1859,6 +1907,8 @@ bool PDFiumEngine::OnMouseMove(const pp::MouseInputEvent& event) { |
| cursor = PP_CURSORTYPE_HAND; |
| break; |
| case PDFiumPage::NONSELECTABLE_AREA: |
| + case PDFiumPage::FORM_TEXT_AREA: |
| + case PDFiumPage::FORM_COMBOBOX_TEXT_AREA: |
| default: |
| switch (form_type) { |
| case FPDF_FORMFIELD_PUSHBUTTON: |
| @@ -1992,6 +2042,17 @@ bool PDFiumEngine::OnKeyUp(const pp::KeyboardInputEvent& event) { |
| if (last_page_mouse_down_ == -1) |
| return false; |
| + if (in_form_text_field_ || in_form_combobox_text_field_) { |
| + if (event.GetKeyCode() == ui::VKEY_SHIFT) |
| + SetFormSelectedText(form_, pages_[last_page_mouse_down_]->GetPage()); |
| + else { |
| + // If a key other than shift is released while shift is not also |
| + // being held down, selection of form field text should be cleared. |
| + if (event.GetModifiers() & ~PP_INPUTEVENT_MODIFIER_SHIFTKEY) |
| + pp::PDF::SetSelectedText(GetPluginInstance(), ""); |
|
Lei Zhang
2017/06/17 02:21:17
Are you sure the key up event is the best time to
drgage
2017/06/19 21:53:52
Done.
|
| + } |
| + } |
| + |
| return !!FORM_OnKeyUp(form_, pages_[last_page_mouse_down_]->GetPage(), |
| event.GetKeyCode(), event.GetModifiers()); |
| } |
| @@ -3553,6 +3614,15 @@ void PDFiumEngine::SetSelecting(bool selecting) { |
| client_->IsSelectingChanged(selecting); |
| } |
| +void PDFiumEngine::SetInFormTextField(bool in_form_text_field) { |
| + in_form_text_field_ = in_form_text_field; |
| +} |
| + |
| +void PDFiumEngine::SetInFormComboboxTextField( |
| + bool in_form_combobox_text_field) { |
| + in_form_combobox_text_field_ = in_form_combobox_text_field; |
| +} |
| + |
| void PDFiumEngine::ScheduleTouchTimer(const pp::TouchInputEvent& evt) { |
| touch_timers_[++next_touch_timer_id_] = evt; |
| client_->ScheduleTouchTimerCallback(next_touch_timer_id_, |