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 2265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2276 reinterpret_cast<FPDF_WIDESTRING>(destination_wide.c_str()); | 2276 reinterpret_cast<FPDF_WIDESTRING>(destination_wide.c_str()); |
2277 FPDF_BOOKMARK bookmark = FPDFBookmark_Find(doc_, destination_pdf_wide); | 2277 FPDF_BOOKMARK bookmark = FPDFBookmark_Find(doc_, destination_pdf_wide); |
2278 if (!bookmark) | 2278 if (!bookmark) |
2279 return -1; | 2279 return -1; |
2280 dest = FPDFBookmark_GetDest(doc_, bookmark); | 2280 dest = FPDFBookmark_GetDest(doc_, bookmark); |
2281 } | 2281 } |
2282 return dest ? FPDFDest_GetPageIndex(doc_, dest) : -1; | 2282 return dest ? FPDFDest_GetPageIndex(doc_, dest) : -1; |
2283 } | 2283 } |
2284 | 2284 |
2285 int PDFiumEngine::GetMostVisiblePage() { | 2285 int PDFiumEngine::GetMostVisiblePage() { |
| 2286 if (in_flight_visible_page_) |
| 2287 return *in_flight_visible_page_; |
| 2288 |
2286 CalculateVisiblePages(); | 2289 CalculateVisiblePages(); |
2287 return most_visible_page_; | 2290 return most_visible_page_; |
2288 } | 2291 } |
2289 | 2292 |
2290 pp::Rect PDFiumEngine::GetPageRect(int index) { | 2293 pp::Rect PDFiumEngine::GetPageRect(int index) { |
2291 pp::Rect rc(pages_[index]->rect()); | 2294 pp::Rect rc(pages_[index]->rect()); |
2292 rc.Inset(-kPageShadowLeft, -kPageShadowTop, | 2295 rc.Inset(-kPageShadowLeft, -kPageShadowTop, |
2293 -kPageShadowRight, -kPageShadowBottom); | 2296 -kPageShadowRight, -kPageShadowBottom); |
2294 return rc; | 2297 return rc; |
2295 } | 2298 } |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2670 most_visible_page++; | 2673 most_visible_page++; |
2671 } | 2674 } |
2672 | 2675 |
2673 SetCurrentPage(most_visible_page); | 2676 SetCurrentPage(most_visible_page); |
2674 } | 2677 } |
2675 | 2678 |
2676 bool PDFiumEngine::IsPageVisible(int index) const { | 2679 bool PDFiumEngine::IsPageVisible(int index) const { |
2677 return base::ContainsValue(visible_pages_, index); | 2680 return base::ContainsValue(visible_pages_, index); |
2678 } | 2681 } |
2679 | 2682 |
| 2683 void PDFiumEngine::ScrollToPage(int page) { |
| 2684 in_flight_visible_page_ = page; |
| 2685 client_->ScrollToPage(page); |
| 2686 } |
| 2687 |
2680 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) { | 2688 bool PDFiumEngine::CheckPageAvailable(int index, std::vector<int>* pending) { |
2681 if (!doc_ || !form_) | 2689 if (!doc_ || !form_) |
2682 return false; | 2690 return false; |
2683 | 2691 |
2684 const int num_pages = static_cast<int>(pages_.size()); | 2692 const int num_pages = static_cast<int>(pages_.size()); |
2685 if (index < num_pages && pages_[index]->available()) | 2693 if (index < num_pages && pages_[index]->available()) |
2686 return true; | 2694 return true; |
2687 | 2695 |
2688 if (!FPDFAvail_IsPageAvail(fpdf_availability_, index, &download_hints_)) { | 2696 if (!FPDFAvail_IsPageAvail(fpdf_availability_, index, &download_hints_)) { |
2689 if (!base::ContainsValue(*pending, index)) | 2697 if (!base::ContainsValue(*pending, index)) |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3176 | 3184 |
3177 int PDFiumEngine::GetVisiblePageIndex(FPDF_PAGE page) { | 3185 int PDFiumEngine::GetVisiblePageIndex(FPDF_PAGE page) { |
3178 for (int page_index : visible_pages_) { | 3186 for (int page_index : visible_pages_) { |
3179 if (pages_[page_index]->GetPage() == page) | 3187 if (pages_[page_index]->GetPage() == page) |
3180 return page_index; | 3188 return page_index; |
3181 } | 3189 } |
3182 return -1; | 3190 return -1; |
3183 } | 3191 } |
3184 | 3192 |
3185 void PDFiumEngine::SetCurrentPage(int index) { | 3193 void PDFiumEngine::SetCurrentPage(int index) { |
| 3194 in_flight_visible_page_.reset(); |
| 3195 |
3186 if (index == most_visible_page_ || !form_) | 3196 if (index == most_visible_page_ || !form_) |
3187 return; | 3197 return; |
3188 | 3198 |
3189 if (most_visible_page_ != -1 && called_do_document_action_) { | 3199 if (most_visible_page_ != -1 && called_do_document_action_) { |
3190 FPDF_PAGE old_page = pages_[most_visible_page_]->GetPage(); | 3200 FPDF_PAGE old_page = pages_[most_visible_page_]->GetPage(); |
3191 FORM_DoPageAAction(old_page, form_, FPDFPAGE_AACTION_CLOSE); | 3201 FORM_DoPageAAction(old_page, form_, FPDFPAGE_AACTION_CLOSE); |
3192 } | 3202 } |
3193 most_visible_page_ = index; | 3203 most_visible_page_ = index; |
3194 #if defined(OS_LINUX) | 3204 #if defined(OS_LINUX) |
3195 g_last_instance_id = client_->GetPluginInstance()->pp_instance(); | 3205 g_last_instance_id = client_->GetPluginInstance()->pp_instance(); |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3519 if (index == -1) | 3529 if (index == -1) |
3520 index = engine->GetMostVisiblePage(); | 3530 index = engine->GetMostVisiblePage(); |
3521 */ | 3531 */ |
3522 if (index == -1) | 3532 if (index == -1) |
3523 return; | 3533 return; |
3524 | 3534 |
3525 // This is the only list of named actions per the spec (see 12.6.4.11). Adobe | 3535 // This is the only list of named actions per the spec (see 12.6.4.11). Adobe |
3526 // Reader supports more, like FitWidth, but since they're not part of the spec | 3536 // Reader supports more, like FitWidth, but since they're not part of the spec |
3527 // and we haven't got bugs about them, no need to now. | 3537 // and we haven't got bugs about them, no need to now. |
3528 if (action == "NextPage") { | 3538 if (action == "NextPage") { |
3529 engine->client_->ScrollToPage(index + 1); | 3539 engine->ScrollToPage(index + 1); |
3530 } else if (action == "PrevPage") { | 3540 } else if (action == "PrevPage") { |
3531 engine->client_->ScrollToPage(index - 1); | 3541 engine->ScrollToPage(index - 1); |
3532 } else if (action == "FirstPage") { | 3542 } else if (action == "FirstPage") { |
3533 engine->client_->ScrollToPage(0); | 3543 engine->ScrollToPage(0); |
3534 } else if (action == "LastPage") { | 3544 } else if (action == "LastPage") { |
3535 engine->client_->ScrollToPage(engine->pages_.size() - 1); | 3545 engine->ScrollToPage(engine->pages_.size() - 1); |
3536 } | 3546 } |
3537 } | 3547 } |
3538 | 3548 |
3539 void PDFiumEngine::Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param, | 3549 void PDFiumEngine::Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param, |
3540 FPDF_WIDESTRING value, | 3550 FPDF_WIDESTRING value, |
3541 FPDF_DWORD valueLen, | 3551 FPDF_DWORD valueLen, |
3542 FPDF_BOOL is_focus) { | 3552 FPDF_BOOL is_focus) { |
3543 // Do nothing for now. | 3553 // Do nothing for now. |
3544 // TODO(gene): use this signal to trigger OSK. | 3554 // TODO(gene): use this signal to trigger OSK. |
3545 } | 3555 } |
3546 | 3556 |
3547 void PDFiumEngine::Form_DoURIAction(FPDF_FORMFILLINFO* param, | 3557 void PDFiumEngine::Form_DoURIAction(FPDF_FORMFILLINFO* param, |
3548 FPDF_BYTESTRING uri) { | 3558 FPDF_BYTESTRING uri) { |
3549 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); | 3559 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
3550 engine->client_->NavigateTo(std::string(uri), CURRENT_TAB); | 3560 engine->client_->NavigateTo(std::string(uri), CURRENT_TAB); |
3551 } | 3561 } |
3552 | 3562 |
3553 void PDFiumEngine::Form_DoGoToAction(FPDF_FORMFILLINFO* param, | 3563 void PDFiumEngine::Form_DoGoToAction(FPDF_FORMFILLINFO* param, |
3554 int page_index, | 3564 int page_index, |
3555 int zoom_mode, | 3565 int zoom_mode, |
3556 float* position_array, | 3566 float* position_array, |
3557 int size_of_array) { | 3567 int size_of_array) { |
3558 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); | 3568 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
3559 engine->client_->ScrollToPage(page_index); | 3569 engine->ScrollToPage(page_index); |
3560 } | 3570 } |
3561 | 3571 |
3562 int PDFiumEngine::Form_Alert(IPDF_JSPLATFORM* param, | 3572 int PDFiumEngine::Form_Alert(IPDF_JSPLATFORM* param, |
3563 FPDF_WIDESTRING message, | 3573 FPDF_WIDESTRING message, |
3564 FPDF_WIDESTRING title, | 3574 FPDF_WIDESTRING title, |
3565 int type, | 3575 int type, |
3566 int icon) { | 3576 int icon) { |
3567 // See fpdfformfill.h for these values. | 3577 // See fpdfformfill.h for these values. |
3568 enum AlertType { | 3578 enum AlertType { |
3569 ALERT_TYPE_OK = 0, | 3579 ALERT_TYPE_OK = 0, |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3678 FPDF_WIDESTRING url) { | 3688 FPDF_WIDESTRING url) { |
3679 std::string url_str = | 3689 std::string url_str = |
3680 base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); | 3690 base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); |
3681 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); | 3691 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
3682 engine->client_->SubmitForm(url_str, form_data, length); | 3692 engine->client_->SubmitForm(url_str, form_data, length); |
3683 } | 3693 } |
3684 | 3694 |
3685 void PDFiumEngine::Form_GotoPage(IPDF_JSPLATFORM* param, | 3695 void PDFiumEngine::Form_GotoPage(IPDF_JSPLATFORM* param, |
3686 int page_number) { | 3696 int page_number) { |
3687 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); | 3697 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
3688 engine->client_->ScrollToPage(page_number); | 3698 engine->ScrollToPage(page_number); |
3689 } | 3699 } |
3690 | 3700 |
3691 int PDFiumEngine::Form_Browse(IPDF_JSPLATFORM* param, | 3701 int PDFiumEngine::Form_Browse(IPDF_JSPLATFORM* param, |
3692 void* file_path, | 3702 void* file_path, |
3693 int length) { | 3703 int length) { |
3694 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); | 3704 PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
3695 std::string path = engine->client_->ShowFileSelectionDialog(); | 3705 std::string path = engine->client_->ShowFileSelectionDialog(); |
3696 if (path.size() + 1 <= static_cast<size_t>(length)) | 3706 if (path.size() + 1 <= static_cast<size_t>(length)) |
3697 memcpy(file_path, &path[0], path.size() + 1); | 3707 memcpy(file_path, &path[0], path.size() + 1); |
3698 return path.size() + 1; | 3708 return path.size() + 1; |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3961 FPDF_DOCUMENT doc = | 3971 FPDF_DOCUMENT doc = |
3962 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); | 3972 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); |
3963 if (!doc) | 3973 if (!doc) |
3964 return false; | 3974 return false; |
3965 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | 3975 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
3966 FPDF_CloseDocument(doc); | 3976 FPDF_CloseDocument(doc); |
3967 return success; | 3977 return success; |
3968 } | 3978 } |
3969 | 3979 |
3970 } // namespace chrome_pdf | 3980 } // namespace chrome_pdf |
OLD | NEW |