blob: 7e468e01a9f81c7ab1448e48b04f7a6f9a6b9321 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/printing/print_view_manager_common.h"
#include <utility>
#include "build/build_config.h"
#include "content/public/browser/render_frame_host.h"
#include "extensions/buildflags/buildflags.h"
#include "pdf/buildflags.h"
#include "printing/buildflags/buildflags.h"
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
#if BUILDFLAG(ENABLE_PDF)
#include "components/pdf/browser/pdf_frame_util.h"
#include "pdf/pdf_features.h"
#endif // BUILDFLAG(ENABLE_PDF)
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
#include "chrome/browser/printing/print_view_manager.h"
#else
#include "chrome/browser/printing/print_view_manager_basic.h"
#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
namespace printing {
namespace {
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
using PrintViewManagerImpl = PrintViewManager;
#else
using PrintViewManagerImpl = PrintViewManagerBasic;
#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
// Pick the right RenderFrameHost based on the WebContents.
content::RenderFrameHost* GetRenderFrameHostToUse(
content::WebContents* contents) {
#if BUILDFLAG(ENABLE_PDF)
// Pick the plugin frame host if `contents` is a PDF viewer guest. If using
// OOPIF PDF viewer, pick the PDF extension frame host.
content::RenderFrameHost* full_page_pdf_embedder_host =
chrome_pdf::features::IsOopifPdfEnabled()
? pdf_frame_util::FindFullPagePdfExtensionHost(contents)
: GetFullPagePlugin(contents);
content::RenderFrameHost* pdf_rfh = pdf_frame_util::FindPdfChildFrame(
full_page_pdf_embedder_host ? full_page_pdf_embedder_host
: contents->GetPrimaryMainFrame());
if (pdf_rfh) {
return pdf_rfh;
}
#endif // BUILDFLAG(ENABLE_PDF)
return GetFrameToPrint(contents);
}
} // namespace
bool StartPrint(
content::WebContents* contents,
#if BUILDFLAG(IS_CHROMEOS)
mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer,
#endif
bool print_preview_disabled,
bool has_selection) {
content::RenderFrameHost* rfh_to_use = GetRenderFrameHostToUse(contents);
if (!rfh_to_use)
return false;
auto* print_view_manager = PrintViewManagerImpl::FromWebContents(
content::WebContents::FromRenderFrameHost(rfh_to_use));
if (!print_view_manager)
return false;
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
if (!print_preview_disabled) {
#if BUILDFLAG(IS_CHROMEOS)
if (print_renderer) {
return print_view_manager->PrintPreviewWithPrintRenderer(
rfh_to_use, std::move(print_renderer));
}
#endif // BUILDFLAG(IS_CHROMEOS)
return print_view_manager->PrintPreviewNow(rfh_to_use, has_selection);
}
#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
return print_view_manager->PrintNow(rfh_to_use);
}
void StartBasicPrint(content::WebContents* contents) {
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
content::RenderFrameHost* rfh_to_use = GetRenderFrameHostToUse(contents);
if (!rfh_to_use)
return;
PrintViewManager* print_view_manager = PrintViewManager::FromWebContents(
content::WebContents::FromRenderFrameHost(rfh_to_use));
if (!print_view_manager)
return;
print_view_manager->BasicPrint(rfh_to_use);
#endif // ENABLE_PRINT_PREVIEW
}
void StartPrintNodeUnderContextMenu(content::RenderFrameHost* rfh,
bool print_preview_disabled) {
auto* print_view_manager = PrintViewManagerImpl::FromWebContents(
content::WebContents::FromRenderFrameHost(rfh));
if (!print_view_manager) {
return;
}
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
if (!print_preview_disabled) {
print_view_manager->PrintPreviewForNodeUnderContextMenu(rfh);
return;
}
#endif
print_view_manager->PrintNodeUnderContextMenu(rfh);
}
content::RenderFrameHost* GetFrameToPrint(content::WebContents* contents) {
auto* focused_frame = contents->GetFocusedFrame();
return (focused_frame && focused_frame->HasSelection())
? focused_frame
: contents->GetPrimaryMainFrame();
}
content::RenderFrameHost* GetFullPagePlugin(content::WebContents* contents) {
content::RenderFrameHost* full_page_plugin = nullptr;
#if BUILDFLAG(ENABLE_EXTENSIONS)
contents->ForEachRenderFrameHostWithAction(
[&full_page_plugin](content::RenderFrameHost* rfh) {
auto* guest_view =
extensions::MimeHandlerViewGuest::FromRenderFrameHost(rfh);
if (guest_view && guest_view->is_full_page_plugin()) {
DCHECK_EQ(guest_view->GetGuestMainFrame(), rfh);
full_page_plugin = rfh;
return content::RenderFrameHost::FrameIterationAction::kStop;
}
return content::RenderFrameHost::FrameIterationAction::kContinue;
});
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
return full_page_plugin;
}
} // namespace printing