OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "pdf/pdfium/pdfium_engine.h" | 5 #include "pdf/pdfium/pdfium_engine.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 1609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1620 for (int i = 0; i < num_pages; ++i) { | 1620 for (int i = 0; i < num_pages; ++i) { |
1621 FPDF_PAGE page = FPDF_LoadPage(doc, i); | 1621 FPDF_PAGE page = FPDF_LoadPage(doc, i); |
1622 TransformPDFPageForPrinting(page, print_settings); | 1622 TransformPDFPageForPrinting(page, print_settings); |
1623 FPDF_ClosePage(page); | 1623 FPDF_ClosePage(page); |
1624 } | 1624 } |
1625 } | 1625 } |
1626 } | 1626 } |
1627 | 1627 |
1628 void PDFiumEngine::SaveSelectedFormForPrint() { | 1628 void PDFiumEngine::SaveSelectedFormForPrint() { |
1629 FORM_ForceToKillFocus(form_); | 1629 FORM_ForceToKillFocus(form_); |
1630 client_->FormTextFieldFocusChange(false); | 1630 SetInFormTextArea(false); |
| 1631 } |
| 1632 |
| 1633 void PDFiumEngine::SetFormSelectedText(FPDF_FORMHANDLE form_handle, |
| 1634 FPDF_PAGE page) { |
| 1635 unsigned long form_sel_text_len = |
| 1636 FORM_GetSelectedText(form_handle, page, nullptr, 0); |
| 1637 |
| 1638 // Check to see if there is selected text in the form. When |
| 1639 // |form_sel_text_len| is 2, that represents a wide string with just a |
| 1640 // NUL-terminator. |
| 1641 if (form_sel_text_len <= 2) |
| 1642 return; |
| 1643 |
| 1644 base::string16 selected_form_text16; |
| 1645 PDFiumAPIStringBufferSizeInBytesAdapter<base::string16> string_adapter( |
| 1646 &selected_form_text16, form_sel_text_len, false); |
| 1647 string_adapter.Close(FORM_GetSelectedText( |
| 1648 form_handle, page, string_adapter.GetData(), form_sel_text_len)); |
| 1649 |
| 1650 std::string selected_form_text = base::UTF16ToUTF8(selected_form_text16); |
| 1651 if (!selected_form_text.empty()) { |
| 1652 pp::PDF::SetSelectedText(GetPluginInstance(), selected_form_text.c_str()); |
| 1653 } |
1631 } | 1654 } |
1632 | 1655 |
1633 void PDFiumEngine::PrintEnd() { | 1656 void PDFiumEngine::PrintEnd() { |
1634 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_DP); | 1657 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_DP); |
1635 } | 1658 } |
1636 | 1659 |
1637 PDFiumPage::Area PDFiumEngine::GetCharIndex(const pp::MouseInputEvent& event, | 1660 PDFiumPage::Area PDFiumEngine::GetCharIndex(const pp::MouseInputEvent& event, |
1638 int* page_index, | 1661 int* page_index, |
1639 int* char_index, | 1662 int* char_index, |
1640 int* form_type, | 1663 int* form_type, |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1717 return false; | 1740 return false; |
1718 | 1741 |
1719 if (page_index != -1) { | 1742 if (page_index != -1) { |
1720 last_page_mouse_down_ = page_index; | 1743 last_page_mouse_down_ = page_index; |
1721 double page_x, page_y; | 1744 double page_x, page_y; |
1722 pp::Point point = event.GetPosition(); | 1745 pp::Point point = event.GetPosition(); |
1723 DeviceToPage(page_index, point.x(), point.y(), &page_x, &page_y); | 1746 DeviceToPage(page_index, point.x(), point.y(), &page_x, &page_y); |
1724 | 1747 |
1725 FORM_OnLButtonDown(form_, pages_[page_index]->GetPage(), 0, page_x, page_y); | 1748 FORM_OnLButtonDown(form_, pages_[page_index]->GetPage(), 0, page_x, page_y); |
1726 if (form_type > FPDF_FORMFIELD_UNKNOWN) { // returns -1 sometimes... | 1749 if (form_type > FPDF_FORMFIELD_UNKNOWN) { // returns -1 sometimes... |
1727 mouse_down_state_.Set(PDFiumPage::NONSELECTABLE_AREA, target); | 1750 mouse_down_state_.Set(PDFiumPage::FormTypeToArea(form_type), target); |
| 1751 |
1728 bool is_valid_control = (form_type == FPDF_FORMFIELD_TEXTFIELD || | 1752 bool is_valid_control = (form_type == FPDF_FORMFIELD_TEXTFIELD || |
1729 form_type == FPDF_FORMFIELD_COMBOBOX); | 1753 form_type == FPDF_FORMFIELD_COMBOBOX); |
| 1754 |
| 1755 // TODO(bug_62400): figure out selection and copying |
| 1756 // for XFA fields |
1730 #if defined(PDF_ENABLE_XFA) | 1757 #if defined(PDF_ENABLE_XFA) |
1731 is_valid_control |= (form_type == FPDF_FORMFIELD_XFA); | 1758 is_valid_control |= (form_type == FPDF_FORMFIELD_XFA); |
1732 #endif | 1759 #endif |
1733 client_->FormTextFieldFocusChange(is_valid_control); | 1760 SetInFormTextArea(is_valid_control); |
1734 return true; // Return now before we get into the selection code. | 1761 return true; // Return now before we get into the selection code. |
1735 } | 1762 } |
1736 } | 1763 } |
1737 | 1764 SetInFormTextArea(false); |
1738 client_->FormTextFieldFocusChange(false); | |
1739 | 1765 |
1740 if (area != PDFiumPage::TEXT_AREA) | 1766 if (area != PDFiumPage::TEXT_AREA) |
1741 return true; // Return true so WebKit doesn't do its own highlighting. | 1767 return true; // Return true so WebKit doesn't do its own highlighting. |
1742 | 1768 |
1743 if (event.GetClickCount() == 1) { | 1769 if (event.GetClickCount() == 1) { |
1744 OnSingleClick(page_index, char_index); | 1770 OnSingleClick(page_index, char_index); |
1745 } else if (event.GetClickCount() == 2 || event.GetClickCount() == 3) { | 1771 } else if (event.GetClickCount() == 2 || event.GetClickCount() == 3) { |
1746 OnMultipleClick(event.GetClickCount(), page_index, char_index); | 1772 OnMultipleClick(event.GetClickCount(), page_index, char_index); |
1747 } | 1773 } |
1748 | 1774 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1803 !!(modifiers & PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN); | 1829 !!(modifiers & PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN); |
1804 bool alt_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_ALTKEY); | 1830 bool alt_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_ALTKEY); |
1805 bool ctrl_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_CONTROLKEY); | 1831 bool ctrl_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_CONTROLKEY); |
1806 bool meta_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_METAKEY); | 1832 bool meta_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_METAKEY); |
1807 bool shift_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_SHIFTKEY); | 1833 bool shift_key = !!(modifiers & PP_INPUTEVENT_MODIFIER_SHIFTKEY); |
1808 | 1834 |
1809 WindowOpenDisposition disposition = ui::DispositionFromClick( | 1835 WindowOpenDisposition disposition = ui::DispositionFromClick( |
1810 middle_button, alt_key, ctrl_key, meta_key, shift_key); | 1836 middle_button, alt_key, ctrl_key, meta_key, shift_key); |
1811 | 1837 |
1812 client_->NavigateTo(target.url, disposition); | 1838 client_->NavigateTo(target.url, disposition); |
1813 client_->FormTextFieldFocusChange(false); | 1839 SetInFormTextArea(false); |
1814 return true; | 1840 return true; |
1815 } | 1841 } |
1816 if (area == PDFiumPage::DOCLINK_AREA) { | 1842 if (area == PDFiumPage::DOCLINK_AREA) { |
1817 client_->ScrollToPage(target.page); | 1843 client_->ScrollToPage(target.page); |
1818 client_->FormTextFieldFocusChange(false); | 1844 SetInFormTextArea(false); |
1819 return true; | 1845 return true; |
1820 } | 1846 } |
1821 } | 1847 } |
1822 | 1848 |
1823 // Prevent middle mouse button from selecting texts. | 1849 // Prevent middle mouse button from selecting texts. |
1824 if (event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_MIDDLE) | 1850 if (event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_MIDDLE) |
1825 return false; | 1851 return false; |
1826 | 1852 |
1827 if (page_index != -1) { | 1853 if (page_index != -1) { |
1828 double page_x, page_y; | 1854 double page_x, page_y; |
1829 pp::Point point = event.GetPosition(); | 1855 pp::Point point = event.GetPosition(); |
1830 DeviceToPage(page_index, point.x(), point.y(), &page_x, &page_y); | 1856 DeviceToPage(page_index, point.x(), point.y(), &page_x, &page_y); |
1831 FORM_OnLButtonUp(form_, pages_[page_index]->GetPage(), 0, page_x, page_y); | 1857 FORM_OnLButtonUp(form_, pages_[page_index]->GetPage(), 0, page_x, page_y); |
1832 } | 1858 } |
1833 | 1859 |
| 1860 if (area == PDFiumPage::FORM_TEXT_AREA) |
| 1861 SetFormSelectedText(form_, pages_[last_page_mouse_down_]->GetPage()); |
| 1862 |
1834 if (!selecting_) | 1863 if (!selecting_) |
1835 return false; | 1864 return false; |
1836 | 1865 |
1837 SetSelecting(false); | 1866 SetSelecting(false); |
1838 return true; | 1867 return true; |
1839 } | 1868 } |
1840 | 1869 |
1841 bool PDFiumEngine::OnMouseMove(const pp::MouseInputEvent& event) { | 1870 bool PDFiumEngine::OnMouseMove(const pp::MouseInputEvent& event) { |
1842 int page_index = -1; | 1871 int page_index = -1; |
1843 int char_index = -1; | 1872 int char_index = -1; |
(...skipping 11 matching lines...) Expand all Loading... |
1855 PP_CursorType_Dev cursor; | 1884 PP_CursorType_Dev cursor; |
1856 switch (area) { | 1885 switch (area) { |
1857 case PDFiumPage::TEXT_AREA: | 1886 case PDFiumPage::TEXT_AREA: |
1858 cursor = PP_CURSORTYPE_IBEAM; | 1887 cursor = PP_CURSORTYPE_IBEAM; |
1859 break; | 1888 break; |
1860 case PDFiumPage::WEBLINK_AREA: | 1889 case PDFiumPage::WEBLINK_AREA: |
1861 case PDFiumPage::DOCLINK_AREA: | 1890 case PDFiumPage::DOCLINK_AREA: |
1862 cursor = PP_CURSORTYPE_HAND; | 1891 cursor = PP_CURSORTYPE_HAND; |
1863 break; | 1892 break; |
1864 case PDFiumPage::NONSELECTABLE_AREA: | 1893 case PDFiumPage::NONSELECTABLE_AREA: |
| 1894 case PDFiumPage::FORM_TEXT_AREA: |
1865 default: | 1895 default: |
1866 switch (form_type) { | 1896 switch (form_type) { |
1867 case FPDF_FORMFIELD_PUSHBUTTON: | 1897 case FPDF_FORMFIELD_PUSHBUTTON: |
1868 case FPDF_FORMFIELD_CHECKBOX: | 1898 case FPDF_FORMFIELD_CHECKBOX: |
1869 case FPDF_FORMFIELD_RADIOBUTTON: | 1899 case FPDF_FORMFIELD_RADIOBUTTON: |
1870 case FPDF_FORMFIELD_COMBOBOX: | 1900 case FPDF_FORMFIELD_COMBOBOX: |
1871 case FPDF_FORMFIELD_LISTBOX: | 1901 case FPDF_FORMFIELD_LISTBOX: |
1872 cursor = PP_CURSORTYPE_HAND; | 1902 cursor = PP_CURSORTYPE_HAND; |
1873 break; | 1903 break; |
1874 case FPDF_FORMFIELD_TEXTFIELD: | 1904 case FPDF_FORMFIELD_TEXTFIELD: |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1981 // http://chrome-corpsvn.mtv.corp.google.com/viewvc?view=rev&root=chrome&rev
ision=31805 | 2011 // http://chrome-corpsvn.mtv.corp.google.com/viewvc?view=rev&root=chrome&rev
ision=31805 |
1982 // for more information. So just fake one since PDFium uses it. | 2012 // for more information. So just fake one since PDFium uses it. |
1983 std::string str; | 2013 std::string str; |
1984 str.push_back(event.GetKeyCode()); | 2014 str.push_back(event.GetKeyCode()); |
1985 pp::KeyboardInputEvent synthesized(pp::KeyboardInputEvent( | 2015 pp::KeyboardInputEvent synthesized(pp::KeyboardInputEvent( |
1986 client_->GetPluginInstance(), PP_INPUTEVENT_TYPE_CHAR, | 2016 client_->GetPluginInstance(), PP_INPUTEVENT_TYPE_CHAR, |
1987 event.GetTimeStamp(), event.GetModifiers(), event.GetKeyCode(), str)); | 2017 event.GetTimeStamp(), event.GetModifiers(), event.GetKeyCode(), str)); |
1988 OnChar(synthesized); | 2018 OnChar(synthesized); |
1989 } | 2019 } |
1990 | 2020 |
| 2021 // If form selected text is empty and key pressed within form text area, |
| 2022 // plugin text selection should be cleared. |
| 2023 if (in_form_text_area_ && |
| 2024 FORM_GetSelectedText(form_, pages_[last_page_mouse_down_]->GetPage(), |
| 2025 nullptr, 0) <= 2) { |
| 2026 pp::PDF::SetSelectedText(GetPluginInstance(), ""); |
| 2027 } |
| 2028 |
1991 return rv; | 2029 return rv; |
1992 } | 2030 } |
1993 | 2031 |
1994 bool PDFiumEngine::OnKeyUp(const pp::KeyboardInputEvent& event) { | 2032 bool PDFiumEngine::OnKeyUp(const pp::KeyboardInputEvent& event) { |
1995 if (last_page_mouse_down_ == -1) | 2033 if (last_page_mouse_down_ == -1) |
1996 return false; | 2034 return false; |
1997 | 2035 |
| 2036 if (in_form_text_area_) { |
| 2037 if (event.GetKeyCode() == ui::VKEY_SHIFT) |
| 2038 SetFormSelectedText(form_, pages_[last_page_mouse_down_]->GetPage()); |
| 2039 } |
| 2040 |
1998 return !!FORM_OnKeyUp(form_, pages_[last_page_mouse_down_]->GetPage(), | 2041 return !!FORM_OnKeyUp(form_, pages_[last_page_mouse_down_]->GetPage(), |
1999 event.GetKeyCode(), event.GetModifiers()); | 2042 event.GetKeyCode(), event.GetModifiers()); |
2000 } | 2043 } |
2001 | 2044 |
2002 bool PDFiumEngine::OnChar(const pp::KeyboardInputEvent& event) { | 2045 bool PDFiumEngine::OnChar(const pp::KeyboardInputEvent& event) { |
2003 if (last_page_mouse_down_ == -1) | 2046 if (last_page_mouse_down_ == -1) |
2004 return false; | 2047 return false; |
2005 | 2048 |
2006 base::string16 str = base::UTF8ToUTF16(event.GetCharacterText().AsString()); | 2049 base::string16 str = base::UTF8ToUTF16(event.GetCharacterText().AsString()); |
2007 return !!FORM_OnChar(form_, pages_[last_page_mouse_down_]->GetPage(), str[0], | 2050 return !!FORM_OnChar(form_, pages_[last_page_mouse_down_]->GetPage(), str[0], |
(...skipping 1541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3549 client_->ScrollToPage(most_visible_page); | 3592 client_->ScrollToPage(most_visible_page); |
3550 } | 3593 } |
3551 | 3594 |
3552 void PDFiumEngine::SetSelecting(bool selecting) { | 3595 void PDFiumEngine::SetSelecting(bool selecting) { |
3553 bool was_selecting = selecting_; | 3596 bool was_selecting = selecting_; |
3554 selecting_ = selecting; | 3597 selecting_ = selecting; |
3555 if (selecting_ != was_selecting) | 3598 if (selecting_ != was_selecting) |
3556 client_->IsSelectingChanged(selecting); | 3599 client_->IsSelectingChanged(selecting); |
3557 } | 3600 } |
3558 | 3601 |
| 3602 void PDFiumEngine::SetInFormTextArea(bool in_form_text_area) { |
| 3603 client_->FormTextFieldFocusChange(in_form_text_area); |
| 3604 in_form_text_area_ = in_form_text_area; |
| 3605 } |
| 3606 |
3559 void PDFiumEngine::ScheduleTouchTimer(const pp::TouchInputEvent& evt) { | 3607 void PDFiumEngine::ScheduleTouchTimer(const pp::TouchInputEvent& evt) { |
3560 touch_timers_[++next_touch_timer_id_] = evt; | 3608 touch_timers_[++next_touch_timer_id_] = evt; |
3561 client_->ScheduleTouchTimerCallback(next_touch_timer_id_, | 3609 client_->ScheduleTouchTimerCallback(next_touch_timer_id_, |
3562 kTouchLongPressTimeoutMs); | 3610 kTouchLongPressTimeoutMs); |
3563 } | 3611 } |
3564 | 3612 |
3565 void PDFiumEngine::KillTouchTimer(int timer_id) { | 3613 void PDFiumEngine::KillTouchTimer(int timer_id) { |
3566 touch_timers_.erase(timer_id); | 3614 touch_timers_.erase(timer_id); |
3567 } | 3615 } |
3568 | 3616 |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4138 FPDF_DOCUMENT doc = | 4186 FPDF_DOCUMENT doc = |
4139 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); | 4187 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); |
4140 if (!doc) | 4188 if (!doc) |
4141 return false; | 4189 return false; |
4142 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | 4190 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
4143 FPDF_CloseDocument(doc); | 4191 FPDF_CloseDocument(doc); |
4144 return success; | 4192 return success; |
4145 } | 4193 } |
4146 | 4194 |
4147 } // namespace chrome_pdf | 4195 } // namespace chrome_pdf |
OLD | NEW |