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