Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Unified Diff: pdf/out_of_process_instance.cc

Issue 2050973003: PDF accessibility tweaks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@pdf_1_hastreedata
Patch Set: Rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pdf/out_of_process_instance.h ('k') | pdf/pdf_engine.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pdf/out_of_process_instance.cc
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc
index cb75b6bb07ef36fa0795f0b19b6a310d2f7e55b5..489a449923e2d143471b21193d5d8974acfcbc65 100644
--- a/pdf/out_of_process_instance.cc
+++ b/pdf/out_of_process_instance.cc
@@ -303,7 +303,7 @@ OutOfProcessInstance::OutOfProcessInstance(PP_Instance instance)
stop_scrolling_(false),
background_color_(0),
top_toolbar_height_(0),
- accessibility_enabled_(false) {
+ accessibility_state_(ACCESSIBILITY_STATE_OFF) {
loader_factory_.Initialize(this);
timer_factory_.Initialize(this);
form_factory_.Initialize(this);
@@ -630,17 +630,25 @@ void OutOfProcessInstance::GetPrintPresetOptionsFromDocument(
}
void OutOfProcessInstance::EnableAccessibility() {
- if (accessibility_enabled_)
+ if (accessibility_state_ == ACCESSIBILITY_STATE_LOADED)
return;
- accessibility_enabled_ = true;
+ if (accessibility_state_ == ACCESSIBILITY_STATE_OFF)
+ accessibility_state_ = ACCESSIBILITY_STATE_PENDING;
+ if (document_load_state_ == LOAD_STATE_COMPLETE)
+ LoadAccessibility();
+}
+
+void OutOfProcessInstance::LoadAccessibility() {
+ accessibility_state_ = ACCESSIBILITY_STATE_LOADED;
PP_PrivateAccessibilityDocInfo doc_info;
doc_info.page_count = engine_->GetNumberOfPages();
doc_info.text_accessible = PP_FromBool(
engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE));
doc_info.text_copyable = PP_FromBool(
engine_->HasPermission(PDFEngine::PERMISSION_COPY));
+
pp::PDF::SetAccessibilityDocInfo(GetPluginInstance(), &doc_info);
// If the document contents isn't accessible, don't send anything more.
@@ -677,7 +685,6 @@ void OutOfProcessInstance::SendNextAccessibilityPage(int32_t page_index) {
std::vector<PP_PrivateAccessibilityCharInfo> chars(page_info.char_count);
for (uint32_t i = 0; i < page_info.char_count; ++i) {
chars[i].unicode_character = engine_->GetCharUnicode(page_index, i);
- chars[i].char_width = engine_->GetCharWidth(page_index, i);
}
std::vector<PP_PrivateAccessibilityTextRunInfo> text_runs;
@@ -687,9 +694,30 @@ void OutOfProcessInstance::SendNextAccessibilityPage(int32_t page_index) {
pp::FloatRect bounds;
engine_->GetTextRunInfo(page_index, char_index, &text_run_info.len,
&text_run_info.font_size, &bounds);
+ DCHECK_LE(char_index + text_run_info.len,
+ static_cast<uint32_t>(char_count));
text_run_info.direction = PP_PRIVATEDIRECTION_LTR;
text_run_info.bounds = bounds;
text_runs.push_back(text_run_info);
+
+ // We need to provide enough information to draw a bounding box
+ // around any arbitrary text range, but the bounding boxes of characters
+ // we get from PDFium don't necessarily "line up". Walk through the
+ // characters in each text run and let the width of each character be
+ // the difference between the x coordinate of one character and the
+ // x coordinate of the next. The rest of the bounds of each character
+ // can be computed from the bounds of the text run.
+ pp::FloatRect char_bounds = engine_->GetCharBounds(page_index, char_index);
+ for (uint32_t i = 0; i < text_run_info.len - 1; i++) {
+ DCHECK_LT(char_index + i + 1,
+ static_cast<uint32_t>(char_count));
+ pp::FloatRect next_char_bounds = engine_->GetCharBounds(
+ page_index, char_index + i + 1);
+ chars[char_index + i].char_width = next_char_bounds.x() - char_bounds.x();
+ char_bounds = next_char_bounds;
+ }
+ chars[char_index + text_run_info.len - 1].char_width = char_bounds.width();
+
char_index += text_run_info.len;
}
@@ -1254,6 +1282,9 @@ void OutOfProcessInstance::DocumentLoadComplete(int page_count) {
pp::PDF::SetContentRestriction(this, content_restrictions);
uma_.HistogramCustomCounts("PDF.PageCount", page_count, 1, 1000000, 50);
+
+ if (accessibility_state_ == ACCESSIBILITY_STATE_PENDING)
+ LoadAccessibility();
}
void OutOfProcessInstance::RotateClockwise() {
« no previous file with comments | « pdf/out_of_process_instance.h ('k') | pdf/pdf_engine.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698