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::
PasswordManagerInternalsWebUIBrowserTest()37 PasswordManagerInternalsWebUIBrowserTest()
38 : controller_(NULL) {}
39
40 PasswordManagerInternalsWebUIBrowserTest::
~PasswordManagerInternalsWebUIBrowserTest()41 ~PasswordManagerInternalsWebUIBrowserTest() {}
42
SetUpOnMainThread()43 void PasswordManagerInternalsWebUIBrowserTest::SetUpOnMainThread() {
44 WebUIBrowserTest::SetUpOnMainThread();
45 OpenInternalsPage(CURRENT_TAB);
46 }
47
48 content::WebContents*
GetWebContents()49 PasswordManagerInternalsWebUIBrowserTest::GetWebContents() {
50 return browser()->tab_strip_model()->GetActiveWebContents();
51 }
52
OpenInternalsPage(WindowOpenDisposition disposition)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
IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,LogSavePasswordProgress)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.
IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,LogSavePasswordProgress_FlushedOnReload)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).
IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,LogSavePasswordProgress_MultipleTabsIdentical)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.
IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,LogSavePasswordProgress_NotFlushedOnReloadIfMultiple)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