Home | History | Annotate | Download | only in password_manager_internals
      1 // Copyright 2014 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 "base/command_line.h"
      6 #include "chrome/browser/profiles/profile.h"
      7 #include "chrome/browser/ui/browser.h"
      8 #include "chrome/browser/ui/tabs/tab_strip_model.h"
      9 #include "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h"
     10 #include "chrome/common/url_constants.h"
     11 #include "chrome/test/base/ui_test_utils.h"
     12 #include "chrome/test/base/web_ui_browser_test.h"
     13 #include "components/password_manager/content/browser/password_manager_internals_service_factory.h"
     14 #include "components/password_manager/core/browser/password_manager_internals_service.h"
     15 #include "components/password_manager/core/common/password_manager_switches.h"
     16 #include "content/public/browser/web_contents.h"
     17 
     18 class PasswordManagerInternalsWebUIBrowserTest : public WebUIBrowserTest {
     19  public:
     20   PasswordManagerInternalsWebUIBrowserTest();
     21   virtual ~PasswordManagerInternalsWebUIBrowserTest();
     22 
     23   virtual void SetUpOnMainThread() OVERRIDE;
     24 
     25  protected:
     26   content::WebContents* GetWebContents();
     27 
     28   // Navigates to the internals page in a tab specified by |disposition|. Also
     29   // assigns the corresponding UI controller to |controller_|.
     30   void OpenInternalsPage(WindowOpenDisposition disposition);
     31 
     32  private:
     33   PasswordManagerInternalsUI* controller_;
     34 };
     35 
     36 PasswordManagerInternalsWebUIBrowserTest::
     37     PasswordManagerInternalsWebUIBrowserTest()
     38     : controller_(NULL) {}
     39 
     40 PasswordManagerInternalsWebUIBrowserTest::
     41     ~PasswordManagerInternalsWebUIBrowserTest() {}
     42 
     43 void PasswordManagerInternalsWebUIBrowserTest::SetUpOnMainThread() {
     44   WebUIBrowserTest::SetUpOnMainThread();
     45   OpenInternalsPage(CURRENT_TAB);
     46 }
     47 
     48 content::WebContents*
     49 PasswordManagerInternalsWebUIBrowserTest::GetWebContents() {
     50   return browser()->tab_strip_model()->GetActiveWebContents();
     51 }
     52 
     53 void PasswordManagerInternalsWebUIBrowserTest::OpenInternalsPage(
     54     WindowOpenDisposition disposition) {
     55   std::string url_string("chrome://");
     56   url_string += chrome::kChromeUIPasswordManagerInternalsHost;
     57   ui_test_utils::NavigateToURLWithDisposition(
     58       browser(),
     59       GURL(url_string),
     60       disposition,
     61       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     62   controller_ = static_cast<PasswordManagerInternalsUI*>(
     63       GetWebContents()->GetWebUI()->GetController());
     64   AddLibrary(base::FilePath(
     65       FILE_PATH_LITERAL("password_manager_internals_browsertest.js")));
     66 }
     67 
     68 IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
     69                        LogSavePasswordProgress) {
     70   password_manager::PasswordManagerInternalsService* service =
     71       password_manager::PasswordManagerInternalsServiceFactory::
     72           GetForBrowserContext(browser()->profile());
     73   ASSERT_TRUE(service);
     74   service->ProcessLog("<script> text for testing");
     75   ASSERT_TRUE(RunJavascriptTest("testLogText"));
     76 }
     77 
     78 // Test that a single internals page is flushed on reload.
     79 IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
     80                        LogSavePasswordProgress_FlushedOnReload) {
     81   password_manager::PasswordManagerInternalsService* service =
     82       password_manager::PasswordManagerInternalsServiceFactory::
     83           GetForBrowserContext(browser()->profile());
     84   ASSERT_TRUE(service);
     85   service->ProcessLog("<script> text for testing");
     86   OpenInternalsPage(CURRENT_TAB);  // Reload.
     87   ASSERT_TRUE(RunJavascriptTest("testLogTextNotPresent"));
     88 }
     89 
     90 // Test that if two tabs with the internals page are open, the second displays
     91 // the same logs. In particular, this checks that both the second tab gets the
     92 // logs created before the second tab was opened, and also that the second tab
     93 // waits with displaying until the internals page is ready (trying to display
     94 // the old logs just on construction time would fail).
     95 IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
     96                        LogSavePasswordProgress_MultipleTabsIdentical) {
     97   // First, open one tab with the internals page, and log something.
     98   password_manager::PasswordManagerInternalsService* service =
     99       password_manager::PasswordManagerInternalsServiceFactory::
    100           GetForBrowserContext(browser()->profile());
    101   ASSERT_TRUE(service);
    102   service->ProcessLog("<script> text for testing");
    103   ASSERT_TRUE(RunJavascriptTest("testLogText"));
    104   // Now open a second tab with the internals page, but do not log anything.
    105   OpenInternalsPage(NEW_FOREGROUND_TAB);
    106   // The previously logged text should have made it to the page.
    107   ASSERT_TRUE(RunJavascriptTest("testLogText"));
    108 }
    109 
    110 // Test that in the presence of more internals pages, reload does not cause
    111 // flushing the logs.
    112 IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
    113                        LogSavePasswordProgress_NotFlushedOnReloadIfMultiple) {
    114   // Open one more tab with the internals page.
    115   OpenInternalsPage(NEW_FOREGROUND_TAB);
    116   // Now log something.
    117   password_manager::PasswordManagerInternalsService* service =
    118       password_manager::PasswordManagerInternalsServiceFactory::
    119           GetForBrowserContext(browser()->profile());
    120   ASSERT_TRUE(service);
    121   service->ProcessLog("<script> text for testing");
    122   // Reload.
    123   OpenInternalsPage(CURRENT_TAB);
    124   // The text should still be there.
    125   ASSERT_TRUE(RunJavascriptTest("testLogText"));
    126 }
    127