Commit 667c8da0 authored by rbpotter's avatar rbpotter Committed by Commit Bot

PrintPreviewHandler: Add second preview test

Test that PrintPreviewHandler forwards renderer messages from the
PrintPreviewUI to the Print Preview javascript correctly, and that it
tries to kill the renderer if it receives unexpected messages.

Bug: None
Change-Id: Iec26fcd115270a167de6370aba2b90d5c68cf380
Reviewed-on: https://chromium-review.googlesource.com/742649
Commit-Queue: Rebekah Potter <rbpotter@chromium.org>
Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#513021}
parent 64b55601
...@@ -101,10 +101,6 @@ class PrintPreviewHandler ...@@ -101,10 +101,6 @@ class PrintPreviewHandler
return regenerate_preview_request_count_; return regenerate_preview_request_count_;
} }
// Shuts down the initiator renderer. Called when a bad IPC message is
// received.
void BadMessageReceived();
// Notifies PDF Printer Handler that |path| was selected. Used for tests. // Notifies PDF Printer Handler that |path| was selected. Used for tests.
void FileSelectedForTesting(const base::FilePath& path, void FileSelectedForTesting(const base::FilePath& path,
int index, int index,
...@@ -123,6 +119,10 @@ class PrintPreviewHandler ...@@ -123,6 +119,10 @@ class PrintPreviewHandler
// Protected so unit tests can override. // Protected so unit tests can override.
virtual PrinterHandler* GetPrinterHandler(printing::PrinterType printer_type); virtual PrinterHandler* GetPrinterHandler(printing::PrinterType printer_type);
// Shuts down the initiator renderer. Called when a bad IPC message is
// received.
virtual void BadMessageReceived();
// Gets the initiator for the print preview dialog. // Gets the initiator for the print preview dialog.
virtual content::WebContents* GetInitiator() const; virtual content::WebContents* GetInitiator() const;
...@@ -141,6 +141,7 @@ class PrintPreviewHandler ...@@ -141,6 +141,7 @@ class PrintPreviewHandler
FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, GetPrinterCapabilities); FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, GetPrinterCapabilities);
FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, Print); FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, Print);
FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, GetPreview); FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, GetPreview);
FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, SendPreviewUpdates);
class AccessTokenService; class AccessTokenService;
content::WebContents* preview_web_contents() const; content::WebContents* preview_web_contents() const;
......
...@@ -137,6 +137,36 @@ base::Value GetPrintTicket(printing::PrinterType type, bool cloud) { ...@@ -137,6 +137,36 @@ base::Value GetPrintTicket(printing::PrinterType type, bool cloud) {
return ticket; return ticket;
} }
base::Value GetPrintPreviewTicket(bool is_pdf) {
base::Value print_ticket = GetPrintTicket(kLocalPrinter, false);
// Make some modifications to match a preview print ticket.
print_ticket.SetKey(kSettingPageRange, base::Value());
print_ticket.SetKey(kIsFirstRequest, base::Value(true));
print_ticket.SetKey(kPreviewRequestID, base::Value(0));
print_ticket.SetKey(kSettingPreviewModifiable, base::Value(is_pdf));
print_ticket.SetKey(kSettingGenerateDraftData, base::Value(true));
print_ticket.RemoveKey(kSettingPageWidth);
print_ticket.RemoveKey(kSettingPageHeight);
print_ticket.RemoveKey(kSettingShowSystemDialog);
return print_ticket;
}
std::unique_ptr<base::ListValue> ConstructPreviewArgs(
base::StringPiece callback_id,
const base::Value& print_ticket) {
base::Value args(base::Value::Type::LIST);
args.GetList().emplace_back(callback_id);
std::string json;
base::JSONWriter::Write(print_ticket, &json);
args.GetList().emplace_back(json);
std::string page_count;
base::JSONWriter::Write(base::Value(-1), &page_count);
args.GetList().emplace_back(page_count);
return base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args)));
}
class TestPrinterHandler : public PrinterHandler { class TestPrinterHandler : public PrinterHandler {
public: public:
explicit TestPrinterHandler(const std::vector<PrinterInfo>& printers) { explicit TestPrinterHandler(const std::vector<PrinterInfo>& printers) {
...@@ -230,7 +260,8 @@ class TestPrintPreviewHandler : public PrintPreviewHandler { ...@@ -230,7 +260,8 @@ class TestPrintPreviewHandler : public PrintPreviewHandler {
public: public:
TestPrintPreviewHandler(std::unique_ptr<PrinterHandler> printer_handler, TestPrintPreviewHandler(std::unique_ptr<PrinterHandler> printer_handler,
content::WebContents* initiator) content::WebContents* initiator)
: test_printer_handler_(std::move(printer_handler)), : bad_messages_(0),
test_printer_handler_(std::move(printer_handler)),
initiator_(initiator) {} initiator_(initiator) {}
PrinterHandler* GetPrinterHandler(PrinterType printer_type) override { PrinterHandler* GetPrinterHandler(PrinterType printer_type) override {
...@@ -241,6 +272,8 @@ class TestPrintPreviewHandler : public PrintPreviewHandler { ...@@ -241,6 +272,8 @@ class TestPrintPreviewHandler : public PrintPreviewHandler {
void RegisterForGaiaCookieChanges() override {} void RegisterForGaiaCookieChanges() override {}
void UnregisterForGaiaCookieChanges() override {} void UnregisterForGaiaCookieChanges() override {}
void BadMessageReceived() override { bad_messages_++; }
content::WebContents* GetInitiator() const override { return initiator_; } content::WebContents* GetInitiator() const override { return initiator_; }
bool CalledOnlyForType(PrinterType printer_type) { bool CalledOnlyForType(PrinterType printer_type) {
...@@ -252,7 +285,10 @@ class TestPrintPreviewHandler : public PrintPreviewHandler { ...@@ -252,7 +285,10 @@ class TestPrintPreviewHandler : public PrintPreviewHandler {
void reset_calls() { called_for_type_.clear(); } void reset_calls() { called_for_type_.clear(); }
int bad_messages() { return bad_messages_; }
private: private:
int bad_messages_;
base::flat_set<PrinterType> called_for_type_; base::flat_set<PrinterType> called_for_type_;
std::unique_ptr<PrinterHandler> test_printer_handler_; std::unique_ptr<PrinterHandler> test_printer_handler_;
content::WebContents* const initiator_; content::WebContents* const initiator_;
...@@ -386,6 +422,18 @@ class PrintPreviewHandlerTest : public testing::Test { ...@@ -386,6 +422,18 @@ class PrintPreviewHandlerTest : public testing::Test {
return rph->sink(); return rph->sink();
} }
base::DictionaryValue VerifyPreviewMessage() {
// Verify that the preview was requested from the renderer
EXPECT_TRUE(
initiator_sink().GetUniqueMessageMatching(PrintMsg_PrintPreview::ID));
const IPC::Message* msg =
initiator_sink().GetFirstMessageMatching(PrintMsg_PrintPreview::ID);
EXPECT_TRUE(msg);
PrintMsg_PrintPreview::Param param;
PrintMsg_PrintPreview::Read(msg, &param);
return std::move(std::get<0>(param));
}
const Profile* profile() { return profile_.get(); } const Profile* profile() { return profile_.get(); }
content::TestWebUI* web_ui() { return web_ui_.get(); } content::TestWebUI* web_ui() { return web_ui_.get(); }
printing::TestPrintPreviewHandler* handler() { return handler_; } printing::TestPrintPreviewHandler* handler() { return handler_; }
...@@ -588,44 +636,16 @@ TEST_F(PrintPreviewHandlerTest, Print) { ...@@ -588,44 +636,16 @@ TEST_F(PrintPreviewHandlerTest, Print) {
TEST_F(PrintPreviewHandlerTest, GetPreview) { TEST_F(PrintPreviewHandlerTest, GetPreview) {
Initialize(); Initialize();
base::Value args(base::Value::Type::LIST); base::Value print_ticket = printing::GetPrintPreviewTicket(false);
args.GetList().emplace_back("test-callback-id-1");
base::Value print_ticket =
printing::GetPrintTicket(printing::kLocalPrinter, false);
// Make some modifications to match a preview print ticket.
print_ticket.SetKey(printing::kSettingPageRange, base::Value());
print_ticket.SetKey(printing::kIsFirstRequest, base::Value(true));
print_ticket.SetKey(printing::kPreviewRequestID, base::Value(0));
print_ticket.SetKey(printing::kSettingPreviewModifiable, base::Value(true));
print_ticket.SetKey(printing::kSettingGenerateDraftData, base::Value(true));
print_ticket.RemoveKey(printing::kSettingPageWidth);
print_ticket.RemoveKey(printing::kSettingPageHeight);
print_ticket.RemoveKey(printing::kSettingShowSystemDialog);
std::string json;
base::JSONWriter::Write(print_ticket, &json);
args.GetList().emplace_back(json);
std::string page_count;
base::JSONWriter::Write(base::Value(-1), &page_count);
args.GetList().emplace_back(page_count);
std::unique_ptr<base::ListValue> list_args = std::unique_ptr<base::ListValue> list_args =
base::ListValue::From(base::Value::ToUniquePtrValue(std::move(args))); printing::ConstructPreviewArgs("test-callback-id-1", print_ticket);
handler()->HandleGetPreview(list_args.get()); handler()->HandleGetPreview(list_args.get());
// Verify that the preview was requested from the renderer with the // Verify that the preview was requested from the renderer with the
// appropriate settings. // appropriate settings.
EXPECT_TRUE( base::DictionaryValue preview_params = VerifyPreviewMessage();
initiator_sink().GetUniqueMessageMatching(PrintMsg_PrintPreview::ID));
const IPC::Message* msg =
initiator_sink().GetFirstMessageMatching(PrintMsg_PrintPreview::ID);
ASSERT_TRUE(msg);
PrintMsg_PrintPreview::Param param;
PrintMsg_PrintPreview::Read(msg, &param);
bool preview_id_found = false; bool preview_id_found = false;
for (const auto& it : std::get<0>(param).DictItems()) { for (const auto& it : preview_params.DictItems()) {
if (it.first == printing::kPreviewUIID) { // This is added by the handler. if (it.first == printing::kPreviewUIID) { // This is added by the handler.
preview_id_found = true; preview_id_found = true;
continue; continue;
...@@ -636,3 +656,72 @@ TEST_F(PrintPreviewHandlerTest, GetPreview) { ...@@ -636,3 +656,72 @@ TEST_F(PrintPreviewHandlerTest, GetPreview) {
} }
EXPECT_TRUE(preview_id_found); EXPECT_TRUE(preview_id_found);
} }
TEST_F(PrintPreviewHandlerTest, SendPreviewUpdates) {
Initialize();
const char callback_id_in[] = "test-callback-id-1";
base::Value print_ticket = printing::GetPrintPreviewTicket(false);
std::unique_ptr<base::ListValue> list_args =
printing::ConstructPreviewArgs(callback_id_in, print_ticket);
handler()->HandleGetPreview(list_args.get());
base::DictionaryValue preview_params = VerifyPreviewMessage();
// Read the preview UI ID and request ID
const base::Value* request_value =
preview_params.FindKey(printing::kPreviewRequestID);
ASSERT_TRUE(request_value);
ASSERT_TRUE(request_value->is_int());
int preview_request_id = request_value->GetInt();
const base::Value* ui_value = preview_params.FindKey(printing::kPreviewUIID);
ASSERT_TRUE(ui_value);
ASSERT_TRUE(ui_value->is_int());
int preview_ui_id = ui_value->GetInt();
// Simulate renderer responses: PageLayoutReady, PageCountReady,
// PagePreviewReady, and OnPrintPreviewReady will be called in that order.
base::DictionaryValue layout;
layout.SetKey(printing::kSettingMarginTop, base::Value(34.0));
layout.SetKey(printing::kSettingMarginLeft, base::Value(34.0));
layout.SetKey(printing::kSettingMarginBottom, base::Value(34.0));
layout.SetKey(printing::kSettingMarginRight, base::Value(34.0));
layout.SetKey(printing::kSettingContentWidth, base::Value(544.0));
layout.SetKey(printing::kSettingContentHeight, base::Value(700.0));
layout.SetKey(printing::kSettingPrintableAreaX, base::Value(17));
layout.SetKey(printing::kSettingPrintableAreaY, base::Value(17));
layout.SetKey(printing::kSettingPrintableAreaWidth, base::Value(578));
layout.SetKey(printing::kSettingPrintableAreaHeight, base::Value(734));
handler()->SendPageLayoutReady(layout, false);
// Verify that page-layout-ready webUI event was fired.
AssertWebUIEventFired(*web_ui()->call_data().back(), "page-layout-ready");
// 1 page document. Modifiable so send default 100 scaling.
handler()->SendPageCountReady(1, preview_request_id, 100);
AssertWebUIEventFired(*web_ui()->call_data().back(), "page-count-ready");
// Page at index 0 is ready.
handler()->SendPagePreviewReady(0, preview_ui_id, preview_request_id);
AssertWebUIEventFired(*web_ui()->call_data().back(), "page-preview-ready");
// Print preview is ready.
handler()->OnPrintPreviewReady(preview_ui_id, preview_request_id);
CheckWebUIResponse(*web_ui()->call_data().back(), callback_id_in, true);
// Renderer responses have been as expected.
EXPECT_EQ(handler()->bad_messages(), 0);
// None of these should work since there has been no new preview request.
// Check that there are no new web UI messages sent.
size_t message_count = web_ui()->call_data().size();
handler()->SendPageLayoutReady(base::DictionaryValue(), false);
EXPECT_EQ(message_count, web_ui()->call_data().size());
handler()->SendPageCountReady(1, 0, -1);
EXPECT_EQ(message_count, web_ui()->call_data().size());
handler()->OnPrintPreviewReady(0, 0);
EXPECT_EQ(message_count, web_ui()->call_data().size());
// Handler should have tried to kill the renderer for each of these.
EXPECT_EQ(handler()->bad_messages(), 3);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment