Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7798)

Unified Diff: chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc

Issue 2804793002: Print Preview: Fix failure to save with long page title (Closed)
Patch Set: Add integration test Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..6f735f67acccedc0df3d9a2aea4e0a8d036d97d0
--- /dev/null
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -0,0 +1,184 @@
+// Copyright 2017 The Chromium 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 "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
+
+#include <Windows.h>
Lei Zhang 2017/04/19 21:14:07 lowercase
rbpotter 2017/04/19 23:30:12 Done.
+#include <commdlg.h>
+
+#include "base/auto_reset.h"
+#include "base/run_loop.h"
+#include "base/timer/timer.h"
+#include "chrome/browser/platform_util.h"
+#include "chrome/browser/printing/print_preview_dialog_controller.h"
+#include "chrome/browser/printing/print_preview_test.h"
+#include "chrome/browser/printing/print_view_manager.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "components/web_modal/web_contents_modal_dialog_manager.h"
+#include "content/public/browser/plugin_service.h"
+#include "content/public/browser/site_instance.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/shell_dialogs/select_file_dialog_win.h"
+
+using content::WebContents;
+using web_modal::WebContentsModalDialogManager;
+
+namespace {
+bool init_called = false;
Lei Zhang 2017/04/19 21:14:07 Can we avoid these global variables by doing the f
rbpotter 2017/04/19 23:30:13 Done.
+base::RunLoop* run_loop;
+
+} // namespace
+
+// Defined here as Windows crashes if this is defined in a class or a
+// namespace.
+UINT_PTR CALLBACK PrintPreviewHandlerTestHookFunction(HWND hdlg,
+ UINT uiMsg,
Lei Zhang 2017/04/19 21:14:07 message, wparam, lparam
rbpotter 2017/04/19 23:30:13 Done.
+ WPARAM wParam,
+ LPARAM lParam) {
+ if (uiMsg != WM_INITDIALOG)
+ return 0;
+ init_called = true;
+ PostMessage(hdlg, WM_COMMAND, IDABORT, 0);
+ if (run_loop)
+ run_loop->Quit();
+ return 1;
+}
+
+namespace {
+bool GetOpenFileNameImpl(OPENFILENAME* ofn) {
+ return ::GetOpenFileName(ofn);
+}
+
+bool GetSaveFileNameImpl(OPENFILENAME* ofn) {
+ // Modify ofn so that the hook function will be called.
+ ofn->Flags |= OFN_ENABLEHOOK;
+ ofn->lpfnHook = PrintPreviewHandlerTestHookFunction;
+ return ::GetSaveFileName(ofn);
+}
+
+class FakePrintPreviewHandler : public PrintPreviewHandler {
+ public:
+ explicit FakePrintPreviewHandler(content::WebUI* web_ui)
+ : save_failed_(false) {
+ set_web_ui(web_ui);
+ }
+
+ void FileSelected(const base::FilePath& path,
+ int index,
+ void* params) override {
+ save_failed_ = false;
+ if (run_loop)
+ run_loop->Quit();
Lei Zhang 2017/04/19 21:14:07 As is, would this end up calling Quit() twice?
rbpotter 2017/04/19 23:30:13 Only one of FileSelected or FileSelectionCanceled
+ }
+
+ void FileSelectionCanceled(void* params) override {
+ save_failed_ = true;
+ if (run_loop)
+ run_loop->Quit();
+ }
+
+ void StartPrintToPdf() {
+ PrintToPdf();
+ if (!run_loop && !init_called) {
+ base::RunLoop new_run_loop;
Lei Zhang 2017/04/19 21:14:08 If the RunLoop becomes a member variable, can we g
rbpotter 2017/04/19 23:30:12 Done.
+ base::AutoReset<base::RunLoop*> auto_reset(&run_loop, &new_run_loop);
+ new_run_loop.Run();
+ }
+ }
+
+ bool save_failed() { return save_failed_; }
+
+ protected:
Lei Zhang 2017/04/19 21:14:08 private?
rbpotter 2017/04/19 23:30:12 Done.
+ // Simplified version of select file to avoid checking preferences and sticky
+ // settings in the test
+ void SelectFile(const base::FilePath& default_filename,
+ bool prompt_user) override {
+ ui::SelectFileDialog::FileTypeInfo file_type_info;
+ file_type_info.extensions.resize(1);
+ file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
+ select_file_dialog_ = ui::CreateWinSelectFileDialog(
+ this, nullptr /*policy already checked*/,
+ base::Bind(GetOpenFileNameImpl), base::Bind(GetSaveFileNameImpl));
+ select_file_dialog_->SelectFile(
+ ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(),
+ default_filename, &file_type_info, 0, base::FilePath::StringType(),
+ platform_util::GetTopLevel(web_ui()->GetWebContents()->GetNativeView()),
+ NULL);
+ }
+
+ private:
+ bool save_failed_;
+};
+} // namespace
+
+class PrintPreviewHandlerTest : public PrintPreviewTest {
+ public:
+ PrintPreviewHandlerTest() {}
Lei Zhang 2017/04/19 21:14:08 Use braces or default consistently between the cto
rbpotter 2017/04/19 23:30:13 Done.
+ ~PrintPreviewHandlerTest() override = default;
+
+ void SetUp() override {
+ PrintPreviewTest::SetUp();
+
+ // Create a new tab
Lei Zhang 2017/04/19 21:14:08 Not sure if you need to do this. I think the brows
rbpotter 2017/04/19 23:30:13 Does not start with a tab - tried removing this an
Lei Zhang 2017/04/20 00:12:30 OK, I remembered wrong then.
+ chrome::NewTab(browser());
+
+ // Initialize state
+ init_called = false;
+ run_loop = nullptr;
+ }
+
+ protected:
+ void CreateUiAndHandler() {
+ WebContents* initiator =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ ASSERT_TRUE(initiator);
+
+ // Get print preview UI
+ printing::PrintPreviewDialogController* controller =
+ printing::PrintPreviewDialogController::GetInstance();
+ ASSERT_TRUE(controller);
+ printing::PrintViewManager* print_view_manager =
+ printing::PrintViewManager::FromWebContents(initiator);
+ print_view_manager->PrintPreviewNow(initiator->GetMainFrame(), false);
+ WebContents* preview_dialog =
+ controller->GetOrCreatePreviewDialog(initiator);
+ ASSERT_TRUE(preview_dialog);
+ preview_ui_ = static_cast<PrintPreviewUI*>(
+ preview_dialog->GetWebUI()->GetController());
+ ASSERT_TRUE(preview_ui_);
+
+ // Initialize |preview_handler_|
Lei Zhang 2017/04/19 21:14:07 Probably not needed.
rbpotter 2017/04/19 23:30:13 Done.
+ preview_handler_.reset(
Lei Zhang 2017/04/19 21:14:08 Can we use foo = base::MakeUnique<Foo>() instead o
rbpotter 2017/04/19 23:30:13 Done.
+ new FakePrintPreviewHandler(preview_dialog->GetWebUI()));
+ }
+
+ std::unique_ptr<FakePrintPreviewHandler> preview_handler_;
+ PrintPreviewUI* preview_ui_;
Lei Zhang 2017/04/19 21:14:07 Initialize this variable, or maybe just drop it an
rbpotter 2017/04/19 23:30:13 Done.
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PrintPreviewHandlerTest);
+};
+
+TEST_F(PrintPreviewHandlerTest, TestSaveAsPdf) {
+ CreateUiAndHandler();
+ preview_ui_->SetInitiatorTitle(L"111111111111111111111.html");
+ preview_handler_->StartPrintToPdf();
+ ASSERT_FALSE(!init_called && preview_handler_->save_failed());
Lei Zhang 2017/04/19 21:14:07 So this is the same as the following, right? ASSE
rbpotter 2017/04/19 23:30:13 Done.
+}
+
+TEST_F(PrintPreviewHandlerTest, TestSaveAsPdfLongFileName) {
+ CreateUiAndHandler();
+ preview_ui_->SetInitiatorTitle(
+ L"11111111111111111111111111111111111111111111111111111111111111111111111"
+ L"11111111111111111111111111111111111111111111111111111111111111111111111"
+ L"11111111111111111111111111111111111111111111111111111111111111111111111"
+ L"11111111111111111111111111111111111111111111111111111111111111111111111"
+ L"1111111111111111111111111111111111111111111111111.html");
+ preview_handler_->StartPrintToPdf();
+ ASSERT_FALSE(!init_called && preview_handler_->save_failed());
+}

Powered by Google App Engine
This is Rietveld 408576698