1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker_tester.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/webui_screen_locker.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/auth_status_consumer.h" 1729b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "chromeos/login/auth/fake_extended_authenticator.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/mock_authenticator.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This class is used to observe state of the global ScreenLocker instance, 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// which can go away as a result of a successful authentication. As such, 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// it needs to directly reference the global ScreenLocker. 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass LoginAttemptObserver : public chromeos::AuthStatusConsumer { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoginAttemptObserver(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LoginAttemptObserver(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForAttempt(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Overridden from AuthStatusConsumer: 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnAuthFailure(const chromeos::AuthFailure& error) OVERRIDE { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginAttempted(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnAuthSuccess( 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const chromeos::UserContext& credentials) OVERRIDE { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginAttempted(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoginAttempted(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool login_attempted_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool waiting_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginAttemptObserver); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)LoginAttemptObserver::LoginAttemptObserver() 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : chromeos::AuthStatusConsumer(), login_attempted_(false), waiting_(false) { 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) chromeos::ScreenLocker::default_screen_locker()->SetLoginStatusConsumer(this); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginAttemptObserver::~LoginAttemptObserver() { 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) chromeos::ScreenLocker* global_locker = 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) chromeos::ScreenLocker::default_screen_locker(); 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (global_locker) 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) global_locker->SetLoginStatusConsumer(NULL); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginAttemptObserver::WaitForAttempt() { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!login_attempted_) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = true; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = false; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(login_attempted_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginAttemptObserver::LoginAttempted() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_attempted_ = true; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_) 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // anyonymous namespace 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIScreenLockerTester : public ScreenLockerTester { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ScreenLockerTester overrides: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetPassword(const std::string& password) OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetPassword() OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EnterPassword(const std::string& password) OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmulateWindowManagerReady() OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual views::Widget* GetWidget() const OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual views::Widget* GetChildWidget() const OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class chromeos::ScreenLocker; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIScreenLockerTester() {} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderViewHost* RenderViewHost() const; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the ScreenLockerWebUI object. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIScreenLocker* webui_screen_locker() const; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the WebUI object from the screen locker. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebUI* webui() const; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebUIScreenLockerTester); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLockerTester::SetPassword(const std::string& password) { 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webui()->GetWebContents()->GetMainFrame()->ExecuteJavaScript( 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(base::StringPrintf( 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "$('pod-row').pods[0].passwordElement.value = '%s';", 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password.c_str()))); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string WebUIScreenLockerTester::GetPassword() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> v = content::ExecuteScriptAndGetValue( 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderViewHost()->GetMainFrame(), 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$('pod-row').pods[0].passwordElement.value;"); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(v->GetAsString(&result)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLockerTester::EnterPassword(const std::string& password) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPassword(password); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify password is set. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(password, GetPassword()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that "signin" button is hidden. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> v = content::ExecuteScriptAndGetValue( 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderViewHost()->GetMainFrame(), 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "window.getComputedStyle(" 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " $('pod-row').pods[0].querySelector('.signin-button-container'))" 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " .display == 'none'"); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v->GetAsBoolean(&result)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt to sign in. 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoginAttemptObserver login; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v = content::ExecuteScriptAndGetValue( 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderViewHost()->GetMainFrame(), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$('pod-row').pods[0].activate();"); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v->GetAsBoolean(&result)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(result); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for login attempt. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login.WaitForAttempt(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLockerTester::EmulateWindowManagerReady() { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* WebUIScreenLockerTester::GetWidget() const { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webui_screen_locker()->lock_window_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* WebUIScreenLockerTester::GetChildWidget() const { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webui_screen_locker()->lock_window_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::RenderViewHost* WebUIScreenLockerTester::RenderViewHost() const { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return webui()->GetWebContents()->GetRenderViewHost(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIScreenLocker* WebUIScreenLockerTester::webui_screen_locker() const { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ScreenLocker::screen_locker_); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIScreenLocker*>( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::screen_locker_->delegate_.get()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebUI* WebUIScreenLockerTester::webui() const { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(webui_screen_locker()->webui_ready_); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebUI* webui = webui_screen_locker()->GetWebUI(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(webui); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webui; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScreenLockerTester::ScreenLockerTester() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScreenLockerTester::~ScreenLockerTester() { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ScreenLockerTester::IsLocked() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ScreenLocker::screen_locker_ && 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::screen_locker_->locked_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScreenLockerTester::InjectMockAuthenticator( 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const UserContext& user_context) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ScreenLocker::screen_locker_); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLocker::screen_locker_->SetAuthenticator( 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MockAuthenticator(ScreenLocker::screen_locker_, user_context)); 20929b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch ScreenLocker::screen_locker_->extended_authenticator_ = 21029b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch new FakeExtendedAuthenticator(ScreenLocker::screen_locker_, user_context); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test::ScreenLockerTester* ScreenLocker::GetTester() { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new test::WebUIScreenLockerTester(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 220