summaryrefslogtreecommitdiffstats
path: root/src/core/printing/pdf_web_contents_helper_client_qt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/printing/pdf_web_contents_helper_client_qt.cpp')
-rw-r--r--src/core/printing/pdf_web_contents_helper_client_qt.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/core/printing/pdf_web_contents_helper_client_qt.cpp b/src/core/printing/pdf_web_contents_helper_client_qt.cpp
new file mode 100644
index 000000000..7c2a46ebf
--- /dev/null
+++ b/src/core/printing/pdf_web_contents_helper_client_qt.cpp
@@ -0,0 +1,56 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+// based on chrome/browser/ui/pdf/chrome_pdf_web_contents_helper_client.cc:
+
+#include "pdf_web_contents_helper_client_qt.h"
+
+#include "content/public/browser/render_process_host.h"
+#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
+#include "extensions/common/constants.h"
+
+namespace {
+bool IsPdfExtensionOrigin(const url::Origin &origin)
+{
+ return origin.scheme() == extensions::kExtensionScheme &&
+ origin.host() == extension_misc::kPdfExtensionId;
+}
+
+// from chrome/browser/pdf/pdf_frame_util.cc:
+content::RenderFrameHost *FindPdfChildFrame(content::RenderFrameHost *rfh)
+{
+ if (!IsPdfExtensionOrigin(rfh->GetLastCommittedOrigin()))
+ return nullptr;
+
+ content::RenderFrameHost *pdf_rfh = nullptr;
+ rfh->ForEachRenderFrameHost(
+ base::BindRepeating(
+ [](content::RenderFrameHost *&pdf_rfh, content::RenderFrameHost *rfh) {
+ if (!rfh->GetProcess()->IsPdf())
+ return;
+
+ DCHECK(IsPdfExtensionOrigin(rfh->GetParent()->GetLastCommittedOrigin()));
+ DCHECK(!pdf_rfh);
+ pdf_rfh = rfh;
+ }, std::ref(pdf_rfh)));
+
+ return pdf_rfh;
+}
+} // namespace
+
+PDFWebContentsHelperClientQt::PDFWebContentsHelperClientQt() = default;
+PDFWebContentsHelperClientQt::~PDFWebContentsHelperClientQt() = default;
+
+content::RenderFrameHost *PDFWebContentsHelperClientQt::FindPdfFrame(content::WebContents *contents)
+{
+ content::RenderFrameHost *main_frame = contents->GetMainFrame();
+ content::RenderFrameHost *pdf_frame = FindPdfChildFrame(main_frame);
+ return pdf_frame ? pdf_frame : main_frame;
+}
+
+void PDFWebContentsHelperClientQt::SetPluginCanSave(content::WebContents *contents, bool can_save)
+{
+ auto *guest_view = extensions::MimeHandlerViewGuest::FromWebContents(contents);
+ if (guest_view)
+ guest_view->SetPluginCanSave(can_save);
+}