diff options
Diffstat (limited to 'chromium/components/pdf')
16 files changed, 136 insertions, 218 deletions
diff --git a/chromium/components/pdf/browser/BUILD.gn b/chromium/components/pdf/browser/BUILD.gn index 5a9998a5fd7..efb41083a23 100644 --- a/chromium/components/pdf/browser/BUILD.gn +++ b/chromium/components/pdf/browser/BUILD.gn @@ -17,7 +17,6 @@ static_library("browser") { deps = [ "//base", "//content/public/browser", - "//pdf:features", "//ui/base", "//ui/touch_selection", ] diff --git a/chromium/components/pdf/browser/mock_url_loader_client.h b/chromium/components/pdf/browser/mock_url_loader_client.h index 554b1b4817e..6d2f8ad17de 100644 --- a/chromium/components/pdf/browser/mock_url_loader_client.h +++ b/chromium/components/pdf/browser/mock_url_loader_client.h @@ -25,7 +25,8 @@ class MockURLLoaderClient : public network::mojom::URLLoaderClient { (override)); MOCK_METHOD(void, OnReceiveResponse, - (network::mojom::URLResponseHeadPtr head), + (network::mojom::URLResponseHeadPtr head, + mojo::ScopedDataPipeConsumerHandle body), (override)); MOCK_METHOD(void, OnReceiveRedirect, diff --git a/chromium/components/pdf/browser/pdf_web_contents_helper.cc b/chromium/components/pdf/browser/pdf_web_contents_helper.cc index 4c21f244032..26a4f75cb3d 100644 --- a/chromium/components/pdf/browser/pdf_web_contents_helper.cc +++ b/chromium/components/pdf/browser/pdf_web_contents_helper.cc @@ -6,15 +6,12 @@ #include <utility> -#include "base/feature_list.h" #include "base/memory/ptr_util.h" #include "base/notreached.h" #include "components/pdf/browser/pdf_web_contents_helper_client.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/common/referrer_type_converters.h" -#include "pdf/pdf_features.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "ui/base/pointer/touch_editing_controller.h" #include "ui/base/ui_base_types.h" #include "ui/gfx/geometry/point_conversions.h" @@ -54,6 +51,9 @@ PDFWebContentsHelper::PDFWebContentsHelper( client_(std::move(client)) {} PDFWebContentsHelper::~PDFWebContentsHelper() { + if (pdf_rwh_) + pdf_rwh_->RemoveObserver(this); + if (!touch_selection_controller_client_manager_) return; @@ -73,19 +73,27 @@ void PDFWebContentsHelper::SetListener( mojo::PendingRemote<mojom::PdfListener> listener) { remote_pdf_client_.reset(); remote_pdf_client_.Bind(std::move(listener)); + + if (pdf_rwh_) + pdf_rwh_->RemoveObserver(this); + pdf_rwh_ = client_->FindPdfFrame(&GetWebContents())->GetRenderWidgetHost(); + pdf_rwh_->AddObserver(this); } gfx::PointF PDFWebContentsHelper::ConvertHelper(const gfx::PointF& point_f, float scale) { - gfx::PointF origin_f; - content::RenderWidgetHostView* view = - GetWebContents().GetRenderWidgetHostView(); - if (view) { - origin_f = view->TransformPointToRootCoordSpaceF(gfx::PointF()); - origin_f.Scale(scale); - } + if (!pdf_rwh_) + return point_f; + + content::RenderWidgetHostView* view = pdf_rwh_->GetView(); + if (!view) + return point_f; + + gfx::Vector2dF offset = + view->TransformPointToRootCoordSpaceF(gfx::PointF()).OffsetFromOrigin(); + offset.Scale(scale); - return gfx::PointF(point_f.x() + origin_f.x(), point_f.y() + origin_f.y()); + return point_f + offset; } gfx::PointF PDFWebContentsHelper::ConvertFromRoot(const gfx::PointF& point_f) { @@ -112,21 +120,6 @@ void PDFWebContentsHelper::SetPluginCanSave(bool can_save) { client_->SetPluginCanSave(&GetWebContents(), can_save); } -void PDFWebContentsHelper::GetPdfFindInPage(GetPdfFindInPageCallback callback) { - if (!base::FeatureList::IsEnabled(chrome_pdf::features::kPdfUnseasoned)) { - NOTREACHED(); - return; - } - - if (!find_factory_remote_) { - GetWebContents() - .GetMainFrame() - ->GetRemoteAssociatedInterfaces() - ->GetInterface(&find_factory_remote_); - } - find_factory_remote_->GetPdfFindInPage(std::move(callback)); -} - void PDFWebContentsHelper::DidScroll() { if (!touch_selection_controller_client_manager_) InitTouchSelectionClientManager(); @@ -163,6 +156,12 @@ void PDFWebContentsHelper::DidScroll() { } } +void PDFWebContentsHelper::RenderWidgetHostDestroyed( + content::RenderWidgetHost* widget_host) { + if (pdf_rwh_ == widget_host) + pdf_rwh_ = nullptr; +} + bool PDFWebContentsHelper::SupportsAnimation() const { return false; } diff --git a/chromium/components/pdf/browser/pdf_web_contents_helper.h b/chromium/components/pdf/browser/pdf_web_contents_helper.h index 73e1c8e29fe..a799667a1ae 100644 --- a/chromium/components/pdf/browser/pdf_web_contents_helper.h +++ b/chromium/components/pdf/browser/pdf_web_contents_helper.h @@ -9,9 +9,9 @@ #include "base/memory/raw_ptr.h" #include "content/public/browser/render_frame_host_receiver_set.h" +#include "content/public/browser/render_widget_host_observer.h" #include "content/public/browser/touch_selection_controller_client_manager.h" #include "content/public/browser/web_contents_user_data.h" -#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "pdf/mojom/pdf.mojom.h" @@ -20,6 +20,7 @@ #include "ui/touch_selection/touch_selection_menu_runner.h" namespace content { +class RenderWidgetHost; class WebContents; } @@ -31,6 +32,7 @@ class PDFWebContentsHelperTest; // Per-WebContents class to handle PDF messages. class PDFWebContentsHelper : public content::WebContentsUserData<PDFWebContentsHelper>, + public content::RenderWidgetHostObserver, public mojom::PdfService, public ui::TouchSelectionControllerClient, public ui::TouchSelectionMenuClient, @@ -48,7 +50,11 @@ class PDFWebContentsHelper mojo::PendingAssociatedReceiver<mojom::PdfService> pdf_service, content::RenderFrameHost* rfh); - // ui::TouchSelectionControllerClient : + // content::RenderWidgetHostObserver: + void RenderWidgetHostDestroyed( + content::RenderWidgetHost* widget_host) override; + + // ui::TouchSelectionControllerClient: bool SupportsAnimation() const override; void SetNeedsAnimate() override {} void MoveCaret(const gfx::PointF& position) override; @@ -72,6 +78,18 @@ class PDFWebContentsHelper void OnManagerWillDestroy( content::TouchSelectionControllerClientManager* manager) override; + // pdf::mojom::PdfService: + void SetListener(mojo::PendingRemote<mojom::PdfListener> listener) override; + void HasUnsupportedFeature() override; + void SaveUrlAs(const GURL& url, + network::mojom::ReferrerPolicy policy) override; + void UpdateContentRestrictions(int32_t content_restrictions) override; + void SelectionChanged(const gfx::PointF& left, + int32_t left_height, + const gfx::PointF& right, + int32_t right_height) override; + void SetPluginCanSave(bool can_save) override; + private: friend class content::WebContentsUserData<PDFWebContentsHelper>; friend class PDFWebContentsHelperTest; @@ -84,24 +102,16 @@ class PDFWebContentsHelper gfx::PointF ConvertToRoot(const gfx::PointF& point_f); gfx::PointF ConvertHelper(const gfx::PointF& point_f, float scale); - // mojom::PdfService: - void SetListener(mojo::PendingRemote<mojom::PdfListener> listener) override; - void HasUnsupportedFeature() override; - void SaveUrlAs(const GURL& url, - network::mojom::ReferrerPolicy policy) override; - void UpdateContentRestrictions(int32_t content_restrictions) override; - void SelectionChanged(const gfx::PointF& left, - int32_t left_height, - const gfx::PointF& right, - int32_t right_height) override; - void SetPluginCanSave(bool can_save) override; - void GetPdfFindInPage(GetPdfFindInPageCallback callback) override; - content::RenderFrameHostReceiverSet<mojom::PdfService> pdf_service_receivers_; std::unique_ptr<PDFWebContentsHelperClient> const client_; raw_ptr<content::TouchSelectionControllerClientManager> touch_selection_controller_client_manager_ = nullptr; + // The `RenderWidgetHost` associated to the frame containing the PDF plugin. + // This should be null until the plugin is known to have been created; the + // signal comes from `SetListener()`. + raw_ptr<content::RenderWidgetHost> pdf_rwh_ = nullptr; + // Latest selection bounds received from PDFium. gfx::PointF selection_left_; int32_t selection_left_height_ = 0; @@ -111,8 +121,6 @@ class PDFWebContentsHelper mojo::Remote<mojom::PdfListener> remote_pdf_client_; - mojo::AssociatedRemote<mojom::PdfFindInPageFactory> find_factory_remote_; - WEB_CONTENTS_USER_DATA_KEY_DECL(); }; diff --git a/chromium/components/pdf/browser/pdf_web_contents_helper_browsertest.cc b/chromium/components/pdf/browser/pdf_web_contents_helper_browsertest.cc index ecb8fc5f222..02f603b6bfa 100644 --- a/chromium/components/pdf/browser/pdf_web_contents_helper_browsertest.cc +++ b/chromium/components/pdf/browser/pdf_web_contents_helper_browsertest.cc @@ -10,10 +10,35 @@ #include "content/public/test/browser_test.h" #include "content/public/test/content_browser_test.h" #include "content/shell/browser/shell.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "pdf/mojom/pdf.mojom.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/selection_bound.h" namespace pdf { +namespace { + +using ::testing::NiceMock; + +class FakePdfListener : public pdf::mojom::PdfListener { + public: + FakePdfListener() = default; + FakePdfListener(const FakePdfListener&) = delete; + FakePdfListener& operator=(const FakePdfListener&) = delete; + ~FakePdfListener() override = default; + + MOCK_METHOD(void, SetCaretPosition, (const gfx::PointF&), (override)); + MOCK_METHOD(void, MoveRangeSelectionExtent, (const gfx::PointF&), (override)); + MOCK_METHOD(void, + SetSelectionBounds, + (const gfx::PointF&, const gfx::PointF&), + (override)); +}; + +} // namespace + // A mock PDFWebContentsHelperClient. class TestPDFWebContentsHelperClient : public PDFWebContentsHelperClient { public: @@ -26,6 +51,11 @@ class TestPDFWebContentsHelperClient : public PDFWebContentsHelperClient { private: // PDFWebContentsHelperClient: + content::RenderFrameHost* FindPdfFrame( + content::WebContents* contents) override { + return contents->GetMainFrame(); + } + void UpdateContentRestrictions(content::WebContents* contents, int content_restrictions) override {} void OnPDFHasUnsupportedFeature(content::WebContents* contents) override {} @@ -122,6 +152,20 @@ class PDFWebContentsHelperTest : public content::ContentBrowserTest { touch_selection_controller_client_manager_; }; +IN_PROC_BROWSER_TEST_F(PDFWebContentsHelperTest, SetListenerTwice) { + NiceMock<FakePdfListener> listener; + + { + mojo::Receiver<pdf::mojom::PdfListener> receiver(&listener); + pdf_web_contents_helper()->SetListener(receiver.BindNewPipeAndPassRemote()); + } + + { + mojo::Receiver<pdf::mojom::PdfListener> receiver(&listener); + pdf_web_contents_helper()->SetListener(receiver.BindNewPipeAndPassRemote()); + } +} + // Tests that select-changed on a pdf text brings up selection handles and the // quick menu in the reasonable position. IN_PROC_BROWSER_TEST_F(PDFWebContentsHelperTest, SelectionChanged) { diff --git a/chromium/components/pdf/browser/pdf_web_contents_helper_client.h b/chromium/components/pdf/browser/pdf_web_contents_helper_client.h index fcf515e3c44..2af85f9ed40 100644 --- a/chromium/components/pdf/browser/pdf_web_contents_helper_client.h +++ b/chromium/components/pdf/browser/pdf_web_contents_helper_client.h @@ -6,6 +6,7 @@ #define COMPONENTS_PDF_BROWSER_PDF_WEB_CONTENTS_HELPER_CLIENT_H_ namespace content { +class RenderFrameHost; class WebContents; } @@ -13,7 +14,10 @@ namespace pdf { class PDFWebContentsHelperClient { public: - virtual ~PDFWebContentsHelperClient() {} + virtual ~PDFWebContentsHelperClient() = default; + + virtual content::RenderFrameHost* FindPdfFrame( + content::WebContents* contents) = 0; virtual void UpdateContentRestrictions(content::WebContents* contents, int content_restrictions) = 0; diff --git a/chromium/components/pdf/browser/plugin_response_writer.cc b/chromium/components/pdf/browser/plugin_response_writer.cc index 9ca8573fdd3..44ea938ad64 100644 --- a/chromium/components/pdf/browser/plugin_response_writer.cc +++ b/chromium/components/pdf/browser/plugin_response_writer.cc @@ -57,6 +57,11 @@ embed { position: fixed; top: 0; } + +/* Hide scrollbars when in Presentation mode. */ +.fullscreen { + overflow: hidden; +} </style> <div id="sizer"></div> <embed type="application/x-google-chrome-pdf" src="$1" original-url="$2" @@ -69,7 +74,7 @@ $3 // TODO(crbug.com/1252096): We should load the injected scripts as network // resources instead. Until then, feel free to raise this limit as necessary. if (stream_info.injected_script) - DCHECK_LE(stream_info.injected_script->size(), 8'192u); + DCHECK_LE(stream_info.injected_script->size(), 16'384u); return base::ReplaceStringPlaceholders( kResponseTemplate, @@ -95,7 +100,8 @@ void PluginResponseWriter::Start(base::OnceClosure done_callback) { response->headers = base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK"); response->mime_type = "text/html"; - client_->OnReceiveResponse(std::move(response)); + client_->OnReceiveResponse(std::move(response), + mojo::ScopedDataPipeConsumerHandle()); mojo::ScopedDataPipeProducerHandle producer; mojo::ScopedDataPipeConsumerHandle consumer; diff --git a/chromium/components/pdf/browser/plugin_response_writer_unittest.cc b/chromium/components/pdf/browser/plugin_response_writer_unittest.cc index de2ad3c1594..19f59446d2b 100644 --- a/chromium/components/pdf/browser/plugin_response_writer_unittest.cc +++ b/chromium/components/pdf/browser/plugin_response_writer_unittest.cc @@ -139,7 +139,8 @@ TEST_F(PluginResponseWriterTest, Start) { testing::InSequence in_sequence; EXPECT_CALL(mock_client_, OnReceiveResponse) - .WillOnce([](network::mojom::URLResponseHeadPtr head) { + .WillOnce([](network::mojom::URLResponseHeadPtr head, + mojo::ScopedDataPipeConsumerHandle body) { EXPECT_EQ(200, head->headers->response_code()); EXPECT_EQ("text/html", head->mime_type); }); diff --git a/chromium/components/pdf/renderer/BUILD.gn b/chromium/components/pdf/renderer/BUILD.gn index b43840e4029..d61e395a8a9 100644 --- a/chromium/components/pdf/renderer/BUILD.gn +++ b/chromium/components/pdf/renderer/BUILD.gn @@ -14,7 +14,6 @@ static_library("renderer") { "internal_plugin_renderer_helpers.h", "pdf_accessibility_tree.h", "pdf_ax_action_target.h", - "pdf_find_in_page.h", "pdf_internal_plugin_delegate.h", "pepper_pdf_host.h", ] @@ -23,7 +22,6 @@ static_library("renderer") { "internal_plugin_renderer_helpers.cc", "pdf_accessibility_tree.cc", "pdf_ax_action_target.cc", - "pdf_find_in_page.cc", "pdf_internal_plugin_delegate.cc", "pdf_view_web_plugin_client.cc", "pdf_view_web_plugin_client.h", @@ -48,7 +46,7 @@ static_library("renderer") { "//ppapi/shared_impl", "//printing/buildflags", "//third_party/blink/public:blink", - "//third_party/blink/public/strings:strings_grit", + "//third_party/blink/public/strings:accessibility_strings", "//third_party/icu", "//url", "//v8", diff --git a/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.cc b/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.cc index 5ceed0ce692..3334ea4598c 100644 --- a/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.cc +++ b/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.cc @@ -8,9 +8,11 @@ #include <utility> #include "base/check.h" +#include "base/command_line.h" #include "base/feature_list.h" #include "components/pdf/renderer/pdf_internal_plugin_delegate.h" #include "components/pdf/renderer/pdf_view_web_plugin_client.h" +#include "content/public/common/content_switches.h" #include "content/public/renderer/render_frame.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "pdf/mojom/pdf.mojom.h" @@ -27,6 +29,12 @@ namespace pdf { +bool IsPdfRenderer() { + static const bool has_switch = + base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kPdfRenderer); + return has_switch; +} + blink::WebPlugin* CreateInternalPlugin( const content::WebPluginInfo& info, blink::WebPluginParams params, @@ -56,6 +64,9 @@ blink::WebPlugin* CreateInternalPlugin( return nullptr; } + // Only create the in-process plugin within a PDF renderer. + CHECK(IsPdfRenderer()); + // Origins allowed to embed the internal plugin are trusted (the PDF viewer // and Print Preview), and should never directly create the in-process plugin. // Likewise, they should not share a process with this frame. diff --git a/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.h b/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.h index 4ee7df5fb0b..64a48acb15f 100644 --- a/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.h +++ b/chromium/components/pdf/renderer/internal_plugin_renderer_helpers.h @@ -21,6 +21,9 @@ namespace pdf { class PdfInternalPluginDelegate; +// Returns `true` if the current process is a PDF renderer. +bool IsPdfRenderer(); + // Tries to create an instance of the internal PDF plugin, returning `nullptr` // if the plugin cannot be created. This function handles both the Pepper and // Pepper-free implementations, delegating to `content::RenderFrame` when diff --git a/chromium/components/pdf/renderer/pdf_accessibility_tree.cc b/chromium/components/pdf/renderer/pdf_accessibility_tree.cc index d23fcd2c16e..da26cbc0350 100644 --- a/chromium/components/pdf/renderer/pdf_accessibility_tree.cc +++ b/chromium/components/pdf/renderer/pdf_accessibility_tree.cc @@ -9,6 +9,7 @@ #include "base/i18n/break_iterator.h" #include "base/memory/ptr_util.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/strings/utf_string_conversion_utils.h" #include "components/pdf/renderer/pdf_ax_action_target.h" @@ -20,7 +21,7 @@ #include "pdf/accessibility_structs.h" #include "pdf/pdf_accessibility_action_handler.h" #include "pdf/pdf_features.h" -#include "third_party/blink/public/strings/grit/blink_strings.h" +#include "third_party/blink/public/strings/grit/blink_accessibility_strings.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/null_ax_action_target.h" #include "ui/base/l10n/l10n_util.h" @@ -1384,6 +1385,8 @@ void PdfAccessibilityTree::SetAccessibilityPageInfo( AddPageContent(page_node, page_bounds, page_index, text_runs, chars, page_objects); + did_get_a_text_run_ |= !text_runs.empty(); + if (page_index == page_count_ - 1) Finish(); } @@ -1423,6 +1426,9 @@ void PdfAccessibilityTree::Finish() { GetRenderAccessibilityIfEnabled(); if (render_accessibility) render_accessibility->SetPluginTreeSource(this); + + base::UmaHistogramBoolean("Accessibility.PDF.HasAccessibleText", + did_get_a_text_run_); } void PdfAccessibilityTree::UpdateAXTreeDataFromSelection() { diff --git a/chromium/components/pdf/renderer/pdf_accessibility_tree.h b/chromium/components/pdf/renderer/pdf_accessibility_tree.h index 2747de14f12..18a5e81578a 100644 --- a/chromium/components/pdf/renderer/pdf_accessibility_tree.h +++ b/chromium/components/pdf/renderer/pdf_accessibility_tree.h @@ -198,6 +198,8 @@ class PdfAccessibilityTree : public content::PluginAXTreeSource, // outdated calls of SetAccessibilityPageInfo(). uint32_t next_page_index_ = 0; + bool did_get_a_text_run_ = false; + base::WeakPtrFactory<PdfAccessibilityTree> weak_ptr_factory_{this}; }; diff --git a/chromium/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc b/chromium/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc index 9f54431a682..51d8a99c142 100644 --- a/chromium/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc +++ b/chromium/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc @@ -15,7 +15,7 @@ #include "pdf/accessibility_structs.h" #include "pdf/pdf_accessibility_action_handler.h" #include "pdf/pdf_features.h" -#include "third_party/blink/public/strings/grit/blink_strings.h" +#include "third_party/blink/public/strings/grit/blink_accessibility_strings.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_settings.h" #include "third_party/blink/public/web/web_view.h" diff --git a/chromium/components/pdf/renderer/pdf_find_in_page.cc b/chromium/components/pdf/renderer/pdf_find_in_page.cc deleted file mode 100644 index 174e75cad36..00000000000 --- a/chromium/components/pdf/renderer/pdf_find_in_page.cc +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/pdf/renderer/pdf_find_in_page.h" - -#include <memory> -#include <utility> - -#include "base/check.h" -#include "base/feature_list.h" -#include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_frame_observer.h" -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/receiver.h" -#include "pdf/pdf_features.h" -#include "third_party/blink/public/platform/web_vector.h" -#include "third_party/blink/public/web/web_document.h" -#include "third_party/blink/public/web/web_element.h" -#include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_node.h" - -namespace { - -blink::WebElement FindPdfViewerScroller(const blink::WebLocalFrame* frame) { - blink::WebElement viewer = frame->GetDocument().GetElementById("viewer"); - if (viewer.IsNull()) - return blink::WebElement(); - - blink::WebNode shadow_root = viewer.ShadowRoot(); - if (shadow_root.IsNull()) - return blink::WebElement(); - - blink::WebElement plugin = shadow_root.QuerySelector("#plugin"); - if (plugin.IsNull() || !plugin.HasAttribute("pdf-viewer-update-enabled")) - return blink::WebElement(); - - return shadow_root.QuerySelector("#scroller"); -} - -} // namespace - -namespace pdf { - -// static -void PdfFindInPageFactory::BindReceiver( - int32_t routing_id, - mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory> - receiver) { - DCHECK(base::FeatureList::IsEnabled(chrome_pdf::features::kPdfUnseasoned)); - - auto* render_frame = content::RenderFrame::FromRoutingID(routing_id); - if (!render_frame) - return; - - // PdfFindInPageFactory is self deleting. - new PdfFindInPageFactory(render_frame, std::move(receiver)); -} - -void PdfFindInPageFactory::OnDestruct() { - delete this; -} - -void PdfFindInPageFactory::GetPdfFindInPage(GetPdfFindInPageCallback callback) { - mojo::PendingReceiver<pdf::mojom::PdfFindInPage> pending_receiver; - auto pending_remote = pending_receiver.InitWithNewPipeAndPassRemote(); - find_in_page_ = std::make_unique<FindInPageImpl>(render_frame(), - std::move(pending_receiver)); - std::move(callback).Run(std::move(pending_remote)); -} - -PdfFindInPageFactory::PdfFindInPageFactory( - content::RenderFrame* render_frame, - mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory> receiver) - : content::RenderFrameObserver(render_frame), - receiver_(this, std::move(receiver)) {} - -PdfFindInPageFactory::~PdfFindInPageFactory() = default; - -class PdfFindInPageFactory::FindInPageImpl : public pdf::mojom::PdfFindInPage { - public: - FindInPageImpl( - content::RenderFrame* render_frame, - mojo::PendingReceiver<pdf::mojom::PdfFindInPage> pending_receiver) - : render_frame_(render_frame), - receiver_(this, std::move(pending_receiver)) {} - - FindInPageImpl(const FindInPageImpl&) = delete; - FindInPageImpl& operator=(const FindInPageImpl&) = delete; - - ~FindInPageImpl() override = default; - - // pdf::mojom::PdfFindInPage: - void SetTickmarks(const std::vector<gfx::Rect>& tickmarks) override { - blink::WebVector<gfx::Rect> tickmarks_converted(tickmarks); - blink::WebLocalFrame* frame = render_frame_->GetWebFrame(); - blink::WebElement target = FindPdfViewerScroller(frame); - frame->SetTickmarks(target, tickmarks_converted); - } - - private: - content::RenderFrame* const render_frame_; - mojo::Receiver<pdf::mojom::PdfFindInPage> receiver_; -}; - -} // namespace pdf diff --git a/chromium/components/pdf/renderer/pdf_find_in_page.h b/chromium/components/pdf/renderer/pdf_find_in_page.h deleted file mode 100644 index 12fb253dbe9..00000000000 --- a/chromium/components/pdf/renderer/pdf_find_in_page.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_PDF_RENDERER_PDF_FIND_IN_PAGE_H_ -#define COMPONENTS_PDF_RENDERER_PDF_FIND_IN_PAGE_H_ - -#include <stdint.h> - -#include <memory> - -#include "content/public/renderer/render_frame_observer.h" -#include "mojo/public/cpp/bindings/associated_receiver.h" -#include "mojo/public/cpp/bindings/pending_associated_receiver.h" -#include "pdf/mojom/pdf.mojom.h" - -namespace content { -class RenderFrame; -} - -namespace pdf { - -// Facilitates find-in-page IPCs from PDF renderer to PDF extension. -// Has the same lifetime as the RenderFrame it is associated with. -class PdfFindInPageFactory : public content::RenderFrameObserver, - public pdf::mojom::PdfFindInPageFactory { - public: - static void BindReceiver( - int32_t routing_id, - mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory> - receiver); - - PdfFindInPageFactory(const PdfFindInPageFactory&) = delete; - PdfFindInPageFactory& operator=(const PdfFindInPageFactory&) = delete; - - // content::RenderFrameObserver: - void OnDestruct() override; - - // pdf::mojom::PdfFindInPageFactory: - void GetPdfFindInPage(GetPdfFindInPageCallback callback) override; - - private: - class FindInPageImpl; - - // Self deleting. - PdfFindInPageFactory( - content::RenderFrame* render_frame, - mojo::PendingAssociatedReceiver<pdf::mojom::PdfFindInPageFactory> - receiver); - ~PdfFindInPageFactory() override; - - std::unique_ptr<FindInPageImpl> find_in_page_; - mojo::AssociatedReceiver<pdf::mojom::PdfFindInPageFactory> receiver_; -}; - -} // namespace pdf - -#endif // COMPONENTS_PDF_RENDERER_PDF_FIND_IN_PAGE_H_ |