mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
ceftests: Add tests for PrintToPdf
This commit is contained in:
committed by
Marshall Greenblatt
parent
6bd53b6093
commit
2c411892e2
@@ -540,6 +540,7 @@
|
||||
'tests/ceftests/permission_prompt_unittest.cc',
|
||||
'tests/ceftests/preference_unittest.cc',
|
||||
'tests/ceftests/print_unittest.cc',
|
||||
'tests/ceftests/print_to_pdf_unittest.cc',
|
||||
'tests/ceftests/process_message_unittest.cc',
|
||||
'tests/ceftests/request_context_unittest.cc',
|
||||
'tests/ceftests/request_handler_unittest.cc',
|
||||
|
290
tests/ceftests/print_to_pdf_unittest.cc
Normal file
290
tests/ceftests/print_to_pdf_unittest.cc
Normal file
@@ -0,0 +1,290 @@
|
||||
// Copyright (c) 2025 The Chromium Embedded Framework 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 <algorithm>
|
||||
|
||||
#include "include/base/cef_callback.h"
|
||||
#include "include/wrapper/cef_closure_task.h"
|
||||
#include "include/wrapper/cef_scoped_temp_dir.h"
|
||||
#include "tests/ceftests/test_handler.h"
|
||||
#include "tests/ceftests/test_util.h"
|
||||
#include "tests/gtest/include/gtest/gtest.h"
|
||||
#include "tests/shared/browser/file_util.h"
|
||||
|
||||
namespace {
|
||||
|
||||
const char kPrintHtmlUrl[] = "https://tests/print.html";
|
||||
const char kTestFileName[] = "print.pdf";
|
||||
#if defined(OS_WIN)
|
||||
const char kTestFileNameInvalid[] = "print.pdf?";
|
||||
#endif // defined(OS_WIN)
|
||||
const char kTestHtml[] =
|
||||
"<!DOCTYPE html>\n"
|
||||
"<html lang=\"en\">\n"
|
||||
"<head>\n"
|
||||
" <meta charset=\"UTF-8\">\n"
|
||||
" <meta name=\"viewport\" content=\"width=device-width, "
|
||||
"initial-scale=1.0\">\n"
|
||||
" <title>Print Test</title>\n"
|
||||
" <style>\n"
|
||||
" body {\n"
|
||||
" font-family: Arial, sans-serif;\n"
|
||||
" margin: 20px;\n"
|
||||
" padding: 20px;\n"
|
||||
" border: 1px solid #ccc;\n"
|
||||
" }\n"
|
||||
" h1 {\n"
|
||||
" color: #333;\n"
|
||||
" }\n"
|
||||
" p {\n"
|
||||
" font-size: 16px;\n"
|
||||
" line-height: 1.5;\n"
|
||||
" }\n"
|
||||
" @media print {\n"
|
||||
" body {\n"
|
||||
" margin: 0;\n"
|
||||
" padding: 0;\n"
|
||||
" border: none;\n"
|
||||
" }\n"
|
||||
" h1 {\n"
|
||||
" color: black;\n"
|
||||
" }\n"
|
||||
" p {\n"
|
||||
" color: black;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" </style>\n"
|
||||
"</head>\n"
|
||||
"<body>\n"
|
||||
" <h1>Print Test Document</h1>\n"
|
||||
" <p>This is a simple test document to check printing "
|
||||
"functionality.</p>\n"
|
||||
"</body>\n"
|
||||
"</html>";
|
||||
|
||||
// Browser-side test handler.
|
||||
class PrintToPdfTestHandler : public TestHandler, public CefPdfPrintCallback {
|
||||
public:
|
||||
PrintToPdfTestHandler(const std::string& url, bool expect_ok)
|
||||
: url_(url), expect_ok_(expect_ok) {}
|
||||
|
||||
virtual std::string GetTestFileName() { return kTestFileName; }
|
||||
|
||||
void RunTest() override {
|
||||
EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
|
||||
|
||||
test_path_ =
|
||||
client::file_util::JoinPath(temp_dir_.GetPath(), GetTestFileName());
|
||||
|
||||
// Add the resource.
|
||||
AddResource(url_, kTestHtml, "text/html");
|
||||
|
||||
// Create the browser.
|
||||
CreateBrowser(url_);
|
||||
|
||||
// Time out the test after a reasonable period of time.
|
||||
SetTestTimeout(5000);
|
||||
}
|
||||
|
||||
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
|
||||
CefRefPtr<CefFrame> frame,
|
||||
int httpStatusCode) override {
|
||||
const std::string& url = frame->GetURL();
|
||||
if (url == "about:blank" || url.find("chrome-extension://") == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (url == kPrintHtmlUrl) {
|
||||
EXPECT_FALSE(got_on_load_end_html_);
|
||||
got_on_load_end_html_.yes();
|
||||
} else {
|
||||
NOTREACHED() << "url=" << url;
|
||||
}
|
||||
|
||||
PrintToPDF(browser);
|
||||
}
|
||||
|
||||
void OnPdfPrintFinished(const CefString& path, bool ok) override {
|
||||
EXPECT_EQ(expect_ok_, ok);
|
||||
|
||||
if (ok) {
|
||||
EXPECT_EQ(test_path_, path);
|
||||
}
|
||||
|
||||
EXPECT_FALSE(got_on_pdf_print_finished_);
|
||||
got_on_pdf_print_finished_.yes();
|
||||
|
||||
CompleteTest();
|
||||
}
|
||||
|
||||
void VerifyResultsOnFileThread() {
|
||||
EXPECT_TRUE(CefCurrentlyOn(TID_FILE_USER_VISIBLE));
|
||||
|
||||
// Verify the file contents.
|
||||
std::string contents;
|
||||
bool ok = client::file_util::ReadFileToString(test_path_, &contents);
|
||||
EXPECT_EQ(ok, expect_ok_);
|
||||
if (expect_ok_) {
|
||||
EXPECT_GT(contents.size(), 1024U);
|
||||
// https://en.wikipedia.org/wiki/PDF
|
||||
// The file starts with a header containing a magic number (as a readable
|
||||
// string) and the version of the format, for example %PDF-1.7
|
||||
if (contents.size() >= 4U) {
|
||||
EXPECT_EQ(contents[0], '%');
|
||||
EXPECT_EQ(contents[1], 'P');
|
||||
EXPECT_EQ(contents[2], 'D');
|
||||
EXPECT_EQ(contents[3], 'F');
|
||||
}
|
||||
}
|
||||
|
||||
EXPECT_TRUE(temp_dir_.Delete());
|
||||
EXPECT_TRUE(temp_dir_.IsEmpty());
|
||||
|
||||
CefPostTask(TID_UI,
|
||||
base::BindOnce(&PrintToPdfTestHandler::CompleteTest, this));
|
||||
}
|
||||
|
||||
void CompleteTest() {
|
||||
if (!verified_results_ && !temp_dir_.IsEmpty()) {
|
||||
verified_results_ = true;
|
||||
CefPostTask(TID_FILE_USER_VISIBLE,
|
||||
base::BindOnce(
|
||||
&PrintToPdfTestHandler::VerifyResultsOnFileThread, this));
|
||||
return;
|
||||
}
|
||||
|
||||
DestroyTest();
|
||||
}
|
||||
|
||||
void DestroyTest() override {
|
||||
EXPECT_TRUE(got_on_load_end_html_);
|
||||
EXPECT_TRUE(got_on_pdf_print_finished_);
|
||||
EXPECT_TRUE(verified_results_);
|
||||
|
||||
if (temp_dir_.IsValid()) {
|
||||
ASSERT_TRUE(temp_dir_.Delete());
|
||||
}
|
||||
|
||||
TestHandler::DestroyTest();
|
||||
}
|
||||
|
||||
virtual void PrintToPDF(CefRefPtr<CefBrowser> browser) {
|
||||
CefPdfPrintSettings settings;
|
||||
browser->GetHost()->PrintToPDF(test_path_, settings, this);
|
||||
}
|
||||
|
||||
protected:
|
||||
CefScopedTempDir temp_dir_;
|
||||
|
||||
const std::string url_;
|
||||
CefString test_path_;
|
||||
const bool expect_ok_;
|
||||
bool verified_results_ = false;
|
||||
|
||||
TrackCallback got_on_load_end_html_;
|
||||
TrackCallback got_on_pdf_print_finished_;
|
||||
|
||||
IMPLEMENT_REFCOUNTING(PrintToPdfTestHandler);
|
||||
};
|
||||
|
||||
class PrintToPdfInvalidMarginTestHandler : public PrintToPdfTestHandler {
|
||||
public:
|
||||
PrintToPdfInvalidMarginTestHandler(const std::string& url, bool expect_ok)
|
||||
: PrintToPdfTestHandler(url, expect_ok) {}
|
||||
|
||||
virtual void PrintToPDF(CefRefPtr<CefBrowser> browser) override {
|
||||
CefPdfPrintSettings settings;
|
||||
settings.margin_left = -1;
|
||||
settings.margin_type = cef_pdf_print_margin_type_t::PDF_PRINT_MARGIN_CUSTOM;
|
||||
browser->GetHost()->PrintToPDF(test_path_, settings, this);
|
||||
}
|
||||
|
||||
protected:
|
||||
IMPLEMENT_REFCOUNTING(PrintToPdfInvalidMarginTestHandler);
|
||||
};
|
||||
|
||||
class PrintToPdfInvalidPaperDimTestHandler : public PrintToPdfTestHandler {
|
||||
public:
|
||||
PrintToPdfInvalidPaperDimTestHandler(const std::string& url, bool expect_ok)
|
||||
: PrintToPdfTestHandler(url, expect_ok) {}
|
||||
|
||||
virtual void PrintToPDF(CefRefPtr<CefBrowser> browser) override {
|
||||
CefPdfPrintSettings settings;
|
||||
settings.paper_width = -1;
|
||||
settings.paper_height = -1;
|
||||
browser->GetHost()->PrintToPDF(test_path_, settings, this);
|
||||
}
|
||||
|
||||
protected:
|
||||
IMPLEMENT_REFCOUNTING(PrintToPdfInvalidPaperDimTestHandler);
|
||||
};
|
||||
|
||||
class PrintToPdfInvalidScaleTestHandler : public PrintToPdfTestHandler {
|
||||
public:
|
||||
PrintToPdfInvalidScaleTestHandler(const std::string& url, bool expect_ok)
|
||||
: PrintToPdfTestHandler(url, expect_ok) {}
|
||||
|
||||
virtual void PrintToPDF(CefRefPtr<CefBrowser> browser) override {
|
||||
CefPdfPrintSettings settings;
|
||||
settings.scale = 999999999;
|
||||
browser->GetHost()->PrintToPDF(test_path_, settings, this);
|
||||
}
|
||||
|
||||
protected:
|
||||
IMPLEMENT_REFCOUNTING(PrintToPdfInvalidScaleTestHandler);
|
||||
};
|
||||
|
||||
#if defined(OS_WIN)
|
||||
class PrintToPdfInvalidFileNameTestHandler : public PrintToPdfTestHandler {
|
||||
public:
|
||||
PrintToPdfInvalidFileNameTestHandler(const std::string& url, bool expect_ok)
|
||||
: PrintToPdfTestHandler(url, expect_ok) {}
|
||||
|
||||
std::string GetTestFileName() override { return kTestFileNameInvalid; }
|
||||
|
||||
protected:
|
||||
IMPLEMENT_REFCOUNTING(PrintToPdfInvalidFileNameTestHandler);
|
||||
};
|
||||
#endif // defined(OS_WIN)
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(PdfPrintTest, DefaultSettings) {
|
||||
CefRefPtr<PrintToPdfTestHandler> handler =
|
||||
new PrintToPdfTestHandler(kPrintHtmlUrl, true);
|
||||
handler->ExecuteTest();
|
||||
ReleaseAndWaitForDestructor(handler);
|
||||
}
|
||||
|
||||
TEST(PdfPrintTest, InvalidMargin) {
|
||||
// Should still pass as settings are validated
|
||||
CefRefPtr<PrintToPdfInvalidMarginTestHandler> handler =
|
||||
new PrintToPdfInvalidMarginTestHandler(kPrintHtmlUrl, true);
|
||||
handler->ExecuteTest();
|
||||
ReleaseAndWaitForDestructor(handler);
|
||||
}
|
||||
|
||||
TEST(PdfPrintTest, InvalidPageDim) {
|
||||
// Should still pass as settings are validated
|
||||
CefRefPtr<PrintToPdfInvalidPaperDimTestHandler> handler =
|
||||
new PrintToPdfInvalidPaperDimTestHandler(kPrintHtmlUrl, true);
|
||||
handler->ExecuteTest();
|
||||
ReleaseAndWaitForDestructor(handler);
|
||||
}
|
||||
|
||||
TEST(PdfPrintTest, InvalidScale) {
|
||||
CefRefPtr<PrintToPdfInvalidScaleTestHandler> handler =
|
||||
new PrintToPdfInvalidScaleTestHandler(kPrintHtmlUrl, false);
|
||||
handler->ExecuteTest();
|
||||
ReleaseAndWaitForDestructor(handler);
|
||||
}
|
||||
|
||||
#if defined(OS_WIN)
|
||||
TEST(PdfPrintTest, InvalidFileName) {
|
||||
CefRefPtr<PrintToPdfInvalidFileNameTestHandler> handler =
|
||||
new PrintToPdfInvalidFileNameTestHandler(kPrintHtmlUrl, false);
|
||||
handler->ExecuteTest();
|
||||
ReleaseAndWaitForDestructor(handler);
|
||||
}
|
||||
#endif // defined(OS_WIN)
|
Reference in New Issue
Block a user