1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string> 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/file_path.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/path_service.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/stringprintf.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/automation/automation_tab_helper.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/automation/mock_tab_event_observer.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/chrome_paths.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/url_constants.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/test/in_process_browser_test.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/test/ui_test_utils.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/render_view_host.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/tab_contents/tab_contents.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/net_util.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gmock/include/gmock/gmock.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing testing::_; 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass MockNotificationObserver : public NotificationObserver { 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockNotificationObserver() { } 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~MockNotificationObserver() { } 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MOCK_METHOD3(Observe, void(NotificationType type, 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const NotificationSource& source, 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const NotificationDetails& details)); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void Register(NotificationType type, const NotificationSource& source) { 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registrar_.Add(this, type, source); 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationRegistrar registrar_; 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(MockNotificationObserver); 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutomationTabHelperBrowserTest : public InProcessBrowserTest { 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutomationTabHelperBrowserTest() { 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EnableDOMAutomation(); 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~AutomationTabHelperBrowserTest() { } 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetUpInProcessBrowserTestFixture() { 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_)); 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_data_dir_ = test_data_dir_.AppendASCII("automation"); 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add default expectations for a client redirection initiated by script, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // and quit the message loop when the redirect has completed. This expects 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // that the tab receives news of the redirect before the script returns. 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void ExpectClientRedirectAndBreak( 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver* mock_tab_observer, 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockNotificationObserver* mock_notification_observer) { 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mock_notification_observer->Register( 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::DOM_OPERATION_RESPONSE, 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::AllSources()); 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::InSequence expect_in_sequence; 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(*mock_tab_observer, OnFirstPendingLoad(_)); 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(*mock_notification_observer, Observe( 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::Eq(NotificationType::DOM_OPERATION_RESPONSE), _, _)); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(*mock_tab_observer, OnNoMorePendingLoads(_)) 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen .WillOnce(testing::InvokeWithoutArgs( 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoopForUI::current(), &MessageLoop::Quit)); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Executes javascript to execute a given test case found in the current 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // page's script. If |wait_for_response| is true, this method will not 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // return until the javascript has been executed. 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Use with [ASSERT|EXPECT]_NO_FATAL_FAILURE. 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void RunTestCaseInJavaScript(int test_case_number, bool wait_for_response) { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string script = base::StringPrintf("runTestCase(%d);", 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_case_number); 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RenderViewHost* host = 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->GetSelectedTabContents()->render_view_host(); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (wait_for_response) { 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(ui_test_utils::ExecuteJavaScript( 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host, L"", ASCIIToWide(script))); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen script += "window.domAutomationController.setAutomationId(0);" 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "window.domAutomationController.send(0);"; 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host->ExecuteJavascriptInWebFrame(ASCIIToUTF16(""), ASCIIToUTF16(script)); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns the |AutomationTabHelper| for the first browser's first tab. 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutomationTabHelper* tab_helper() { 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return browser()->GetTabContentsWrapperAt(0)->automation_tab_helper(); 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath test_data_dir_; 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(AutomationTabHelperBrowserTest, FormSubmission) { 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL( 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_data_dir_.AppendASCII("client_redirects.html"))); 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockNotificationObserver mock_notification_observer; 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver mock_observer(tab_helper()); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExpectClientRedirectAndBreak(&mock_observer, &mock_notification_observer); 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NO_FATAL_FAILURE(RunTestCaseInJavaScript(1, false)); 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::RunMessageLoop(); 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(AutomationTabHelperBrowserTest, 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CancelFormSubmission) { 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL( 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_data_dir_.AppendASCII("client_redirects.html"))); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockNotificationObserver mock_notification_observer; 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver mock_observer(tab_helper()); 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::InSequence expect_in_sequence; 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_observer, OnFirstPendingLoad(_)).Times(0); 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NO_FATAL_FAILURE(RunTestCaseInJavaScript(2, true)); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(AutomationTabHelperBrowserTest, 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen JsRedirectToSite) { 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL( 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_data_dir_.AppendASCII("client_redirects.html"))); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockNotificationObserver mock_notification_observer; 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver mock_observer(tab_helper()); 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExpectClientRedirectAndBreak(&mock_observer, &mock_notification_observer); 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NO_FATAL_FAILURE(RunTestCaseInJavaScript(3, false)); 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::RunMessageLoop(); 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(AutomationTabHelperBrowserTest, 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen JsRedirectToUnknownSite) { 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL( 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_data_dir_.AppendASCII("client_redirects.html"))); 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockNotificationObserver mock_notification_observer; 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver mock_observer(tab_helper()); 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExpectClientRedirectAndBreak(&mock_observer, &mock_notification_observer); 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NO_FATAL_FAILURE(RunTestCaseInJavaScript(4, false)); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::RunMessageLoop(); 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(AutomationTabHelperBrowserTest, 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MetaTagRedirect) { 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver mock_observer(tab_helper()); 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::InSequence expect_in_sequence; 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_observer, OnFirstPendingLoad(_)); 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_observer, OnNoMorePendingLoads(_)); 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser(), 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::FilePathToFileURL(test_data_dir_.AppendASCII("meta_redirect.html")), 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2); 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Tests that the load stop event occurs after the window onload handler. 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(AutomationTabHelperBrowserTest, 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LoadStopComesAfterOnLoad) { 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockNotificationObserver mock_notification_observer; 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mock_notification_observer.Register(NotificationType::DOM_OPERATION_RESPONSE, 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::AllSources()); 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver mock_tab_observer(tab_helper()); 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_tab_observer, OnFirstPendingLoad(_)); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::InSequence expect_in_sequence; 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_notification_observer, Observe( 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::Eq(NotificationType::DOM_OPERATION_RESPONSE), _, _)); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_tab_observer, OnNoMorePendingLoads(_)); 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL( 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_data_dir_.AppendASCII("sends_message_on_load.html"))); 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Tests that a crashed tab reports that it has stopped loading. 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(AutomationTabHelperBrowserTest, 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CrashedTabStopsLoading) { 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTabEventObserver mock_tab_observer(tab_helper()); 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen testing::InSequence expect_in_sequence; 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_tab_observer, OnFirstPendingLoad(_)); 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_tab_observer, OnNoMorePendingLoads(_)); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutCrashURL)); 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 210