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