12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_preview_dialog_controller.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_preview_test.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_view_manager.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Test crashes on Aura due to initiator's native view having no parent.
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/104284
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetOrCreatePreviewDialog DISABLED_GetOrCreatePreviewDialog
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MultiplePreviewDialogs DISABLED_MultiplePreviewDialogs
22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define MAYBE_ClearInitiatorDetails DISABLED_ClearInitiatorDetails
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetOrCreatePreviewDialog GetOrCreatePreviewDialog
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MultiplePreviewDialogs MultiplePreviewDialogs
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define MAYBE_ClearInitiatorDetails ClearInitiatorDetails
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace printing {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef PrintPreviewTest PrintPreviewDialogControllerUnitTest;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Create/Get a preview dialog for initiator.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrintPreviewDialogControllerUnitTest, MAYBE_GetOrCreatePreviewDialog) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lets start with one window with one tab.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->count());
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::NewTab(browser());
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Create a reference to initiator contents.
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewDialogController* dialog_controller =
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrintPreviewDialogController::GetInstance();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(dialog_controller);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Get the preview dialog for initiator.
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PrintViewManager::FromWebContents(initiator)->PrintPreviewNow(false);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* preview_dialog =
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      dialog_controller->GetOrCreatePreviewDialog(initiator);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // New print preview dialog is a constrained window, so the number of tabs is
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // still 1.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_NE(initiator, preview_dialog);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Get the print preview dialog for the same initiator.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* new_preview_dialog =
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      dialog_controller->GetOrCreatePreviewDialog(initiator);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Preview dialog already exists. Tab count remains the same.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // 1:1 relationship between initiator and preview dialog.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(new_preview_dialog, preview_dialog);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Tests multiple print preview dialogs exist in the same browser for different
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// initiators. If a preview dialog already exists for an initiator, that
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// initiator gets focused.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PrintPreviewDialogControllerUnitTest, MAYBE_MultiplePreviewDialogs) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lets start with one window and two tabs.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabStripModel* tab_strip_model = browser()->tab_strip_model();
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(tab_strip_model);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, tab_strip_model->count());
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Create some new initiators.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::NewTab(browser());
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents_1 = tab_strip_model->GetActiveWebContents();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(web_contents_1);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::NewTab(browser());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents_2 = tab_strip_model->GetActiveWebContents();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(web_contents_2);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, tab_strip_model->count());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewDialogController* dialog_controller =
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrintPreviewDialogController::GetInstance();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(dialog_controller);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create preview dialog for |web_contents_1|
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintViewManager::FromWebContents(web_contents_1)->PrintPreviewNow(false);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* preview_dialog_1 =
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dialog_controller->GetOrCreatePreviewDialog(web_contents_1);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(web_contents_1, preview_dialog_1);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, tab_strip_model->count());
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create preview dialog for |web_contents_2|
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintViewManager::FromWebContents(web_contents_2)->PrintPreviewNow(false);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* preview_dialog_2 =
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dialog_controller->GetOrCreatePreviewDialog(web_contents_2);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(web_contents_2, preview_dialog_2);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(preview_dialog_1, preview_dialog_2);
109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // 2 initiators and 2 preview dialogs exist in the same browser.  The preview
110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // dialogs are constrained in their respective initiators.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, tab_strip_model->count());
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int tab_1_index = tab_strip_model->GetIndexOfWebContents(web_contents_1);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int tab_2_index = tab_strip_model->GetIndexOfWebContents(web_contents_2);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int preview_dialog_1_index =
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab_strip_model->GetIndexOfWebContents(preview_dialog_1);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int preview_dialog_2_index =
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab_strip_model->GetIndexOfWebContents(preview_dialog_2);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Constrained dialogs are not in the TabStripModel.
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-1, preview_dialog_1_index);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-1, preview_dialog_2_index);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Since |preview_dialog_2_index| was the most recently created dialog, its
125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // initiator should have focus.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(tab_2_index, tab_strip_model->active_index());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When we get the preview dialog for |web_contents_1|,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |preview_dialog_1| is activated and focused.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dialog_controller->GetOrCreatePreviewDialog(web_contents_1);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(tab_1_index, tab_strip_model->active_index());
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Check clearing the initiator details associated with a print preview dialog
135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// allows the initiator to create another print preview dialog.
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(PrintPreviewDialogControllerUnitTest, MAYBE_ClearInitiatorDetails) {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lets start with one window with one tab.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->count());
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::NewTab(browser());
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Create a reference to initiator contents.
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewDialogController* dialog_controller =
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrintPreviewDialogController::GetInstance();
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(dialog_controller);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Get the preview dialog for the initiator.
151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  PrintViewManager::FromWebContents(initiator)->PrintPreviewNow(false);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* preview_dialog =
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      dialog_controller->GetOrCreatePreviewDialog(initiator);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // New print preview dialog is a constrained window, so the number of tabs is
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // still 1.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_NE(initiator, preview_dialog);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Clear the initiator details associated with the preview dialog.
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dialog_controller->EraseInitiatorInfo(preview_dialog);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Get a new print preview dialog for the initiator.
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* new_preview_dialog =
165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      dialog_controller->GetOrCreatePreviewDialog(initiator);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // New print preview dialog is a constrained window, so the number of tabs is
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // still 1.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify a new print preview dialog has been created.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(new_preview_dialog, preview_dialog);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace printing
175