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/out_of_process_instance.h" | 5 #include "pdf/out_of_process_instance.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> // for min/max() | 10 #include <algorithm> // for min/max() |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 // Selecting text in document (Plugin -> Page) | 146 // Selecting text in document (Plugin -> Page) |
147 const char kJSSetIsSelectingType[] = "setIsSelecting"; | 147 const char kJSSetIsSelectingType[] = "setIsSelecting"; |
148 const char kJSIsSelecting[] = "isSelecting"; | 148 const char kJSIsSelecting[] = "isSelecting"; |
149 | 149 |
150 // Notify when a form field is focused (Plugin -> Page) | 150 // Notify when a form field is focused (Plugin -> Page) |
151 const char kJSFieldFocusType[] = "formFocusChange"; | 151 const char kJSFieldFocusType[] = "formFocusChange"; |
152 const char kJSFieldFocus[] = "focused"; | 152 const char kJSFieldFocus[] = "focused"; |
153 | 153 |
154 const int kFindResultCooldownMs = 100; | 154 const int kFindResultCooldownMs = 100; |
155 | 155 |
| 156 // A delay to wait between each accessibility page to keep the system |
| 157 // responsive. |
| 158 const int kAccessibilityPageDelayMs = 100; |
| 159 |
156 const double kMinZoom = 0.01; | 160 const double kMinZoom = 0.01; |
157 | 161 |
158 namespace { | 162 namespace { |
159 | 163 |
160 static const char kPPPPdfInterface[] = PPP_PDF_INTERFACE_1; | 164 static const char kPPPPdfInterface[] = PPP_PDF_INTERFACE_1; |
161 | 165 |
162 // Used for UMA. Do not delete entries, and keep in sync with histograms.xml. | 166 // Used for UMA. Do not delete entries, and keep in sync with histograms.xml. |
163 enum PDFFeatures { | 167 enum PDFFeatures { |
164 LOADED_DOCUMENT = 0, | 168 LOADED_DOCUMENT = 0, |
165 HAS_TITLE = 1, | 169 HAS_TITLE = 1, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 PP_PdfPrintPresetOptions_Dev* options) { | 203 PP_PdfPrintPresetOptions_Dev* options) { |
200 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); | 204 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); |
201 if (object) { | 205 if (object) { |
202 OutOfProcessInstance* obj_instance = | 206 OutOfProcessInstance* obj_instance = |
203 static_cast<OutOfProcessInstance*>(object); | 207 static_cast<OutOfProcessInstance*>(object); |
204 obj_instance->GetPrintPresetOptionsFromDocument(options); | 208 obj_instance->GetPrintPresetOptionsFromDocument(options); |
205 } | 209 } |
206 return PP_TRUE; | 210 return PP_TRUE; |
207 } | 211 } |
208 | 212 |
| 213 void EnableAccessibility(PP_Instance instance) { |
| 214 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); |
| 215 if (object) { |
| 216 OutOfProcessInstance* obj_instance = |
| 217 static_cast<OutOfProcessInstance*>(object); |
| 218 return obj_instance->EnableAccessibility(); |
| 219 } |
| 220 } |
| 221 |
209 const PPP_Pdf ppp_private = { | 222 const PPP_Pdf ppp_private = { |
210 &GetLinkAtPosition, | 223 &GetLinkAtPosition, |
211 &Transform, | 224 &Transform, |
212 &GetPrintPresetOptionsFromDocument | 225 &GetPrintPresetOptionsFromDocument, |
| 226 &EnableAccessibility, |
213 }; | 227 }; |
214 | 228 |
215 int ExtractPrintPreviewPageIndex(const std::string& src_url) { | 229 int ExtractPrintPreviewPageIndex(const std::string& src_url) { |
216 // Sample |src_url| format: chrome://print/id/page_index/print.pdf | 230 // Sample |src_url| format: chrome://print/id/page_index/print.pdf |
217 std::vector<std::string> url_substr = base::SplitString( | 231 std::vector<std::string> url_substr = base::SplitString( |
218 src_url.substr(strlen(kChromePrint)), "/", | 232 src_url.substr(strlen(kChromePrint)), "/", |
219 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | 233 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
220 if (url_substr.size() != 3) | 234 if (url_substr.size() != 3) |
221 return -1; | 235 return -1; |
222 | 236 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 preview_document_load_state_(LOAD_STATE_COMPLETE), | 295 preview_document_load_state_(LOAD_STATE_COMPLETE), |
282 uma_(this), | 296 uma_(this), |
283 told_browser_about_unsupported_feature_(false), | 297 told_browser_about_unsupported_feature_(false), |
284 print_preview_page_count_(0), | 298 print_preview_page_count_(0), |
285 last_progress_sent_(0), | 299 last_progress_sent_(0), |
286 recently_sent_find_update_(false), | 300 recently_sent_find_update_(false), |
287 received_viewport_message_(false), | 301 received_viewport_message_(false), |
288 did_call_start_loading_(false), | 302 did_call_start_loading_(false), |
289 stop_scrolling_(false), | 303 stop_scrolling_(false), |
290 background_color_(0), | 304 background_color_(0), |
291 top_toolbar_height_(0) { | 305 top_toolbar_height_(0), |
| 306 accessibility_enabled_(false) { |
292 loader_factory_.Initialize(this); | 307 loader_factory_.Initialize(this); |
293 timer_factory_.Initialize(this); | 308 timer_factory_.Initialize(this); |
294 form_factory_.Initialize(this); | 309 form_factory_.Initialize(this); |
295 print_callback_factory_.Initialize(this); | 310 print_callback_factory_.Initialize(this); |
296 engine_.reset(PDFEngine::Create(this)); | 311 engine_.reset(PDFEngine::Create(this)); |
297 pp::Module::Get()->AddPluginInterface(kPPPPdfInterface, &ppp_private); | 312 pp::Module::Get()->AddPluginInterface(kPPPPdfInterface, &ppp_private); |
298 AddPerInstanceObject(kPPPPdfInterface, this); | 313 AddPerInstanceObject(kPPPPdfInterface, this); |
299 | 314 |
300 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_MOUSE); | 315 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_MOUSE); |
301 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); | 316 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 options->is_scaling_disabled = PP_FromBool(IsPrintScalingDisabled()); | 622 options->is_scaling_disabled = PP_FromBool(IsPrintScalingDisabled()); |
608 options->duplex = | 623 options->duplex = |
609 static_cast<PP_PrivateDuplexMode_Dev>(engine_->GetDuplexType()); | 624 static_cast<PP_PrivateDuplexMode_Dev>(engine_->GetDuplexType()); |
610 options->copies = engine_->GetCopiesToPrint(); | 625 options->copies = engine_->GetCopiesToPrint(); |
611 pp::Size uniform_page_size; | 626 pp::Size uniform_page_size; |
612 options->is_page_size_uniform = | 627 options->is_page_size_uniform = |
613 PP_FromBool(engine_->GetPageSizeAndUniformity(&uniform_page_size)); | 628 PP_FromBool(engine_->GetPageSizeAndUniformity(&uniform_page_size)); |
614 options->uniform_page_size = uniform_page_size; | 629 options->uniform_page_size = uniform_page_size; |
615 } | 630 } |
616 | 631 |
| 632 void OutOfProcessInstance::EnableAccessibility() { |
| 633 if (accessibility_enabled_) |
| 634 return; |
| 635 |
| 636 accessibility_enabled_ = true; |
| 637 |
| 638 PP_PrivateAccessibilityDocInfo doc_info; |
| 639 doc_info.page_count = engine_->GetNumberOfPages(); |
| 640 doc_info.text_accessible = PP_FromBool( |
| 641 engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE)); |
| 642 doc_info.text_copyable = PP_FromBool( |
| 643 engine_->HasPermission(PDFEngine::PERMISSION_COPY)); |
| 644 pp::PDF::SetAccessibilityDocInfo(GetPluginInstance(), &doc_info); |
| 645 |
| 646 // If the document contents isn't accessible, don't send anything more. |
| 647 if (!(engine_->HasPermission(PDFEngine::PERMISSION_COPY) || |
| 648 engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE))) { |
| 649 return; |
| 650 } |
| 651 |
| 652 PP_PrivateAccessibilityViewportInfo viewport_info; |
| 653 viewport_info.scroll.x = 0; |
| 654 viewport_info.scroll.y = -top_toolbar_height_ * device_scale_; |
| 655 viewport_info.offset = available_area_.point(); |
| 656 viewport_info.zoom = zoom_; |
| 657 pp::PDF::SetAccessibilityViewportInfo(GetPluginInstance(), &viewport_info); |
| 658 |
| 659 // Schedule loading the first page. |
| 660 pp::CompletionCallback callback = timer_factory_.NewCallback( |
| 661 &OutOfProcessInstance::SendNextAccessibilityPage); |
| 662 pp::Module::Get()->core()->CallOnMainThread(kAccessibilityPageDelayMs, |
| 663 callback, 0); |
| 664 } |
| 665 |
| 666 void OutOfProcessInstance::SendNextAccessibilityPage(int32_t page_index) { |
| 667 int page_count = engine_->GetNumberOfPages(); |
| 668 if (page_index < 0 || page_index >= page_count) |
| 669 return; |
| 670 |
| 671 int char_count = engine_->GetCharCount(page_index); |
| 672 PP_PrivateAccessibilityPageInfo page_info; |
| 673 page_info.page_index = page_index; |
| 674 page_info.bounds = engine_->GetPageBoundsRect(page_index); |
| 675 page_info.char_count = char_count; |
| 676 |
| 677 std::vector<PP_PrivateAccessibilityCharInfo> chars(page_info.char_count); |
| 678 for (uint32_t i = 0; i < page_info.char_count; ++i) { |
| 679 chars[i].unicode_character = engine_->GetCharUnicode(page_index, i); |
| 680 chars[i].char_width = engine_->GetCharWidth(page_index, i); |
| 681 } |
| 682 |
| 683 std::vector<PP_PrivateAccessibilityTextRunInfo> text_runs; |
| 684 int char_index = 0; |
| 685 while (char_index < char_count) { |
| 686 PP_PrivateAccessibilityTextRunInfo text_run_info; |
| 687 pp::FloatRect bounds; |
| 688 engine_->GetTextRunInfo(page_index, char_index, &text_run_info.len, |
| 689 &text_run_info.font_size, &bounds); |
| 690 text_run_info.direction = PP_PRIVATEDIRECTION_LTR; |
| 691 text_run_info.bounds = bounds; |
| 692 text_runs.push_back(text_run_info); |
| 693 char_index += text_run_info.len; |
| 694 } |
| 695 |
| 696 page_info.text_run_count = text_runs.size(); |
| 697 pp::PDF::SetAccessibilityPageInfo(GetPluginInstance(), &page_info, |
| 698 text_runs.data(), chars.data()); |
| 699 |
| 700 // Schedule loading the next page. |
| 701 pp::CompletionCallback callback = timer_factory_.NewCallback( |
| 702 &OutOfProcessInstance::SendNextAccessibilityPage); |
| 703 pp::Module::Get()->core()->CallOnMainThread(kAccessibilityPageDelayMs, |
| 704 callback, page_index + 1); |
| 705 } |
| 706 |
617 pp::Var OutOfProcessInstance::GetLinkAtPosition( | 707 pp::Var OutOfProcessInstance::GetLinkAtPosition( |
618 const pp::Point& point) { | 708 const pp::Point& point) { |
619 pp::Point offset_point(point); | 709 pp::Point offset_point(point); |
620 ScalePoint(device_scale_, &offset_point); | 710 ScalePoint(device_scale_, &offset_point); |
621 offset_point.set_x(offset_point.x() - available_area_.x()); | 711 offset_point.set_x(offset_point.x() - available_area_.x()); |
622 return engine_->GetLinkAtPosition(offset_point); | 712 return engine_->GetLinkAtPosition(offset_point); |
623 } | 713 } |
624 | 714 |
625 uint32_t OutOfProcessInstance::QuerySupportedPrintOutputFormats() { | 715 uint32_t OutOfProcessInstance::QuerySupportedPrintOutputFormats() { |
626 return engine_->QuerySupportedPrintOutputFormats(); | 716 return engine_->QuerySupportedPrintOutputFormats(); |
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1436 const pp::FloatPoint& scroll_offset) { | 1526 const pp::FloatPoint& scroll_offset) { |
1437 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); | 1527 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); |
1438 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f); | 1528 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f); |
1439 float min_y = -top_toolbar_height_; | 1529 float min_y = -top_toolbar_height_; |
1440 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); | 1530 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); |
1441 float y = std::max(std::min(scroll_offset.y(), max_y), min_y); | 1531 float y = std::max(std::min(scroll_offset.y(), max_y), min_y); |
1442 return pp::FloatPoint(x, y); | 1532 return pp::FloatPoint(x, y); |
1443 } | 1533 } |
1444 | 1534 |
1445 } // namespace chrome_pdf | 1535 } // namespace chrome_pdf |
OLD | NEW |