diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/chrome/browser/printing | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser/printing')
22 files changed, 378 insertions, 254 deletions
diff --git a/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc b/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc index 85cbf0f6248..c95548a75d8 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_traffic_detector.cc @@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/stl_util.h" #include "base/sys_byteorder.h" -#include "base/task/post_task.h" #include "base/threading/scoped_blocking_call.h" #include "base/threading/thread_task_runner_handle.h" #include "content/public/browser/browser_context.h" @@ -51,8 +50,8 @@ void OnGetNetworkList( "lo", "lo", 0, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, localhost_prefix, 8, net::IP_ADDRESS_ATTRIBUTE_NONE)); - base::PostTask(FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(std::move(callback), std::move(ip4_networks))); + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), std::move(ip4_networks))); } void GetNetworkListOnUIThread( @@ -85,22 +84,22 @@ PrivetTrafficDetector::PrivetTrafficDetector( : helper_(new Helper(profile, on_traffic_detected)) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); content::GetNetworkConnectionTracker()->AddNetworkConnectionObserver(this); - base::PostTask(FROM_HERE, {content::BrowserThread::IO}, - base::BindOnce(&PrivetTrafficDetector::Helper::ScheduleRestart, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrivetTrafficDetector::Helper::ScheduleRestart, base::Unretained(helper_))); } PrivetTrafficDetector::~PrivetTrafficDetector() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); content::GetNetworkConnectionTracker()->RemoveNetworkConnectionObserver(this); - base::DeleteSoon(FROM_HERE, {content::BrowserThread::IO}, helper_); + content::GetIOThreadTaskRunner({})->DeleteSoon(FROM_HERE, helper_); } void PrivetTrafficDetector::OnConnectionChanged( network::mojom::ConnectionType type) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - base::PostTask( - FROM_HERE, {content::BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrivetTrafficDetector::Helper::HandleConnectionChanged, base::Unretained(helper_), type)); } @@ -131,8 +130,8 @@ void PrivetTrafficDetector::Helper::ScheduleRestart() { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); ResetConnection(); weak_ptr_factory_.InvalidateWeakPtrs(); - base::PostDelayedTask( - FROM_HERE, {content::BrowserThread::UI}, + content::GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, base::BindOnce( &GetNetworkListOnUIThread, base::BindOnce(&Helper::Restart, weak_ptr_factory_.GetWeakPtr())), @@ -149,8 +148,8 @@ void PrivetTrafficDetector::Helper::Restart( void PrivetTrafficDetector::Helper::Bind() { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&CreateUDPSocketOnUIThread, profile_, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&CreateUDPSocketOnUIThread, profile_, socket_.BindNewPipeAndPassReceiver(), listener_receiver_.BindNewPipeAndPassRemote())); @@ -251,8 +250,8 @@ void PrivetTrafficDetector::Helper::OnReceived( recv_addr_ = src_addr.value(); if (IsPrivetPacket(data.value())) { ResetConnection(); - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - on_traffic_detected_); + content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, + on_traffic_detected_); } else { socket_->ReceiveMoreWithBufferSize(1, net::dns_protocol::kMaxMulticastSize); } diff --git a/chromium/chrome/browser/printing/cloud_print/privet_url_loader.cc b/chromium/chrome/browser/printing/cloud_print/privet_url_loader.cc index 81207239a71..2e7c95f9bb6 100644 --- a/chromium/chrome/browser/printing/cloud_print/privet_url_loader.cc +++ b/chromium/chrome/browser/printing/cloud_print/privet_url_loader.cc @@ -250,8 +250,8 @@ void PrivetURLLoader::OnDownloadedToString( return; } - base::JSONReader json_reader(base::JSON_ALLOW_TRAILING_COMMAS); - base::Optional<base::Value> value = json_reader.ReadToValue(*response_body); + base::Optional<base::Value> value = + base::JSONReader::Read(*response_body, base::JSON_ALLOW_TRAILING_COMMAS); if (!value || !value->is_dict()) { delegate_->OnError(0, JSON_PARSE_ERROR); return; diff --git a/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc b/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc index 130fac6497a..46d81158e7a 100644 --- a/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc +++ b/chromium/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc @@ -298,8 +298,13 @@ IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel2Basic) { for (int i = 0; i < kNumberOfPages; ++i) { ASSERT_TRUE(GetPage(i)); // The output is PS encapsulated in EMF. +#ifdef NTDDI_WIN10_VB // Windows 10.0.19041 + ASSERT_TRUE(GetPageExpectedEmfData( + GetFileNameForPageNumber("pdf_converter_basic_ps_new_page_", i))); +#else ASSERT_TRUE(GetPageExpectedEmfData( GetFileNameForPageNumber("pdf_converter_basic_ps_page_", i))); +#endif ComparePageEmfHeader(); ComparePageEmfPayload(); } @@ -317,8 +322,13 @@ IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel3Basic) { for (int i = 0; i < kNumberOfPages; ++i) { ASSERT_TRUE(GetPage(i)); // The output is PS encapsulated in EMF. +#ifdef NTDDI_WIN10_VB // Windows 10.0.19041 + ASSERT_TRUE(GetPageExpectedEmfData( + GetFileNameForPageNumber("pdf_converter_basic_ps_new_page_", i))); +#else ASSERT_TRUE(GetPageExpectedEmfData( GetFileNameForPageNumber("pdf_converter_basic_ps_page_", i))); +#endif ComparePageEmfHeader(); ComparePageEmfPayload(); } @@ -368,8 +378,13 @@ IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2); +#ifdef NTDDI_WIN10_VB // Windows 10.0.19041 + RunSinglePagePdfToPostScriptConverterTest(pdf_settings, "bug_806746.pdf", + "bug_806746_new.emf"); +#else RunSinglePagePdfToPostScriptConverterTest(pdf_settings, "bug_806746.pdf", "bug_806746.emf"); +#endif } IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, @@ -378,8 +393,13 @@ IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3); +#ifdef NTDDI_WIN10_VB // Windows 10.0.19041 + RunSinglePagePdfToPostScriptConverterTest(pdf_settings, "bug_806746.pdf", + "bug_806746_new.emf"); +#else RunSinglePagePdfToPostScriptConverterTest(pdf_settings, "bug_806746.pdf", "bug_806746.emf"); +#endif } IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, diff --git a/chromium/chrome/browser/printing/print_browsertest.cc b/chromium/chrome/browser/printing/print_browsertest.cc index 3de2b60a683..cc9c1fde80c 100644 --- a/chromium/chrome/browser/printing/print_browsertest.cc +++ b/chromium/chrome/browser/printing/print_browsertest.cc @@ -27,6 +27,7 @@ #include "components/prefs/pref_service.h" #include "components/printing/browser/print_composite_client.h" #include "components/printing/browser/print_manager_utils.h" +#include "components/printing/common/print.mojom-test-utils.h" #include "components/printing/common/print.mojom.h" #include "components/printing/common/print_messages.h" #include "content/public/browser/browser_message_filter.h" @@ -41,6 +42,7 @@ #include "mojo/public/cpp/bindings/associated_remote.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "printing/mojom/print.mojom.h" #include "testing/gmock/include/gmock/gmock.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h" @@ -78,6 +80,8 @@ class PrintPreviewObserver : PrintPreviewUI::TestDelegate { } } + content::WebContents* GetPrintPreviewDialog() { return preview_dialog_; } + private: // PrintPreviewUI::TestDelegate: void DidGetPreviewPageCount(int page_count) override { @@ -90,6 +94,7 @@ class PrintPreviewObserver : PrintPreviewUI::TestDelegate { CHECK(rendered_page_count_ <= total_page_count_); if (rendered_page_count_ == total_page_count_ && run_loop_) { run_loop_->Quit(); + preview_dialog_ = preview_dialog; if (queue_.has_value()) { content::ExecuteScriptAsync( @@ -106,6 +111,7 @@ class PrintPreviewObserver : PrintPreviewUI::TestDelegate { base::Optional<content::DOMMessageQueue> queue_; int total_page_count_ = 1; int rendered_page_count_ = 0; + content::WebContents* preview_dialog_ = nullptr; base::RunLoop* run_loop_ = nullptr; DISALLOW_COPY_AND_ASSIGN(PrintPreviewObserver); @@ -129,8 +135,8 @@ class NupPrintingTestDelegate : public PrintingMessageFilter::TestDelegate { params.dpi = gfx::Size(72, 72); params.document_cookie = kDefaultDocumentCookie; params.pages_per_sheet = 4; - params.printed_doc_type = - IsOopifEnabled() ? SkiaDocumentType::MSKP : SkiaDocumentType::PDF; + params.printed_doc_type = IsOopifEnabled() ? mojom::SkiaDocumentType::kMSKP + : mojom::SkiaDocumentType::kPDF; return params; } @@ -138,66 +144,127 @@ class NupPrintingTestDelegate : public PrintingMessageFilter::TestDelegate { DISALLOW_COPY_AND_ASSIGN(NupPrintingTestDelegate); }; -class TestPrintFrameContentMsgFilter : public content::BrowserMessageFilter { +class TestPrintRenderFrame + : public mojom::PrintRenderFrameInterceptorForTesting { public: - TestPrintFrameContentMsgFilter(int document_cookie, - base::RepeatingClosure msg_callback) - : content::BrowserMessageFilter(PrintMsgStart), + TestPrintRenderFrame(content::RenderFrameHost* frame_host, + content::WebContents* web_contents, + int document_cookie, + base::RepeatingClosure msg_callback) + : frame_host_(frame_host), + web_contents_(web_contents), document_cookie_(document_cookie), task_runner_(base::SequencedTaskRunnerHandle::Get()), msg_callback_(msg_callback) {} + ~TestPrintRenderFrame() override = default; - bool OnMessageReceived(const IPC::Message& message) override { - // Only expect PrintHostMsg_DidPrintFrameContent message. - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(TestPrintFrameContentMsgFilter, message) - IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrintFrameContent, CheckMessage) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - EXPECT_TRUE(handled); + void OnDidPrintFrameContent(int document_cookie, + mojom::DidPrintContentParamsPtr param, + PrintFrameContentCallback callback) const { + EXPECT_EQ(document_cookie, document_cookie_); + ASSERT_TRUE(param->metafile_data_region.IsValid()); + EXPECT_GT(param->metafile_data_region.GetSize(), 0U); task_runner_->PostTask(FROM_HERE, msg_callback_); - return true; - } - - private: - ~TestPrintFrameContentMsgFilter() override = default; + std::move(callback).Run(document_cookie, std::move(param)); + } + + void Bind(mojo::ScopedInterfaceEndpointHandle handle) { + receiver_.Bind(mojo::PendingAssociatedReceiver<mojom::PrintRenderFrame>( + std::move(handle))); + } + + // mojom::PrintRenderFrameInterceptorForTesting + mojom::PrintRenderFrame* GetForwardingInterface() override { + NOTREACHED(); + return nullptr; + } + void PrintFrameContent(mojom::PrintFrameContentParamsPtr params, + PrintFrameContentCallback callback) override { + // Sends the printed result back. + mojom::DidPrintContentParamsPtr printed_frame_params = + mojom::DidPrintContentParams::New(); + // Creates a small amount of region to avoid passing empty data to mojo. + constexpr size_t kSize = 10; + base::MappedReadOnlyRegion region_mapping = + base::ReadOnlySharedMemoryRegion::Create(kSize); + printed_frame_params->metafile_data_region = + std::move(region_mapping.region); + OnDidPrintFrameContent(params->document_cookie, + std::move(printed_frame_params), + std::move(callback)); + + auto* client = PrintCompositeClient::FromWebContents(web_contents_); + if (!client) + return; - void CheckMessage(int document_cookie, - const PrintHostMsg_DidPrintContent_Params& param) { - EXPECT_EQ(document_cookie, document_cookie_); - ASSERT_TRUE(param.metafile_data_region.IsValid()); - EXPECT_GT(param.metafile_data_region.GetSize(), 0U); + // Prints its children. + content::RenderFrameHost* child = ChildFrameAt(frame_host_, 0); + for (size_t i = 1; child; i++) { + if (child->GetSiteInstance() != frame_host_->GetSiteInstance()) { + client->PrintCrossProcessSubframe(gfx::Rect(), params->document_cookie, + child); + } + child = ChildFrameAt(frame_host_, i); + } } + private: + content::RenderFrameHost* frame_host_; + content::WebContents* web_contents_; const int document_cookie_; scoped_refptr<base::SequencedTaskRunner> task_runner_; base::RepeatingClosure msg_callback_; + mojo::AssociatedReceiver<mojom::PrintRenderFrame> receiver_{this}; }; -class KillPrintFrameContentMsgFilter : public content::BrowserMessageFilter { +class KillPrintRenderFrame + : public mojom::PrintRenderFrameInterceptorForTesting { public: - explicit KillPrintFrameContentMsgFilter(content::RenderProcessHost* rph) - : content::BrowserMessageFilter(PrintMsgStart), rph_(rph) {} + explicit KillPrintRenderFrame(content::RenderProcessHost* rph) : rph_(rph) {} + ~KillPrintRenderFrame() override = default; - bool OnMessageReceived(const IPC::Message& message) override { - // Only handle PrintHostMsg_DidPrintFrameContent message. - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(KillPrintFrameContentMsgFilter, message) - IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrintFrameContent, KillRenderProcess) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; + void OverrideBinderForTesting(content::RenderFrameHost* render_frame_host) { + render_frame_host->GetRemoteAssociatedInterfaces() + ->OverrideBinderForTesting( + mojom::PrintRenderFrame::Name_, + base::BindRepeating(&KillPrintRenderFrame::Bind, + base::Unretained(this))); } - private: - ~KillPrintFrameContentMsgFilter() override = default; - void KillRenderProcess(int document_cookie, - const PrintHostMsg_DidPrintContent_Params& param) { + mojom::DidPrintContentParamsPtr param, + PrintFrameContentCallback callback) const { + std::move(callback).Run(document_cookie, std::move(param)); rph_->Shutdown(0); } - content::RenderProcessHost* rph_; + void Bind(mojo::ScopedInterfaceEndpointHandle handle) { + receiver_.Bind(mojo::PendingAssociatedReceiver<mojom::PrintRenderFrame>( + std::move(handle))); + } + + // mojom::PrintRenderFrameInterceptorForTesting + mojom::PrintRenderFrame* GetForwardingInterface() override { + NOTREACHED(); + return nullptr; + } + void PrintFrameContent(mojom::PrintFrameContentParamsPtr params, + PrintFrameContentCallback callback) override { + // Sends the printed result back. + const size_t kSize = 10; + mojom::DidPrintContentParamsPtr printed_frame_params = + mojom::DidPrintContentParams::New(); + base::MappedReadOnlyRegion region_mapping = + base::ReadOnlySharedMemoryRegion::Create(kSize); + printed_frame_params->metafile_data_region = + std::move(region_mapping.region); + KillRenderProcess(params->document_cookie, std::move(printed_frame_params), + std::move(callback)); + } + + private: + content::RenderProcessHost* const rph_; + mojo::AssociatedReceiver<mojom::PrintRenderFrame> receiver_{this}; }; } // namespace @@ -210,7 +277,6 @@ class PrintBrowserTest : public InProcessBrowserTest { void SetUp() override { num_expected_messages_ = 1; // By default, only wait on one message. num_received_messages_ = 0; - run_loop_.reset(); InProcessBrowserTest::SetUp(); } @@ -246,23 +312,27 @@ class PrintBrowserTest : public InProcessBrowserTest { num_expected_messages_ = num; } - void WaitUntilMessagesReceived() { - run_loop_ = std::make_unique<base::RunLoop>(); - run_loop_->Run(); + void WaitUntilCallbackReceived() { + base::RunLoop run_loop; + quit_callback_ = run_loop.QuitClosure(); + run_loop.Run(); } void CheckForQuit() { - if (++num_received_messages_ == num_expected_messages_) { - run_loop_->QuitWhenIdle(); - } + if (++num_received_messages_ != num_expected_messages_) + return; + if (quit_callback_) + std::move(quit_callback_).Run(); } - void AddFilterForFrame(content::RenderFrameHost* frame_host) { - auto filter = base::MakeRefCounted<TestPrintFrameContentMsgFilter>( - kDefaultDocumentCookie, - base::BindRepeating(&PrintBrowserTest::CheckForQuit, - base::Unretained(this))); - frame_host->GetProcess()->AddFilter(filter.get()); + void CreateTestPrintRenderFrame(content::RenderFrameHost* frame_host, + content::WebContents* web_contents) { + frame_content_.emplace( + frame_host, std::make_unique<TestPrintRenderFrame>( + frame_host, web_contents, kDefaultDocumentCookie, + base::BindRepeating(&PrintBrowserTest::CheckForQuit, + base::Unretained(this)))); + OverrideBinderForTesting(frame_host); } static mojom::PrintFrameContentParamsPtr GetDefaultPrintFrameParams() { @@ -270,17 +340,34 @@ class PrintBrowserTest : public InProcessBrowserTest { kDefaultDocumentCookie); } - static const mojo::AssociatedRemote<mojom::PrintRenderFrame> - GetPrintRenderFrame(content::RenderFrameHost* rfh) { - mojo::AssociatedRemote<mojom::PrintRenderFrame> remote; - rfh->GetRemoteAssociatedInterfaces()->GetInterface(&remote); - return remote; + const mojo::AssociatedRemote<mojom::PrintRenderFrame>& GetPrintRenderFrame( + content::RenderFrameHost* rfh) { + if (!remote_) + rfh->GetRemoteAssociatedInterfaces()->GetInterface(&remote_); + return remote_; } private: + TestPrintRenderFrame* GetFrameContent(content::RenderFrameHost* host) const { + auto iter = frame_content_.find(host); + return iter != frame_content_.end() ? iter->second.get() : nullptr; + } + + void OverrideBinderForTesting(content::RenderFrameHost* render_frame_host) { + render_frame_host->GetRemoteAssociatedInterfaces() + ->OverrideBinderForTesting( + mojom::PrintRenderFrame::Name_, + base::BindRepeating( + &TestPrintRenderFrame::Bind, + base::Unretained(GetFrameContent(render_frame_host)))); + } + unsigned int num_expected_messages_; unsigned int num_received_messages_; - std::unique_ptr<base::RunLoop> run_loop_; + base::OnceClosure quit_callback_; + mojo::AssociatedRemote<mojom::PrintRenderFrame> remote_; + std::map<content::RenderFrameHost*, std::unique_ptr<TestPrintRenderFrame>> + frame_content_; }; class SitePerProcessPrintBrowserTest : public PrintBrowserTest { @@ -444,7 +531,7 @@ IN_PROC_BROWSER_TEST_F(PrintBrowserTest, SelectionContainsIframe) { // Printing frame content for the main frame of a generic webpage. // This test passes when the printed result is sent back and checked in -// TestPrintFrameContentMsgFilter::CheckMessage(). +// TestPrintRenderFrame::OnDidPrintFrameContent(). IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintFrameContent) { ASSERT_TRUE(embedded_test_server()->Started()); GURL url(embedded_test_server()->GetURL("/printing/test1.html")); @@ -453,18 +540,18 @@ IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintFrameContent) { content::WebContents* original_contents = browser()->tab_strip_model()->GetActiveWebContents(); content::RenderFrameHost* rfh = original_contents->GetMainFrame(); - AddFilterForFrame(rfh); - - GetPrintRenderFrame(rfh)->PrintFrameContent(GetDefaultPrintFrameParams()); + CreateTestPrintRenderFrame(rfh, original_contents); + GetPrintRenderFrame(rfh)->PrintFrameContent(GetDefaultPrintFrameParams(), + base::DoNothing()); // The printed result will be received and checked in - // TestPrintFrameContentMsgFilter. - WaitUntilMessagesReceived(); + // TestPrintRenderFrame. + WaitUntilCallbackReceived(); } // Printing frame content for a cross-site iframe. // This test passes when the iframe responds to the print message. -// The response is checked in TestPrintFrameContentMsgFilter::CheckMessage(). +// The response is checked in TestPrintRenderFrame::OnDidPrintFrameContent(). IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintSubframeContent) { ASSERT_TRUE(embedded_test_server()->Started()); GURL url( @@ -477,21 +564,20 @@ IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintSubframeContent) { content::RenderFrameHost* test_frame = original_contents->GetAllFrames()[1]; ASSERT_TRUE(test_frame); - AddFilterForFrame(test_frame); - + CreateTestPrintRenderFrame(test_frame, original_contents); GetPrintRenderFrame(test_frame) - ->PrintFrameContent(GetDefaultPrintFrameParams()); + ->PrintFrameContent(GetDefaultPrintFrameParams(), base::DoNothing()); // The printed result will be received and checked in - // TestPrintFrameContentMsgFilter. - WaitUntilMessagesReceived(); + // TestPrintRenderFrame. + WaitUntilCallbackReceived(); } // Printing frame content with a cross-site iframe which also has a cross-site // iframe. The site reference chain is a.com --> b.com --> c.com. // This test passes when both cross-site frames are printed and their // responses which are checked in -// TestPrintFrameContentMsgFilter::CheckMessage(). +// TestPrintRenderFrame::OnDidPrintFrameContent(). IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintSubframeChain) { ASSERT_TRUE(embedded_test_server()->Started()); GURL url(embedded_test_server()->GetURL( @@ -518,19 +604,19 @@ IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintSubframeChain) { ASSERT_NE(grandchild_frame->GetProcess(), main_frame->GetProcess()); } - AddFilterForFrame(main_frame); + CreateTestPrintRenderFrame(main_frame, original_contents); if (oopif_enabled) { - AddFilterForFrame(child_frame); - AddFilterForFrame(grandchild_frame); + CreateTestPrintRenderFrame(child_frame, original_contents); + CreateTestPrintRenderFrame(grandchild_frame, original_contents); } GetPrintRenderFrame(main_frame) - ->PrintFrameContent(GetDefaultPrintFrameParams()); + ->PrintFrameContent(GetDefaultPrintFrameParams(), base::DoNothing()); // The printed result will be received and checked in - // TestPrintFrameContentMsgFilter. + // TestPrintRenderFrame. SetNumExpectedMessages(oopif_enabled ? 3 : 1); - WaitUntilMessagesReceived(); + WaitUntilCallbackReceived(); } // Printing frame content with a cross-site iframe who also has a cross site @@ -538,7 +624,7 @@ IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintSubframeChain) { // The site reference loop is a.com --> b.com --> a.com. // This test passes when both cross-site frames are printed and send back // responses which are checked in -// TestPrintFrameContentMsgFilter::CheckMessage(). +// TestPrintRenderFrame::OnDidPrintFrameContent(). IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintSubframeABA) { ASSERT_TRUE(embedded_test_server()->Started()); GURL url(embedded_test_server()->GetURL( @@ -564,17 +650,19 @@ IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintSubframeABA) { // enabled, they will be in the same process. ASSERT_EQ(grandchild_frame->GetProcess(), main_frame->GetProcess()); - AddFilterForFrame(main_frame); - if (oopif_enabled) - AddFilterForFrame(child_frame); + CreateTestPrintRenderFrame(main_frame, original_contents); + if (oopif_enabled) { + CreateTestPrintRenderFrame(child_frame, original_contents); + CreateTestPrintRenderFrame(grandchild_frame, original_contents); + } GetPrintRenderFrame(main_frame) - ->PrintFrameContent(GetDefaultPrintFrameParams()); + ->PrintFrameContent(GetDefaultPrintFrameParams(), base::DoNothing()); // The printed result will be received and checked in - // TestPrintFrameContentMsgFilter. + // TestPrintRenderFrame. SetNumExpectedMessages(oopif_enabled ? 3 : 1); - WaitUntilMessagesReceived(); + WaitUntilCallbackReceived(); } // Printing preview a simple webpage when site per process is enabled. @@ -635,10 +723,9 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessPrintBrowserTest, ASSERT_TRUE(subframe); auto* subframe_rph = subframe->GetProcess(); - auto filter = - base::MakeRefCounted<KillPrintFrameContentMsgFilter>(subframe_rph); + KillPrintRenderFrame frame_content(subframe_rph); + frame_content.OverrideBinderForTesting(subframe); content::ScopedAllowRendererCrashes allow_renderer_crashes(subframe_rph); - subframe_rph->AddFilter(filter.get()); PrintAndWaitUntilPreviewIsReady(/*print_only_selection=*/false); } @@ -762,4 +849,57 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessPrintBrowserTest, MultipagePrint) { PrintAndWaitUntilPreviewIsReadyAndLoaded(/*print_only_selection=*/false); } +IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PDFPluginNotKeyboardFocusable) { + ASSERT_TRUE(embedded_test_server()->Started()); + GURL url(embedded_test_server()->GetURL("/printing/multipage.html")); + ui_test_utils::NavigateToURL(browser(), url); + + PrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true); + StartPrint(browser()->tab_strip_model()->GetActiveWebContents(), + /*print_renderer=*/mojo::NullAssociatedRemote(), + /*print_preview_disabled=*/false, /*print_only_selection=*/false); + print_preview_observer.WaitUntilPreviewIsReady(); + + content::WebContents* preview_dialog = + print_preview_observer.GetPrintPreviewDialog(); + ASSERT_TRUE(preview_dialog); + + // The script will ensure we return the id of <zoom-out-button> when + // focused. Focus the element after PDF plugin in tab order. + const char kScript[] = R"( + const button = document.getElementsByTagName('print-preview-app')[0] + .$['previewArea'] + .$$('iframe') + .contentDocument.querySelector('pdf-viewer-pp') + .shadowRoot.querySelector('#zoom-toolbar') + .$['zoom-out-button']; + button.addEventListener('focus', (e) => { + window.domAutomationController.send(e.target.id); + }); + + const select_tag = document.getElementsByTagName('print-preview-app')[0] + .$['sidebar'] + .$['destinationSettings'] + .$['destinationSelect'] + .$$('select'); + select_tag.addEventListener('focus', () => { + window.domAutomationController.send(true); + }); + select_tag.focus();)"; + bool success = false; + ASSERT_TRUE( + content::ExecuteScriptAndExtractBool(preview_dialog, kScript, &success)); + ASSERT_TRUE(success); + + // Simulate a <shift-tab> press and wait for a focus message. + content::DOMMessageQueue msg_queue; + SimulateKeyPress(preview_dialog, ui::DomKey::TAB, ui::DomCode::TAB, + ui::VKEY_TAB, false, true, false, false); + std::string reply; + ASSERT_TRUE(msg_queue.WaitForMessage(&reply)); + // Pressing <shift-tab> should focus the last toolbar element + // (zoom-out-button) instead of PDF plugin. + EXPECT_EQ("\"zoom-out-button\"", reply); +} + } // namespace printing diff --git a/chromium/chrome/browser/printing/print_error_dialog.cc b/chromium/chrome/browser/printing/print_error_dialog.cc index 1f95636f43a..15ffdb16ed4 100644 --- a/chromium/chrome/browser/printing/print_error_dialog.cc +++ b/chromium/chrome/browser/printing/print_error_dialog.cc @@ -5,7 +5,6 @@ #include "chrome/browser/printing/print_error_dialog.h" #include "base/bind.h" -#include "base/task/post_task.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/simple_message_box.h" @@ -28,6 +27,6 @@ void ShowPrintErrorDialogTask() { void ShowPrintErrorDialog() { // Nested loop may destroy caller. - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&ShowPrintErrorDialogTask)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&ShowPrintErrorDialogTask)); } diff --git a/chromium/chrome/browser/printing/print_job.cc b/chromium/chrome/browser/printing/print_job.cc index 806e3e3a72e..668a14bff46 100644 --- a/chromium/chrome/browser/printing/print_job.cc +++ b/chromium/chrome/browser/printing/print_job.cc @@ -248,8 +248,8 @@ bool PrintJob::FlushJob(base::TimeDelta timeout) { base::RunLoop loop(base::RunLoop::Type::kNestableTasksAllowed); quit_closure_ = loop.QuitClosure(); - base::PostDelayedTask(FROM_HERE, {content::BrowserThread::UI}, - loop.QuitClosure(), timeout); + content::GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, loop.QuitClosure(), timeout); loop.Run(); @@ -515,8 +515,8 @@ void PrintJob::OnNotifyPrintJobEvent(const JobEventDetails& event_details) { } case JobEventDetails::DOC_DONE: { // This will call Stop() and broadcast a JOB_DONE message. - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&PrintJob::OnDocumentDone, this)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintJob::OnDocumentDone, this)); break; } #if defined(OS_WIN) @@ -573,9 +573,8 @@ void PrintJob::ControlledWorkerShutdown() { // Delay shutdown until the worker terminates. We want this code path // to wait on the thread to quit before continuing. if (worker_->IsRunning()) { - base::PostDelayedTask( - FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&PrintJob::ControlledWorkerShutdown, this), + content::GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, base::BindOnce(&PrintJob::ControlledWorkerShutdown, this), base::TimeDelta::FromMilliseconds(100)); return; } diff --git a/chromium/chrome/browser/printing/print_job_manager.h b/chromium/chrome/browser/printing/print_job_manager.h index e66e7f1ae21..bdeba8404b7 100644 --- a/chromium/chrome/browser/printing/print_job_manager.h +++ b/chromium/chrome/browser/printing/print_job_manager.h @@ -9,7 +9,6 @@ #include <set> #include <vector> -#include "base/logging.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" diff --git a/chromium/chrome/browser/printing/print_job_worker.cc b/chromium/chrome/browser/printing/print_job_worker.cc index 9122bbf4f15..52efa2037a3 100644 --- a/chromium/chrome/browser/printing/print_job_worker.cc +++ b/chromium/chrome/browser/printing/print_job_worker.cc @@ -14,7 +14,6 @@ #include "base/compiler_specific.h" #include "base/location.h" #include "base/single_thread_task_runner.h" -#include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" #include "build/build_config.h" @@ -169,14 +168,14 @@ void PrintJobWorker::GetSettings(bool ask_user_for_settings, // When we delegate to a destination, we don't ask the user for settings. // TODO(mad): Ask the destination for settings. if (ask_user_for_settings) { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintJobWorker::GetSettingsWithUI, base::Unretained(this), document_page_count, has_selection, is_scripted, std::move(callback))); } else { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&PrintJobWorker::UseDefaultSettings, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintJobWorker::UseDefaultSettings, base::Unretained(this), std::move(callback))); } } @@ -185,8 +184,8 @@ void PrintJobWorker::SetSettings(base::Value new_settings, SettingsCallback callback) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&PrintJobWorker::UpdatePrintSettings, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintJobWorker::UpdatePrintSettings, base::Unretained(this), std::move(new_settings), std::move(callback))); } @@ -197,8 +196,8 @@ void PrintJobWorker::SetSettingsFromPOD( SettingsCallback callback) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&PrintJobWorker::UpdatePrintSettingsFromPOD, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintJobWorker::UpdatePrintSettingsFromPOD, base::Unretained(this), std::move(new_settings), std::move(callback))); } @@ -222,6 +221,18 @@ void PrintJobWorker::UpdatePrintSettings(base::Value new_settings, std::string printer_name = *new_settings.FindStringKey(kSettingDeviceName); crash_key = std::make_unique<crash_keys::ScopedPrinterInfo>( print_backend->GetPrinterDriverInfo(printer_name)); + +#if defined(OS_LINUX) && defined(USE_CUPS) && !defined(OS_CHROMEOS) + PrinterBasicInfo basic_info; + if (print_backend->GetPrinterBasicInfo(printer_name, &basic_info)) { + base::Value advanced_settings(base::Value::Type::DICTIONARY); + for (const auto& pair : basic_info.options) + advanced_settings.SetStringKey(pair.first, pair.second); + + new_settings.SetKey(kSettingAdvancedSettings, + std::move(advanced_settings)); + } +#endif // defined(OS_LINUX) && defined(USE_CUPS) && !defined(OS_CHROMEOS) } PrintingContext::Result result; @@ -292,7 +303,15 @@ void PrintJobWorker::GetSettingsWithUI(int document_page_count, } void PrintJobWorker::UseDefaultSettings(SettingsCallback callback) { - PrintingContext::Result result = printing_context_->UseDefaultSettings(); + PrintingContext::Result result; + { +#if defined(OS_WIN) + // Blocking is needed here because Windows printer drivers are oftentimes + // not thread-safe and have to be accessed on the UI thread. + base::ScopedAllowBlocking allow_blocking; +#endif + result = printing_context_->UseDefaultSettings(); + } GetSettingsDone(std::move(callback), result); } diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller.cc b/chromium/chrome/browser/printing/print_preview_dialog_controller.cc index 84818167bce..3fadaba3336 100644 --- a/chromium/chrome/browser/printing/print_preview_dialog_controller.cc +++ b/chromium/chrome/browser/printing/print_preview_dialog_controller.cc @@ -256,7 +256,7 @@ void PrintPreviewDialogController::PrintPreview(WebContents* initiator) { ModuleDatabase::DisableThirdPartyBlocking(); #endif - if (initiator->ShowingInterstitialPage() || initiator->IsCrashed()) + if (initiator->IsCrashed()) return; PrintPreviewDialogController* dialog_controller = GetInstance(); diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc index a76b50bba43..86b77391c64 100644 --- a/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc +++ b/chromium/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc @@ -206,16 +206,10 @@ class PrintPreviewDialogControllerBrowserTest : public InProcessBrowserTest { DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogControllerBrowserTest); }; -// Flaky on Linux: crbug.com/1021545 -#if defined(OS_LINUX) -#define MAYBE_NavigateFromInitiatorTab DISABLED_NavigateFromInitiatorTab -#else -#define MAYBE_NavigateFromInitiatorTab NavigateFromInitiatorTab -#endif // Test to verify that when a initiator navigates, we can create a new preview // dialog for the new tab contents. IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, - MAYBE_NavigateFromInitiatorTab) { + NavigateFromInitiatorTab) { // Print for the first time. PrintPreview(); @@ -242,16 +236,10 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, EXPECT_TRUE(new_preview_dialog); } -// Flaky on Linux: crbug.com/1021545 -#if defined(OS_LINUX) -#define MAYBE_ReloadInitiatorTab DISABLED_ReloadInitiatorTab -#else -#define MAYBE_ReloadInitiatorTab ReloadInitiatorTab -#endif // Test to verify that after reloading the initiator, it creates a new print // preview dialog. IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, - MAYBE_ReloadInitiatorTab) { + ReloadInitiatorTab) { // Print for the first time. PrintPreview(); @@ -282,16 +270,10 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, EXPECT_TRUE(new_preview_dialog); } -// Flaky on Linux: crbug.com/1021545 -#if defined(OS_LINUX) -#define MAYBE_PdfPluginDisabled DISABLED_PdfPluginDisabled -#else -#define MAYBE_PdfPluginDisabled PdfPluginDisabled -#endif // Test to verify that after print preview works even when the PDF plugin is // disabled for webpages. IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, - MAYBE_PdfPluginDisabled) { + PdfPluginDisabled) { // Make sure plugins are loaded. { base::RunLoop run_loop; @@ -355,14 +337,8 @@ const std::vector<task_manager::WebContentsTag*>& GetTrackedTags() { } // namespace -// Flaky on Linux: crbug.com/1021545 -#if defined(OS_LINUX) -#define MAYBE_TaskManagementTest DISABLED_TaskManagementTest -#else -#define MAYBE_TaskManagementTest TaskManagementTest -#endif IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, - MAYBE_TaskManagementTest) { + TaskManagementTest) { // This test starts with two tabs open. EXPECT_EQ(2U, GetTrackedTags().size()); @@ -403,14 +379,8 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, base::CompareCase::INSENSITIVE_ASCII)); } -// Flaky on Linux: crbug.com/1021545 -#if defined(OS_LINUX) -#define MAYBE_PrintPreviewPdfAccessibility DISABLED_PrintPreviewPdfAccessibility -#else -#define MAYBE_PrintPreviewPdfAccessibility PrintPreviewPdfAccessibility -#endif IN_PROC_BROWSER_TEST_F(PrintPreviewDialogControllerBrowserTest, - MAYBE_PrintPreviewPdfAccessibility) { + PrintPreviewPdfAccessibility) { content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); ui_test_utils::NavigateToURL(browser(), GURL("data:text/html,HelloWorld")); PrintPreview(); diff --git a/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc b/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc index 674f46509eb..ed7636e0eee 100644 --- a/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc +++ b/chromium/chrome/browser/printing/print_preview_dialog_controller_unittest.cc @@ -199,7 +199,7 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) { // Two similar URLs (same webpage, different URL fragment/query) // Gmail navigates from fragment to query when opening an email to print. GURL tiger("https://www.google.com/#q=tiger"); - GURL tiger_barb("https://www.google.com/?q=tiger+barb"); + GURL tiger_barb("https://www.google.com/#?q=tiger+barb"); // Set up by opening a new tab and getting web contents EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); @@ -275,12 +275,13 @@ TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) { // Try to simulate Gmail navigation: Navigate to an existing page (via // Forward) but modify the navigation type while pending to look like an // address bar + typed transition (like Gmail auto navigation) - content::NavigationController& nav_controller = web_contents->GetController(); - nav_controller.GoForward(); - nav_controller.GetPendingEntry()->SetTransitionType(ui::PageTransitionFromInt( - ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR)); - CommitPendingLoad(&nav_controller); - + std::unique_ptr<content::NavigationSimulator> forward_nav = + content::NavigationSimulator::CreateHistoryNavigation(1, web_contents); + forward_nav->Start(); + web_contents->GetController().GetPendingEntry()->SetTransitionType( + ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | + ui::PAGE_TRANSITION_FROM_ADDRESS_BAR)); + forward_nav->Commit(); // Navigation successful EXPECT_EQ(tiger_barb, web_contents->GetLastCommittedURL()); diff --git a/chromium/chrome/browser/printing/print_preview_message_handler.cc b/chromium/chrome/browser/printing/print_preview_message_handler.cc index 124a5736168..2c7559cf28d 100644 --- a/chromium/chrome/browser/printing/print_preview_message_handler.cc +++ b/chromium/chrome/browser/printing/print_preview_message_handler.cc @@ -14,7 +14,6 @@ #include "base/memory/read_only_shared_memory_region.h" #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" -#include "base/task/post_task.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/printing/pdf_nup_converter_client.h" #include "chrome/browser/printing/print_job_manager.h" @@ -24,6 +23,7 @@ #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" #include "components/printing/browser/print_composite_client.h" #include "components/printing/browser/print_manager_utils.h" +#include "components/printing/common/print.mojom.h" #include "components/printing/common/print_messages.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -32,6 +32,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "mojo/public/cpp/bindings/callback_helpers.h" +#include "printing/mojom/print.mojom.h" #include "printing/nup_parameters.h" #include "printing/page_setup.h" #include "printing/print_job_constants.h" @@ -54,8 +55,8 @@ void StopWorker(int document_cookie) { std::unique_ptr<PrinterQuery> printer_query = queue->PopPrinterQuery(document_cookie); if (printer_query) { - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrinterQuery::StopWorker, std::move(printer_query))); } } @@ -109,7 +110,7 @@ void PrintPreviewMessageHandler::OnRequestPrintPreview( } void PrintPreviewMessageHandler::OnDidStartPreview( - const PrintHostMsg_DidStartPreview_Params& params, + const mojom::DidStartPreviewParams& params, const PrintHostMsg_PreviewIds& ids) { if (params.page_count <= 0 || params.pages_to_render.empty()) { NOTREACHED(); @@ -175,7 +176,7 @@ void PrintPreviewMessageHandler::OnDidPreviewPage( const PrintHostMsg_DidPreviewPage_Params& params, const PrintHostMsg_PreviewIds& ids) { int page_number = params.page_number; - const PrintHostMsg_DidPrintContent_Params& content = params.content; + const mojom::DidPrintContentParams& content = params.content; if (page_number < FIRST_PAGE_INDEX || !content.metafile_data_region.IsValid()) return; @@ -268,7 +269,7 @@ void PrintPreviewMessageHandler::OnMetafileReadyForPrinting( } void PrintPreviewMessageHandler::OnDidGetDefaultPageLayout( - const PageSizeMargins& page_layout_in_points, + const mojom::PageSizeMargins& page_layout_in_points, const gfx::Rect& printable_area_in_points, bool has_custom_page_size_style, const PrintHostMsg_PreviewIds& ids) { @@ -281,29 +282,6 @@ void PrintPreviewMessageHandler::OnDidGetDefaultPageLayout( has_custom_page_size_style, ids.request_id); } -void PrintPreviewMessageHandler::OnPrintPreviewCancelled( - int document_cookie, - const PrintHostMsg_PreviewIds& ids) { - // Always need to stop the worker. - StopWorker(document_cookie); - - // Notify UI - PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id); - if (!print_preview_ui) - return; - print_preview_ui->OnPrintPreviewCancelled(ids.request_id); -} - -void PrintPreviewMessageHandler::OnInvalidPrinterSettings( - int document_cookie, - const PrintHostMsg_PreviewIds& ids) { - StopWorker(document_cookie); - PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id); - if (!print_preview_ui) - return; - print_preview_ui->OnInvalidPrinterSettings(ids.request_id); -} - void PrintPreviewMessageHandler::NotifyUIPreviewPageReady( PrintPreviewUI* print_preview_ui, int page_number, @@ -342,6 +320,10 @@ void PrintPreviewMessageHandler::OnCompositePdfPageDone( mojom::PrintCompositor::Status status, base::ReadOnlySharedMemoryRegion region) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + + if (PrintPreviewUI::ShouldCancelRequest(ids)) + return; + PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id); if (status != mojom::PrintCompositor::Status::kSuccess) { DLOG(ERROR) << "Compositing pdf failed with error " << status; @@ -420,6 +402,10 @@ void PrintPreviewMessageHandler::OnCompositeToPdfDone( mojom::PrintCompositor::Status status, base::ReadOnlySharedMemoryRegion region) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + + if (PrintPreviewUI::ShouldCancelRequest(ids)) + return; + PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id); if (status != mojom::PrintCompositor::Status::kSuccess) { DLOG(ERROR) << "Completion of document to pdf failed with error " << status; @@ -460,6 +446,10 @@ void PrintPreviewMessageHandler::OnPrepareForDocumentToPdfDone( const PrintHostMsg_PreviewIds& ids, mojom::PrintCompositor::Status status) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + + if (PrintPreviewUI::ShouldCancelRequest(ids)) + return; + if (status != mojom::PrintCompositor::Status::kSuccess) { PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id); if (print_preview_ui) @@ -511,10 +501,6 @@ bool PrintPreviewMessageHandler::OnMessageReceived( OnDidPrepareForDocumentToPdf) IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDefaultPageLayout, OnDidGetDefaultPageLayout) - IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewCancelled, - OnPrintPreviewCancelled) - IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewInvalidPrinterSettings, - OnInvalidPrinterSettings) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; diff --git a/chromium/chrome/browser/printing/print_preview_message_handler.h b/chromium/chrome/browser/printing/print_preview_message_handler.h index d1354decb3d..a2a0727e760 100644 --- a/chromium/chrome/browser/printing/print_preview_message_handler.h +++ b/chromium/chrome/browser/printing/print_preview_message_handler.h @@ -9,13 +9,14 @@ #include "base/memory/read_only_shared_memory_region.h" #include "base/memory/weak_ptr.h" #include "chrome/services/printing/public/mojom/pdf_nup_converter.mojom.h" +#include "components/printing/common/print.mojom-forward.h" #include "components/services/print_compositor/public/mojom/print_compositor.mojom.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" +#include "printing/mojom/print.mojom-forward.h" struct PrintHostMsg_DidPreviewDocument_Params; struct PrintHostMsg_DidPreviewPage_Params; -struct PrintHostMsg_DidStartPreview_Params; struct PrintHostMsg_PreviewIds; struct PrintHostMsg_RequestPrintPreview_Params; @@ -35,7 +36,6 @@ class Rect; namespace printing { class PrintPreviewUI; -struct PageSizeMargins; // Manages the print preview handling for a WebContents. class PrintPreviewMessageHandler @@ -65,11 +65,12 @@ class PrintPreviewMessageHandler void OnRequestPrintPreview( content::RenderFrameHost* render_frame_host, const PrintHostMsg_RequestPrintPreview_Params& params); - void OnDidGetDefaultPageLayout(const PageSizeMargins& page_layout_in_points, - const gfx::Rect& printable_area_in_points, - bool has_custom_page_size_style, - const PrintHostMsg_PreviewIds& ids); - void OnDidStartPreview(const PrintHostMsg_DidStartPreview_Params& params, + void OnDidGetDefaultPageLayout( + const mojom::PageSizeMargins& page_layout_in_points, + const gfx::Rect& printable_area_in_points, + bool has_custom_page_size_style, + const PrintHostMsg_PreviewIds& ids); + void OnDidStartPreview(const mojom::DidStartPreviewParams& params, const PrintHostMsg_PreviewIds& ids); void OnDidPrepareForDocumentToPdf(int document_cookie, const PrintHostMsg_PreviewIds& ids); @@ -80,10 +81,6 @@ class PrintPreviewMessageHandler content::RenderFrameHost* render_frame_host, const PrintHostMsg_DidPreviewDocument_Params& params, const PrintHostMsg_PreviewIds& ids); - void OnPrintPreviewCancelled(int document_cookie, - const PrintHostMsg_PreviewIds& ids); - void OnInvalidPrinterSettings(int document_cookie, - const PrintHostMsg_PreviewIds& ids); void NotifyUIPreviewPageReady( PrintPreviewUI* print_preview_ui, diff --git a/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc b/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc index 84ff5278fb3..a5ac123c871 100644 --- a/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc +++ b/chromium/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc @@ -39,6 +39,7 @@ #include "chrome/common/chrome_paths.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/printing/common/print.mojom.h" #include "components/printing/common/print_messages.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui_message_handler.h" @@ -269,7 +270,7 @@ class PrintPreviewObserver : public WebContentsObserver { // Called when the observer gets the IPC message with the preview document's // properties. - void OnDidStartPreview(const PrintHostMsg_DidStartPreview_Params& params, + void OnDidStartPreview(const mojom::DidStartPreviewParams& params, const PrintHostMsg_PreviewIds& ids) { WebContents* web_contents = GetDialog(); ASSERT_TRUE(web_contents); diff --git a/chromium/chrome/browser/printing/print_view_manager.cc b/chromium/chrome/browser/printing/print_view_manager.cc index d31f5ca49b4..7c28f751858 100644 --- a/chromium/chrome/browser/printing/print_view_manager.cc +++ b/chromium/chrome/browser/printing/print_view_manager.cc @@ -89,8 +89,8 @@ bool PrintViewManager::PrintForSystemDialogNow( SetPrintingRFH(print_preview_rfh_); - // Don't print / print preview interstitials or crashed tabs. - if (IsInterstitialOrCrashed()) + // Don't print / print preview crashed tabs. + if (IsCrashed()) return false; GetPrintRenderFrame(print_preview_rfh_)->PrintForSystemDialog(); @@ -203,8 +203,8 @@ bool PrintViewManager::PrintPreview( if (print_preview_state_ != NOT_PREVIEWING) return false; - // Don't print / print preview interstitials or crashed tabs. - if (IsInterstitialOrCrashed()) + // Don't print / print preview crashed tabs. + if (IsCrashed()) return false; GetPrintRenderFrame(rfh)->InitiatePrintPreview(std::move(print_renderer), diff --git a/chromium/chrome/browser/printing/print_view_manager_base.cc b/chromium/chrome/browser/printing/print_view_manager_base.cc index a058d93622f..8a743d0dd74 100644 --- a/chromium/chrome/browser/printing/print_view_manager_base.cc +++ b/chromium/chrome/browser/printing/print_view_manager_base.cc @@ -17,7 +17,6 @@ #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/utf_string_conversions.h" -#include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "base/timer/timer.h" #include "build/build_config.h" @@ -36,6 +35,7 @@ #include "components/prefs/pref_service.h" #include "components/printing/browser/print_composite_client.h" #include "components/printing/browser/print_manager_utils.h" +#include "components/printing/common/print.mojom.h" #include "components/printing/common/print_messages.h" #include "components/services/print_compositor/public/cpp/print_service_mojo_types.h" #include "content/public/browser/browser_task_traits.h" @@ -85,8 +85,8 @@ void OnPrintSettingsDoneWrapper(PrintSettingsCallback settings_callback, std::unique_ptr<PrinterQuery> query) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - base::PostTask( - FROM_HERE, {content::BrowserThread::UI}, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(settings_callback), std::move(query))); } @@ -132,8 +132,8 @@ PrintViewManagerBase::~PrintViewManagerBase() { bool PrintViewManagerBase::PrintNow(content::RenderFrameHost* rfh) { DisconnectFromCurrentPrintJob(); - // Don't print / print preview interstitials or crashed tabs. - if (IsInterstitialOrCrashed()) + // Don't print / print preview crashed tabs. + if (IsCrashed()) return false; SetPrintingRFH(rfh); @@ -153,8 +153,8 @@ void PrintViewManagerBase::PrintForPrintPreview( weak_ptr_factory_.GetWeakPtr(), print_data, job_settings.FindIntKey(kSettingPreviewPageCount).value(), std::move(callback)); - base::PostTask( - FROM_HERE, {content::BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(CreateQueryWithSettings, std::move(job_settings), rfh->GetProcess()->GetID(), rfh->GetRoutingID(), queue_, std::move(settings_callback))); @@ -200,8 +200,8 @@ void PrintViewManagerBase::OnPrintSettingsDone( if (printer_query->last_status() == PrintingContext::CANCEL) { queue_->QueuePrinterQuery(std::move(printer_query)); #if defined(OS_WIN) - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&PrintViewManagerBase::SystemDialogCancelled, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintViewManagerBase::SystemDialogCancelled, weak_ptr_factory_.GetWeakPtr())); #endif std::move(callback).Run(base::Value()); @@ -209,8 +209,8 @@ void PrintViewManagerBase::OnPrintSettingsDone( } if (!printer_query->cookie() || !printer_query->settings().dpi()) { - base::PostTask( - FROM_HERE, {content::BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrinterQuery::StopWorker, std::move(printer_query))); std::move(callback).Run(base::Value("Update settings failed")); return; @@ -220,8 +220,8 @@ void PrintViewManagerBase::OnPrintSettingsDone( // OnDidGetPrintedPagesCount(). int cookie = printer_query->cookie(); queue_->QueuePrinterQuery(std::move(printer_query)); - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&PrintViewManagerBase::StartLocalPrintJob, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintViewManagerBase::StartLocalPrintJob, weak_ptr_factory_.GetWeakPtr(), print_data, page_count, cookie, std::move(callback))); } @@ -323,7 +323,7 @@ void PrintViewManagerBase::OnDidPrintDocument( if (!PrintJobHasDocument(params.document_cookie)) return; - const PrintHostMsg_DidPrintContent_Params& content = params.content; + const mojom::DidPrintContentParams& content = params.content; if (!content.metafile_data_region.IsValid()) { NOTREACHED() << "invalid memory handle"; web_contents()->Stop(); @@ -703,16 +703,15 @@ bool PrintViewManagerBase::OpportunisticallyCreatePrintJob(int cookie) { return true; } -bool PrintViewManagerBase::IsInterstitialOrCrashed() { - return web_contents()->ShowingInterstitialPage() || - web_contents()->IsCrashed(); +bool PrintViewManagerBase::IsCrashed() { + return web_contents()->IsCrashed(); } bool PrintViewManagerBase::PrintNowInternal( content::RenderFrameHost* rfh, std::unique_ptr<IPC::Message> message) { - // Don't print / print preview interstitials or crashed tabs. - if (IsInterstitialOrCrashed()) + // Don't print / print preview crashed tabs. + if (IsCrashed()) return false; return rfh->Send(message.release()); } @@ -737,8 +736,8 @@ void PrintViewManagerBase::ReleasePrinterQuery() { std::unique_ptr<PrinterQuery> printer_query = queue_->PopPrinterQuery(cookie); if (!printer_query) return; - base::PostTask( - FROM_HERE, {content::BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrinterQuery::StopWorker, std::move(printer_query))); } diff --git a/chromium/chrome/browser/printing/print_view_manager_base.h b/chromium/chrome/browser/printing/print_view_manager_base.h index 3d434244927..94b65e85561 100644 --- a/chromium/chrome/browser/printing/print_view_manager_base.h +++ b/chromium/chrome/browser/printing/print_view_manager_base.h @@ -73,9 +73,8 @@ class PrintViewManagerBase : public content::NotificationObserver, protected: explicit PrintViewManagerBase(content::WebContents* web_contents); - // Helper method for checking whether the WebContents is showing an - // interstitial page or is crashed. - bool IsInterstitialOrCrashed(); + // Helper method for checking whether the WebContents is crashed. + bool IsCrashed(); // Helper method for Print*Now(). bool PrintNowInternal(content::RenderFrameHost* rfh, diff --git a/chromium/chrome/browser/printing/print_view_manager_unittest.cc b/chromium/chrome/browser/printing/print_view_manager_unittest.cc index 81d6a2c91a8..1040cf633da 100644 --- a/chromium/chrome/browser/printing/print_view_manager_unittest.cc +++ b/chromium/chrome/browser/printing/print_view_manager_unittest.cc @@ -42,8 +42,8 @@ class TestPrintViewManager : public PrintViewManagerBase { // Mostly copied from PrintViewManager::PrintPreviewNow(). We can't override // PrintViewManager since it is a user data class. bool PrintPreviewNow(content::RenderFrameHost* rfh, bool has_selection) { - // Don't print / print preview interstitials or crashed tabs. - if (IsInterstitialOrCrashed()) + // Don't print / print preview crashed tabs. + if (IsCrashed()) return false; mojo::AssociatedRemote<mojom::PrintRenderFrame> print_render_frame; diff --git a/chromium/chrome/browser/printing/printer_manager_dialog_linux.cc b/chromium/chrome/browser/printing/printer_manager_dialog_linux.cc index 07d9dee216a..8515ec8a5ee 100644 --- a/chromium/chrome/browser/printing/printer_manager_dialog_linux.cc +++ b/chromium/chrome/browser/printing/printer_manager_dialog_linux.cc @@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/environment.h" #include "base/files/file_util.h" +#include "base/logging.h" #include "base/nix/xdg_util.h" #include "base/process/kill.h" #include "base/process/launch.h" diff --git a/chromium/chrome/browser/printing/printer_query.cc b/chromium/chrome/browser/printing/printer_query.cc index db7ee262b81..689a59232c6 100644 --- a/chromium/chrome/browser/printing/printer_query.cc +++ b/chromium/chrome/browser/printing/printer_query.cc @@ -58,8 +58,8 @@ void PrinterQuery::PostSettingsDoneToIO( std::unique_ptr<PrintSettings> new_settings, PrintingContext::Result result) { // |this| is owned by |callback|, so |base::Unretained()| is safe. - base::PostTask( - FROM_HERE, {content::BrowserThread::IO}, + content::GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrinterQuery::GetSettingsDone, base::Unretained(this), std::move(callback), std::move(new_settings), result)); } diff --git a/chromium/chrome/browser/printing/printing_message_filter.cc b/chromium/chrome/browser/printing/printing_message_filter.cc index d105aae9c8b..fb5d48349ee 100644 --- a/chromium/chrome/browser/printing/printing_message_filter.cc +++ b/chromium/chrome/browser/printing/printing_message_filter.cc @@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/memory/singleton.h" -#include "base/task/post_task.h" #include "build/branding_buildflags.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" @@ -102,8 +101,7 @@ PrintingMessageFilter::PrintingMessageFilter(int render_process_id, ->Subscribe(base::Bind(&PrintingMessageFilter::ShutdownOnUIThread, base::Unretained(this))); is_printing_enabled_.Init(prefs::kPrintingEnabled, profile->GetPrefs()); - is_printing_enabled_.MoveToSequence( - base::CreateSingleThreadTaskRunner({BrowserThread::IO})); + is_printing_enabled_.MoveToSequence(content::GetIOThreadTaskRunner({})); } PrintingMessageFilter::~PrintingMessageFilter() { @@ -278,8 +276,8 @@ void PrintingMessageFilter::OnUpdatePrintSettingsReply( #if defined(OS_WIN) && BUILDFLAG(ENABLE_PRINT_PREVIEW) if (canceled) { int routing_id = reply_msg->routing_id(); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PrintingMessageFilter::NotifySystemDialogCancelled, this, routing_id)); } diff --git a/chromium/chrome/browser/printing/printing_service.cc b/chromium/chrome/browser/printing/printing_service.cc index 1c9e0853250..2b73b110049 100644 --- a/chromium/chrome/browser/printing/printing_service.cc +++ b/chromium/chrome/browser/printing/printing_service.cc @@ -5,7 +5,7 @@ #include "chrome/browser/printing/printing_service.h" #include "base/no_destructor.h" -#include "build/build_config.h" +#include "chrome/browser/service_sandbox_type.h" #include "chrome/grit/generated_resources.h" #include "content/public/browser/service_process_host.h" @@ -17,9 +17,6 @@ const mojo::Remote<printing::mojom::PrintingService>& GetPrintingService() { remote->BindNewPipeAndPassReceiver(), content::ServiceProcessHost::Options() .WithDisplayName(IDS_UTILITY_PROCESS_PRINTING_SERVICE_NAME) -#if defined(OS_WIN) - .WithSandboxType(service_manager::SandboxType::kPdfConversion) -#endif .Pass()); // Ensure that if the interface is ever disconnected (e.g. the service |