Home | History | Annotate | Download | only in print_preview
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <vector>
      6 
      7 #include "base/memory/ref_counted_memory.h"
      8 #include "base/prefs/pref_service.h"
      9 #include "chrome/browser/printing/print_preview_dialog_controller.h"
     10 #include "chrome/browser/printing/print_preview_test.h"
     11 #include "chrome/browser/printing/print_view_manager.h"
     12 #include "chrome/browser/ui/browser_commands.h"
     13 #include "chrome/browser/ui/browser_tabstrip.h"
     14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     15 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
     16 #include "chrome/common/pref_names.h"
     17 #include "chrome/test/base/browser_with_test_window_test.h"
     18 #include "components/web_modal/web_contents_modal_dialog_manager.h"
     19 #include "content/public/browser/plugin_service.h"
     20 #include "content/public/browser/site_instance.h"
     21 #include "content/public/browser/web_contents.h"
     22 #include "printing/print_job_constants.h"
     23 
     24 using content::WebContents;
     25 using web_modal::WebContentsModalDialogManager;
     26 
     27 namespace {
     28 
     29 base::RefCountedBytes* CreateTestData() {
     30   const unsigned char blob1[] =
     31       "12346102356120394751634516591348710478123649165419234519234512349134";
     32   std::vector<unsigned char> preview_data(blob1, blob1 + sizeof(blob1));
     33   return new base::RefCountedBytes(preview_data);
     34 }
     35 
     36 bool IsShowingWebContentsModalDialog(WebContents* tab) {
     37   WebContentsModalDialogManager* web_contents_modal_dialog_manager =
     38       WebContentsModalDialogManager::FromWebContents(tab);
     39   return web_contents_modal_dialog_manager->IsDialogActive();
     40 }
     41 
     42 }  // namespace
     43 
     44 class PrintPreviewUIUnitTest : public PrintPreviewTest {
     45  public:
     46   PrintPreviewUIUnitTest();
     47   virtual ~PrintPreviewUIUnitTest();
     48 
     49  protected:
     50   virtual void SetUp() OVERRIDE;
     51 
     52   DISALLOW_COPY_AND_ASSIGN(PrintPreviewUIUnitTest);
     53 };
     54 
     55 PrintPreviewUIUnitTest::PrintPreviewUIUnitTest() {}
     56 PrintPreviewUIUnitTest::~PrintPreviewUIUnitTest() {}
     57 
     58 void PrintPreviewUIUnitTest::SetUp() {
     59   PrintPreviewTest::SetUp();
     60 
     61   chrome::NewTab(browser());
     62 }
     63 
     64 // Create/Get a preview tab for initiator.
     65 TEST_F(PrintPreviewUIUnitTest, PrintPreviewData) {
     66   WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
     67   ASSERT_TRUE(initiator);
     68   EXPECT_FALSE(IsShowingWebContentsModalDialog(initiator));
     69 
     70   printing::PrintPreviewDialogController* controller =
     71       printing::PrintPreviewDialogController::GetInstance();
     72   ASSERT_TRUE(controller);
     73 
     74   printing::PrintViewManager* print_view_manager =
     75       printing::PrintViewManager::FromWebContents(initiator);
     76   print_view_manager->PrintPreviewNow(false);
     77   WebContents* preview_dialog = controller->GetOrCreatePreviewDialog(initiator);
     78 
     79   EXPECT_NE(initiator, preview_dialog);
     80   EXPECT_EQ(1, browser()->tab_strip_model()->count());
     81   EXPECT_TRUE(IsShowingWebContentsModalDialog(initiator));
     82 
     83   PrintPreviewUI* preview_ui = static_cast<PrintPreviewUI*>(
     84       preview_dialog->GetWebUI()->GetController());
     85   ASSERT_TRUE(preview_ui != NULL);
     86 
     87   scoped_refptr<base::RefCountedBytes> data;
     88   preview_ui->GetPrintPreviewDataForIndex(
     89       printing::COMPLETE_PREVIEW_DOCUMENT_INDEX,
     90       &data);
     91   EXPECT_EQ(NULL, data.get());
     92 
     93   scoped_refptr<base::RefCountedBytes> dummy_data = CreateTestData();
     94 
     95   preview_ui->SetPrintPreviewDataForIndex(
     96       printing::COMPLETE_PREVIEW_DOCUMENT_INDEX,
     97       dummy_data.get());
     98   preview_ui->GetPrintPreviewDataForIndex(
     99       printing::COMPLETE_PREVIEW_DOCUMENT_INDEX,
    100       &data);
    101   EXPECT_EQ(dummy_data->size(), data->size());
    102   EXPECT_EQ(dummy_data.get(), data.get());
    103 
    104   // This should not cause any memory leaks.
    105   dummy_data = new base::RefCountedBytes();
    106   preview_ui->SetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX,
    107                                           dummy_data.get());
    108 
    109   // Clear the preview data.
    110   preview_ui->ClearAllPreviewData();
    111 
    112   preview_ui->GetPrintPreviewDataForIndex(
    113       printing::COMPLETE_PREVIEW_DOCUMENT_INDEX,
    114       &data);
    115   EXPECT_EQ(NULL, data.get());
    116 }
    117 
    118 // Set and get the individual draft pages.
    119 TEST_F(PrintPreviewUIUnitTest, PrintPreviewDraftPages) {
    120   WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
    121   ASSERT_TRUE(initiator);
    122 
    123   printing::PrintPreviewDialogController* controller =
    124       printing::PrintPreviewDialogController::GetInstance();
    125   ASSERT_TRUE(controller);
    126 
    127   printing::PrintViewManager* print_view_manager =
    128       printing::PrintViewManager::FromWebContents(initiator);
    129   print_view_manager->PrintPreviewNow(false);
    130   WebContents* preview_dialog = controller->GetOrCreatePreviewDialog(initiator);
    131 
    132   EXPECT_NE(initiator, preview_dialog);
    133   EXPECT_EQ(1, browser()->tab_strip_model()->count());
    134   EXPECT_TRUE(IsShowingWebContentsModalDialog(initiator));
    135 
    136   PrintPreviewUI* preview_ui = static_cast<PrintPreviewUI*>(
    137       preview_dialog->GetWebUI()->GetController());
    138   ASSERT_TRUE(preview_ui != NULL);
    139 
    140   scoped_refptr<base::RefCountedBytes> data;
    141   preview_ui->GetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX, &data);
    142   EXPECT_EQ(NULL, data.get());
    143 
    144   scoped_refptr<base::RefCountedBytes> dummy_data = CreateTestData();
    145 
    146   preview_ui->SetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX,
    147                                           dummy_data.get());
    148   preview_ui->GetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX, &data);
    149   EXPECT_EQ(dummy_data->size(), data->size());
    150   EXPECT_EQ(dummy_data.get(), data.get());
    151 
    152   // Set and get the third page data.
    153   preview_ui->SetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX + 2,
    154                                           dummy_data.get());
    155   preview_ui->GetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX + 2,
    156                                           &data);
    157   EXPECT_EQ(dummy_data->size(), data->size());
    158   EXPECT_EQ(dummy_data.get(), data.get());
    159 
    160   // Get the second page data.
    161   preview_ui->GetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX + 1,
    162                                           &data);
    163   EXPECT_EQ(NULL, data.get());
    164 
    165   preview_ui->SetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX + 1,
    166                                           dummy_data.get());
    167   preview_ui->GetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX + 1,
    168                                           &data);
    169   EXPECT_EQ(dummy_data->size(), data->size());
    170   EXPECT_EQ(dummy_data.get(), data.get());
    171 
    172   // Clear the preview data.
    173   preview_ui->ClearAllPreviewData();
    174   preview_ui->GetPrintPreviewDataForIndex(printing::FIRST_PAGE_INDEX, &data);
    175   EXPECT_EQ(NULL, data.get());
    176 }
    177 
    178 // Test the browser-side print preview cancellation functionality.
    179 TEST_F(PrintPreviewUIUnitTest, GetCurrentPrintPreviewStatus) {
    180   WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
    181   ASSERT_TRUE(initiator);
    182 
    183   printing::PrintPreviewDialogController* controller =
    184       printing::PrintPreviewDialogController::GetInstance();
    185   ASSERT_TRUE(controller);
    186 
    187   printing::PrintViewManager* print_view_manager =
    188       printing::PrintViewManager::FromWebContents(initiator);
    189   print_view_manager->PrintPreviewNow(false);
    190   WebContents* preview_dialog = controller->GetOrCreatePreviewDialog(initiator);
    191 
    192   EXPECT_NE(initiator, preview_dialog);
    193   EXPECT_EQ(1, browser()->tab_strip_model()->count());
    194   EXPECT_TRUE(IsShowingWebContentsModalDialog(initiator));
    195 
    196   PrintPreviewUI* preview_ui = static_cast<PrintPreviewUI*>(
    197       preview_dialog->GetWebUI()->GetController());
    198   ASSERT_TRUE(preview_ui != NULL);
    199 
    200   // Test with invalid |preview_ui_addr|.
    201   bool cancel = false;
    202   const int32 kInvalidId = -5;
    203   preview_ui->GetCurrentPrintPreviewStatus(kInvalidId, 0, &cancel);
    204   EXPECT_TRUE(cancel);
    205 
    206   const int kFirstRequestId = 1000;
    207   const int kSecondRequestId = 1001;
    208   const int32 preview_ui_addr = preview_ui->GetIDForPrintPreviewUI();
    209 
    210   // Test with kFirstRequestId.
    211   preview_ui->OnPrintPreviewRequest(kFirstRequestId);
    212   cancel = true;
    213   preview_ui->GetCurrentPrintPreviewStatus(preview_ui_addr, kFirstRequestId,
    214                                            &cancel);
    215   EXPECT_FALSE(cancel);
    216 
    217   cancel = false;
    218   preview_ui->GetCurrentPrintPreviewStatus(preview_ui_addr, kSecondRequestId,
    219                                            &cancel);
    220   EXPECT_TRUE(cancel);
    221 
    222   // Test with kSecondRequestId.
    223   preview_ui->OnPrintPreviewRequest(kSecondRequestId);
    224   cancel = false;
    225   preview_ui->GetCurrentPrintPreviewStatus(preview_ui_addr, kFirstRequestId,
    226                                            &cancel);
    227   EXPECT_TRUE(cancel);
    228 
    229   cancel = true;
    230   preview_ui->GetCurrentPrintPreviewStatus(preview_ui_addr, kSecondRequestId,
    231                                            &cancel);
    232   EXPECT_FALSE(cancel);
    233 }
    234