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

Unified Diff: components/pdf/renderer/pdf_accessibility_tree.cc

Issue 2371483002: Update PDF accessibility when zoom level changes (Closed)
Patch Set: Renamed PDF -> Plugin in content/renderer/ Created 4 years, 3 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 | « components/pdf/renderer/pdf_accessibility_tree.h ('k') | content/public/renderer/render_accessibility.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/pdf/renderer/pdf_accessibility_tree.cc
diff --git a/components/pdf/renderer/pdf_accessibility_tree.cc b/components/pdf/renderer/pdf_accessibility_tree.cc
index b4089015c3cd72df0833ea08f2476dfab7dd3aa4..2817090525797e4a5101ed7003ae0f222d580c6f 100644
--- a/components/pdf/renderer/pdf_accessibility_tree.cc
+++ b/components/pdf/renderer/pdf_accessibility_tree.cc
@@ -15,6 +15,7 @@
#include "grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/transform.h"
namespace pdf {
@@ -61,6 +62,15 @@ void PdfAccessibilityTree::SetAccessibilityViewportInfo(
scroll_.Scale(1.0 / zoom_);
offset_ = ToVector2dF(viewport_info.offset);
offset_.Scale(1.0 / zoom_);
+
+ content::RenderAccessibility* render_accessibility = GetRenderAccessibility();
+ if (render_accessibility && tree_.size() > 1) {
+ ui::AXNode* root = tree_.root();
+ ui::AXNodeData root_data = root->data();
+ root_data.transform = base::WrapUnique(MakeTransformFromViewInfo());
+ root->SetData(root_data);
+ render_accessibility->OnPluginRootNodeUpdated();
+ }
}
void PdfAccessibilityTree::SetAccessibilityDocInfo(
@@ -70,6 +80,12 @@ void PdfAccessibilityTree::SetAccessibilityDocInfo(
doc_info_ = doc_info;
doc_node_ = CreateNode(ui::AX_ROLE_GROUP);
+
+ // Because all of the coordinates are expressed relative to the
+ // doc's coordinates, the origin of the doc must be (0, 0). Its
+ // width and height will be updated as we add each page so that the
+ // doc's bounding box surrounds all pages.
+ doc_node_->location = gfx::RectF(0, 0, 1, 1);
}
void PdfAccessibilityTree::SetAccessibilityPageInfo(
@@ -91,9 +107,6 @@ void PdfAccessibilityTree::SetAccessibilityPageInfo(
IDS_PDF_PAGE_INDEX, page_index + 1));
gfx::RectF page_bounds = ToRectF(page_info.bounds);
- page_bounds += offset_;
- page_bounds -= scroll_;
- page_bounds.Scale(zoom_ / GetDeviceScaleFactor());
page_node->location = page_bounds;
doc_node_->location.Union(page_node->location);
doc_node_->child_ids.push_back(page_node->id);
@@ -142,7 +155,6 @@ void PdfAccessibilityTree::SetAccessibilityPageInfo(
inline_text_box_node->AddStringAttribute(ui::AX_ATTR_NAME, chars_utf8);
gfx::RectF text_run_bounds = ToGfxRectF(text_run.bounds);
- text_run_bounds.Scale(zoom_ / GetDeviceScaleFactor());
text_run_bounds += page_bounds.OffsetFromOrigin();
inline_text_box_node->location = text_run_bounds;
inline_text_box_node->AddIntListAttribute(ui::AX_ATTR_CHARACTER_OFFSETS,
@@ -173,6 +185,8 @@ void PdfAccessibilityTree::SetAccessibilityPageInfo(
}
void PdfAccessibilityTree::Finish() {
+ doc_node_->transform = base::WrapUnique(MakeTransformFromViewInfo());
+
ui::AXTreeUpdate update;
update.root_id = doc_node_->id;
for (const auto& node : nodes_)
@@ -181,7 +195,7 @@ void PdfAccessibilityTree::Finish() {
CHECK(tree_.Unserialize(update)) << update.ToString() << tree_.error();
content::RenderAccessibility* render_accessibility = GetRenderAccessibility();
if (render_accessibility)
- render_accessibility->SetPdfTreeSource(this);
+ render_accessibility->SetPluginTreeSource(this);
}
void PdfAccessibilityTree::ComputeParagraphAndHeadingThresholds(
@@ -241,7 +255,7 @@ std::vector<int32_t> PdfAccessibilityTree::GetTextRunCharOffsets(
double offset = 0.0;
for (uint32_t j = 0; j < text_run.len; ++j) {
offset += chars[char_index + j].char_width;
- char_offsets[j] = floor(offset * zoom_ / GetDeviceScaleFactor());
+ char_offsets[j] = floor(offset);
}
return char_offsets;
}
@@ -262,7 +276,14 @@ ui::AXNodeData* PdfAccessibilityTree::CreateNode(ui::AXRole role) {
node->id = render_accessibility->GenerateAXID();
node->role = role;
node->state = 1 << ui::AX_STATE_READ_ONLY;
+
+ // All nodes other than the first one have coordinates relative to
+ // the first node.
+ if (nodes_.size() > 0)
+ node->offset_container_id = nodes_[0]->id;
+
nodes_.push_back(base::WrapUnique(node));
+
return node;
}
@@ -279,6 +300,15 @@ content::RenderAccessibility* PdfAccessibilityTree::GetRenderAccessibility() {
return render_frame ? render_frame->GetRenderAccessibility() : nullptr;
}
+gfx::Transform* PdfAccessibilityTree::MakeTransformFromViewInfo() {
+ gfx::Transform* transform = new gfx::Transform();
+ float scale_factor = zoom_ / GetDeviceScaleFactor();
+ transform->Scale(scale_factor, scale_factor);
+ transform->Translate(offset_);
+ transform->Translate(-scroll_);
+ return transform;
+}
+
//
// AXTreeSource implementation.
//
« no previous file with comments | « components/pdf/renderer/pdf_accessibility_tree.h ('k') | content/public/renderer/render_accessibility.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698