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