blob: c0a81cb9ced209eb713a877ae97c5f3f3fdebc8c [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "pdf/accessibility.h"
#include <algorithm>
#include <utility>
#include <vector>
#include "base/check_op.h"
#include "base/numerics/safe_math.h"
#include "pdf/accessibility_helper.h"
#include "pdf/accessibility_structs.h"
#include "pdf/pdfium/pdfium_engine.h"
#include "ui/gfx/geometry/rect_f.h"
namespace chrome_pdf {
namespace {
AccessibilityFormFieldInfo GetAccessibilityFormFieldInfo(
PDFiumPage* page,
uint32_t text_run_count) {
AccessibilityFormFieldInfo form_field_info;
form_field_info.text_fields = page->GetTextFieldInfo(text_run_count);
return form_field_info;
}
} // namespace
void GetAccessibilityInfo(PDFiumEngine* engine,
int32_t page_index,
AccessibilityPageInfo& page_info,
std::vector<AccessibilityTextRunInfo>& text_runs,
std::vector<AccessibilityCharInfo>& chars,
AccessibilityPageObjects& page_objects) {
PDFiumPage* page = engine->GetPage(page_index);
CHECK(page);
const int raw_char_count = page->GetCharCount();
// Treat a char count of -1 (error) as 0 (an empty page), since
// other pages might have valid content.
const uint32_t char_count = std::max<uint32_t>(raw_char_count, 0);
page_info.page_index = page_index;
page_info.bounds = page->rect();
page_info.char_count = char_count;
#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
page_info.is_searchified = page->IsPageSearchified();
#else
page_info.is_searchified = false;
#endif
page->GetTextAndImageInfo(text_runs, chars, page_objects.images);
page_info.text_run_count = text_runs.size();
page_objects.links = page->GetLinkInfo(text_runs);
page_objects.highlights = page->GetHighlightInfo(text_runs);
page_objects.form_fields =
GetAccessibilityFormFieldInfo(page, page_info.text_run_count);
}
} // namespace chrome_pdf