#include "base/command_line.h"
#include "chrome/browser/printing/print_preview_tab_controller.h"
#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tab_contents/tab_contents.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/web_contents_observer.h"
#include "googleurl/src/gurl.h"
using content::WebContents;
class PrintPreviewTabControllerBrowserTest : public InProcessBrowserTest {
public:
PrintPreviewTabControllerBrowserTest() {}
virtual ~PrintPreviewTabControllerBrowserTest() {}
virtual void SetUpCommandLine(CommandLine* command_line) {
#if !defined(GOOGLE_CHROME_BUILD)
command_line->AppendSwitch(switches::kEnablePrintPreview);
#endif
}
};
class TabDestroyedObserver : public content::WebContentsObserver {
public:
explicit TabDestroyedObserver(WebContents* contents)
: content::WebContentsObserver(contents),
tab_destroyed_(false) {
}
virtual ~TabDestroyedObserver() {}
bool tab_destroyed() { return tab_destroyed_; }
private:
virtual void WebContentsDestroyed(WebContents* tab) OVERRIDE {
tab_destroyed_ = true;
}
bool tab_destroyed_;
};
IN_PROC_BROWSER_TEST_F(PrintPreviewTabControllerBrowserTest,
NavigateFromInitiatorTab) {
EXPECT_EQ(1, browser()->tab_count());
TabContents* initiator_tab = chrome::GetActiveTabContents(browser());
ASSERT_TRUE(initiator_tab);
printing::PrintPreviewTabController* tab_controller =
printing::PrintPreviewTabController::GetInstance();
ASSERT_TRUE(tab_controller);
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(
initiator_tab->web_contents());
print_view_manager->PrintPreviewNow();
TabContents* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
EXPECT_EQ(1, browser()->tab_count());
ASSERT_TRUE(preview_tab);
ASSERT_NE(initiator_tab, preview_tab);
TabDestroyedObserver observer(preview_tab->web_contents());
GURL url(chrome::kChromeUINewTabURL);
ui_test_utils::NavigateToURL(browser(), url);
ASSERT_TRUE(observer.tab_destroyed());
print_view_manager->PrintPreviewNow();
TabContents* new_preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
EXPECT_EQ(1, browser()->tab_count());
EXPECT_TRUE(new_preview_tab);
}
IN_PROC_BROWSER_TEST_F(PrintPreviewTabControllerBrowserTest,
ReloadInitiatorTab) {
EXPECT_EQ(1, browser()->tab_count());
TabContents* initiator_tab = chrome::GetActiveTabContents(browser());
ASSERT_TRUE(initiator_tab);
printing::PrintPreviewTabController* tab_controller =
printing::PrintPreviewTabController::GetInstance();
ASSERT_TRUE(tab_controller);
printing::PrintViewManager* print_view_manager =
printing::PrintViewManager::FromWebContents(
initiator_tab->web_contents());
print_view_manager->PrintPreviewNow();
TabContents* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
EXPECT_EQ(1, browser()->tab_count());
ASSERT_TRUE(preview_tab);
ASSERT_NE(initiator_tab, preview_tab);
TabDestroyedObserver tab_destroyed_observer(preview_tab->web_contents());
content::WindowedNotificationObserver notification_observer(
content::NOTIFICATION_LOAD_STOP,
content::NotificationService::AllSources());
chrome::Reload(browser(), CURRENT_TAB);
notification_observer.Wait();
ASSERT_TRUE(tab_destroyed_observer.tab_destroyed());
print_view_manager->PrintPreviewNow();
TabContents* new_preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
EXPECT_EQ(1, browser()->tab_count());
EXPECT_TRUE(new_preview_tab);
}