1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/url_constants.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/test/base/web_ui_browser_test.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/password_manager/content/browser/password_manager_internals_service_factory.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/password_manager/core/browser/password_manager_internals_service.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/common/password_manager_switches.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/web_contents.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PasswordManagerInternalsWebUIBrowserTest : public WebUIBrowserTest {
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PasswordManagerInternalsWebUIBrowserTest();
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~PasswordManagerInternalsWebUIBrowserTest();
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE;
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::WebContents* GetWebContents();
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Navigates to the internals page in a tab specified by |disposition|. Also
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // assigns the corresponding UI controller to |controller_|.
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OpenInternalsPage(WindowOpenDisposition disposition);
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PasswordManagerInternalsUI* controller_;
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)PasswordManagerInternalsWebUIBrowserTest::
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PasswordManagerInternalsWebUIBrowserTest()
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : controller_(NULL) {}
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)PasswordManagerInternalsWebUIBrowserTest::
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ~PasswordManagerInternalsWebUIBrowserTest() {}
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void PasswordManagerInternalsWebUIBrowserTest::SetUpOnMainThread() {
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebUIBrowserTest::SetUpOnMainThread();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OpenInternalsPage(CURRENT_TAB);
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)content::WebContents*
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)PasswordManagerInternalsWebUIBrowserTest::GetWebContents() {
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return browser()->tab_strip_model()->GetActiveWebContents();
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void PasswordManagerInternalsWebUIBrowserTest::OpenInternalsPage(
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WindowOpenDisposition disposition) {
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string url_string("chrome://");
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  url_string += chrome::kChromeUIPasswordManagerInternalsHost;
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      browser(),
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GURL(url_string),
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      disposition,
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  controller_ = static_cast<PasswordManagerInternalsUI*>(
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetWebContents()->GetWebUI()->GetController());
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddLibrary(base::FilePath(
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      FILE_PATH_LITERAL("password_manager_internals_browsertest.js")));
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       LogSavePasswordProgress) {
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_manager::PasswordManagerInternalsService* service =
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      password_manager::PasswordManagerInternalsServiceFactory::
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          GetForBrowserContext(browser()->profile());
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(service);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  service->ProcessLog("<script> text for testing");
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(RunJavascriptTest("testLogText"));
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that a single internals page is flushed on reload.
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       LogSavePasswordProgress_FlushedOnReload) {
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_manager::PasswordManagerInternalsService* service =
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      password_manager::PasswordManagerInternalsServiceFactory::
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          GetForBrowserContext(browser()->profile());
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(service);
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  service->ProcessLog("<script> text for testing");
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OpenInternalsPage(CURRENT_TAB);  // Reload.
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(RunJavascriptTest("testLogTextNotPresent"));
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that if two tabs with the internals page are open, the second displays
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// the same logs. In particular, this checks that both the second tab gets the
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// logs created before the second tab was opened, and also that the second tab
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// waits with displaying until the internals page is ready (trying to display
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// the old logs just on construction time would fail).
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       LogSavePasswordProgress_MultipleTabsIdentical) {
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // First, open one tab with the internals page, and log something.
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_manager::PasswordManagerInternalsService* service =
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      password_manager::PasswordManagerInternalsServiceFactory::
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          GetForBrowserContext(browser()->profile());
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(service);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  service->ProcessLog("<script> text for testing");
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(RunJavascriptTest("testLogText"));
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Now open a second tab with the internals page, but do not log anything.
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OpenInternalsPage(NEW_FOREGROUND_TAB);
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The previously logged text should have made it to the page.
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(RunJavascriptTest("testLogText"));
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that in the presence of more internals pages, reload does not cause
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// flushing the logs.
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       LogSavePasswordProgress_NotFlushedOnReloadIfMultiple) {
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Open one more tab with the internals page.
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OpenInternalsPage(NEW_FOREGROUND_TAB);
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Now log something.
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_manager::PasswordManagerInternalsService* service =
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      password_manager::PasswordManagerInternalsServiceFactory::
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          GetForBrowserContext(browser()->profile());
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(service);
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  service->ProcessLog("<script> text for testing");
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Reload.
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OpenInternalsPage(CURRENT_TAB);
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The text should still be there.
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(RunJavascriptTest("testLogText"));
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
127