summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/SConscript.ui_tests1
-rw-r--r--chrome/renderer/render_view.cc8
-rw-r--r--chrome/renderer/render_view.h2
-rw-r--r--chrome/test/data/History/HistoryHelper.js55
-rw-r--r--chrome/test/data/History/history_length_test1.html66
-rw-r--r--chrome/test/data/History/history_length_test2.html33
-rw-r--r--chrome/test/ui/history_uitest.cc58
-rw-r--r--chrome/test/ui/npapi_uitest.cpp160
-rw-r--r--chrome/test/ui/ui_test.cc36
-rw-r--r--chrome/test/ui/ui_test.h13
-rw-r--r--chrome/test/ui/ui_tests.vcproj24
-rw-r--r--webkit/glue/webview_delegate.h3
-rw-r--r--webkit/glue/webview_impl.cc1
13 files changed, 367 insertions, 93 deletions
diff --git a/chrome/SConscript.ui_tests b/chrome/SConscript.ui_tests
index 6d8da76..68ce7c7 100644
--- a/chrome/SConscript.ui_tests
+++ b/chrome/SConscript.ui_tests
@@ -129,6 +129,7 @@ ui_test_files = [
'test/ui/sandbox_uitests.cc',
'test/ui/ui_test.cc',
'test/ui/ui_test_suite.cc',
+ 'test/ui/history_uitest.cc',
'$CHROME_DIR/test/test_file_util$OBJSUFFIX',
'$NET_DIR/url_request/url_request_test_job$OBJSUFFIX',
]
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 0da4929..ef69bb6 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -2208,6 +2208,9 @@ WebHistoryItem* RenderView::GetHistoryEntryAtOffset(int offset) {
}
void RenderView::GoToEntryAtOffsetAsync(int offset) {
+ history_back_list_count_ += offset;
+ history_forward_list_count_ -= offset;
+
Send(new ViewHostMsg_GoToEntryAtOffset(routing_id_, offset));
}
@@ -2548,6 +2551,11 @@ void RenderView::TransitionToCommittedForNewPage() {
#endif
}
+void RenderView::DidAddHistoryItem() {
+ history_back_list_count_++;
+ history_forward_list_count_ = 0;
+}
+
void RenderView::OnMessageFromExternalHost(
const std::string& target, const std::string& message) {
if (message.empty())
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 51b9d93..a59f328 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -485,6 +485,8 @@ class RenderView : public RenderWidget, public WebViewDelegate,
virtual void TransitionToCommittedForNewPage();
+ virtual void DidAddHistoryItem();
+
// A helper method used by WasOpenedByUserGesture.
bool WasOpenedByUserGestureHelper() const;
diff --git a/chrome/test/data/History/HistoryHelper.js b/chrome/test/data/History/HistoryHelper.js
new file mode 100644
index 0000000..93e0a94
--- /dev/null
+++ b/chrome/test/data/History/HistoryHelper.js
@@ -0,0 +1,55 @@
+//
+// This script provides some mechanics for testing History
+//
+function onSuccess(name, id)
+{
+ setTimeout(onFinished, 0, name, id, "OK");
+}
+
+function onFailure(name, id, status)
+{
+ setTimeout(onFinished, 0, name, id, status);
+}
+
+// Finish running a test by setting the status
+// and the cookie.
+function onFinished(name, id, result)
+{
+ var statusPanel = document.getElementById("statusPanel");
+ if (statusPanel) {
+ statusPanel.innerHTML = result;
+ }
+
+ var cookie = name + "." + id + ".status=" + result + "; path=/";
+ document.cookie = cookie;
+}
+
+function readCookie(name) {
+ var cookie_name = name + "=";
+ var ca = document.cookie.split(';');
+
+ for(var i = 0 ; i < ca.length ; i++) {
+ var c = ca[i];
+ while (c.charAt(0) == ' ') {
+ c = c.substring(1,c.length);
+ }
+ if (c.indexOf(cookie_name) == 0) {
+ return c.substring(cookie_name.length, c.length);
+ }
+ }
+ return null;
+}
+
+function createCookie(name,value,days) {
+ var expires = "";
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+ expires = "; expires=" + date.toGMTString();
+ }
+ document.cookie = name+"="+value+expires+"; path=/";
+}
+
+function eraseCookie(name) {
+ createCookie(name, "", -1);
+}
diff --git a/chrome/test/data/History/history_length_test1.html b/chrome/test/data/History/history_length_test1.html
new file mode 100644
index 0000000..4a44fa9
--- /dev/null
+++ b/chrome/test/data/History/history_length_test1.html
@@ -0,0 +1,66 @@
+<html>
+<head><title>History test1</title>
+<script src="HistoryHelper.js"></script>
+</head>
+
+<body onload="onLoad();">
+<div id="statusPanel" style="border: 1px solid red; width: 100%">
+History Test1 running....
+</body>
+
+<SCRIPT type="text/javascript">
+var first_run_cookie = "First_History_Test_Run";
+var second_run_cookie = "Second_History_Test_Run";
+
+function onLoad() {
+ if (readCookie(second_run_cookie) != null) {
+ setTimeout(OnValidateHistoryForSecondRun, 100);
+ return true;
+ }
+
+ if (readCookie(first_run_cookie) != null) {
+ setTimeout(OnMoveForwardInHistory, 100);
+ return true;
+ }
+
+ setTimeout(OnNavigateToPage2, 100);
+ return true;
+}
+
+function OnValidateHistoryForSecondRun() {
+ eraseCookie(first_run_cookie);
+ eraseCookie(second_run_cookie);
+
+ if (window.history.length != 2) {
+ onFailure("History_Length_Test", 1, "Second run history length mismatch");
+ return false;
+ }
+
+ onSuccess("History_Length_Test", 1);
+ return true;
+}
+
+function OnMoveForwardInHistory() {
+ if (window.history.length != 2) {
+ onFailure("History_Length_Test", 1, "History length mismatch");
+ return false;
+ }
+
+ createCookie(second_run_cookie, "1", "1");
+ window.history.forward();
+ return true;
+}
+
+function OnNavigateToPage2() {
+ if (window.history.length != 2) {
+ onFailure("History_Length_Test", 1, "History length mismatch");
+ return false;
+ }
+
+ createCookie(first_run_cookie, "1", "1");
+ window.location.href = "history_length_test2.html";
+ return true;
+}
+
+</SCRIPT>
+</html> \ No newline at end of file
diff --git a/chrome/test/data/History/history_length_test2.html b/chrome/test/data/History/history_length_test2.html
new file mode 100644
index 0000000..2bae3ac
--- /dev/null
+++ b/chrome/test/data/History/history_length_test2.html
@@ -0,0 +1,33 @@
+<html>
+<head><title>History test2</title>
+<script src="HistoryHelper.js"></script>
+</head>
+
+<body onload="onLoad();">
+<div id="statusPanel" style="border: 1px solid red; width: 100%">
+History test2....
+<div id="Div1" style="border: 1px solid red; width: 100%">
+</body>
+
+<SCRIPT type="text/javascript">
+function onLoad() {
+ setTimeout(OnValidateHistoryLength, 100);
+}
+
+function OnValidateHistoryLength() {
+ if (window.history.length != 3) {
+ onFailure("History_Length_Test", 1, "History length mismatch");
+ alert(window.history.length);
+ return false;
+ }
+
+ window.history.back();
+ return true;
+}
+
+function OnEchoHistory() {
+ alert(window.history.length);
+}
+
+</SCRIPT>
+</html> \ No newline at end of file
diff --git a/chrome/test/ui/history_uitest.cc b/chrome/test/ui/history_uitest.cc
new file mode 100644
index 0000000..931024f
--- /dev/null
+++ b/chrome/test/ui/history_uitest.cc
@@ -0,0 +1,58 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// History UI tests
+
+#include "base/file_util.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/test/automation/tab_proxy.h"
+#include "chrome/test/ui/ui_test.h"
+#include "net/base/net_util.h"
+
+const char kTestCompleteCookie[] = "status";
+const char kTestCompleteSuccess[] = "OK";
+const int kShortWaitTimeout = 5 * 1000;
+
+class HistoryTester : public UITest {
+ protected:
+ HistoryTester() : UITest() { }
+
+ virtual void SetUp() {
+ show_window_ = true;
+ UITest::SetUp();
+ }
+};
+
+TEST_F(HistoryTester, VerifyHistoryLength) {
+ std::wstring test_case = L"history_length_test1.html";
+ GURL url = GetTestUrl(L"History", test_case);
+ NavigateToURL(url);
+ WaitForFinish("History_Length_Test", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+}
diff --git a/chrome/test/ui/npapi_uitest.cpp b/chrome/test/ui/npapi_uitest.cpp
index b48d011..525e48e 100644
--- a/chrome/test/ui/npapi_uitest.cpp
+++ b/chrome/test/ui/npapi_uitest.cpp
@@ -53,8 +53,8 @@
const char kTestCompleteCookie[] = "status";
const char kTestCompleteSuccess[] = "OK";
-const int kLongWaitTimeout = 30*1000;
-const int kShortWaitTimeout = 5*1000;
+const int kLongWaitTimeout = 30 * 1000;
+const int kShortWaitTimeout = 5 * 1000;
std::ostream& operator<<(std::ostream& out, const CComBSTR &str)
{
@@ -66,7 +66,6 @@ std::ostream& operator<<(std::ostream& out, const CComBSTR &str)
return out << szFinal;
}
-
class NPAPITester : public UITest {
protected:
NPAPITester() : UITest()
@@ -93,49 +92,6 @@ class NPAPITester : public UITest {
UITest::TearDown();
}
-protected:
- // Generate the URL for testing a particular test.
- // HTML for the tests is all located in test_directory\npapi\<testcase>
- GURL GetTestUrl(const std::wstring &test_case) {
- std::wstring path;
- PathService::Get(chrome::DIR_TEST_DATA, &path);
- file_util::AppendToPath(&path, L"npapi");
- file_util::AppendToPath(&path, test_case);
- return net::FilePathToFileURL(path);
- }
-
- // Waits for the test case to finish.
- // ASSERTS if there are test failures.
- void WaitForFinish(const std::string &name, const std::string &id,
- const GURL &url, const int wait_time)
- {
- const int kSleepTime = 250; // 4 times per second
- const int kMaxIntervals = wait_time / kSleepTime;
-
- scoped_ptr<TabProxy> tab(GetActiveTab());
-
- std::string done_str;
- for (int i = 0; i < kMaxIntervals; ++i) {
- Sleep(kSleepTime);
-
- // The webpage being tested has javascript which sets a cookie
- // which signals completion of the test. The cookie name is
- // a concatenation of the test name and the test id. This allows
- // us to run multiple tests within a single webpage and test
- // that they all c
- std::string cookieName = name;
- cookieName.append(".");
- cookieName.append(id);
- cookieName.append(".");
- cookieName.append(kTestCompleteCookie);
- tab->GetCookieByName(url, cookieName, &done_str);
- if (!done_str.empty())
- break;
- }
-
- EXPECT_EQ(kTestCompleteSuccess, done_str);
- }
-
private:
std::wstring plugin_dll_;
};
@@ -151,49 +107,68 @@ class NPAPIVisiblePluginTester : public NPAPITester {
// Test passing arguments to a plugin.
TEST_F(NPAPITester, Arguments) {
std::wstring test_case = L"arguments.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("arguments", "1", url, kShortWaitTimeout);
+ WaitForFinish("arguments", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
}
// Test invoking many plugins within a single page.
TEST_F(NPAPITester, ManyPlugins) {
std::wstring test_case = L"many_plugins.html";
- GURL url(GetTestUrl(test_case));
+ GURL url(GetTestUrl(L"npapi", test_case));
NavigateToURL(url);
- WaitForFinish("arguments", "1", url, kShortWaitTimeout);
- WaitForFinish("arguments", "2", url, kShortWaitTimeout);
- WaitForFinish("arguments", "3", url, kShortWaitTimeout);
- WaitForFinish("arguments", "4", url, kShortWaitTimeout);
- WaitForFinish("arguments", "5", url, kShortWaitTimeout);
- WaitForFinish("arguments", "6", url, kShortWaitTimeout);
- WaitForFinish("arguments", "7", url, kShortWaitTimeout);
- WaitForFinish("arguments", "8", url, kShortWaitTimeout);
- WaitForFinish("arguments", "9", url, kShortWaitTimeout);
- WaitForFinish("arguments", "10", url, kShortWaitTimeout);
- WaitForFinish("arguments", "11", url, kShortWaitTimeout);
- WaitForFinish("arguments", "12", url, kShortWaitTimeout);
- WaitForFinish("arguments", "13", url, kShortWaitTimeout);
- WaitForFinish("arguments", "14", url, kShortWaitTimeout);
- WaitForFinish("arguments", "15", url, kShortWaitTimeout);
+
+ WaitForFinish("arguments", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "2", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "3", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "4", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "5", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "6", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "7", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "8", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "9", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "10", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "11", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "12", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "13", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "14", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
+ WaitForFinish("arguments", "15", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
}
// Test various calls to GetURL from a plugin.
TEST_F(NPAPITester, GetURL) {
std::wstring test_case = L"geturl.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("geturl", "1", url, kShortWaitTimeout);
+ WaitForFinish("geturl", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
}
// Test various calls to GetURL for javascript URLs with
// non NULL targets from a plugin.
TEST_F(NPAPITester, GetJavaScriptURL) {
std::wstring test_case = L"get_javascript_url.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("getjavascripturl", "1", url, kShortWaitTimeout);
+ WaitForFinish("getjavascripturl", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
}
@@ -202,27 +177,32 @@ TEST_F(NPAPITester, GetJavaScriptURL) {
// will crash.
TEST_F(NPAPITester, NPObjectProxy) {
std::wstring test_case = L"npobject_proxy.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("npobject_proxy", "1", url, kShortWaitTimeout);
+ WaitForFinish("npobject_proxy", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
}
// Tests if a plugin executing a self deleting script using NPN_GetURL
// works without crashing or hanging
TEST_F(NPAPITester, SelfDeletePluginGetUrl) {
std::wstring test_case = L"self_delete_plugin_geturl.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("self_delete_plugin_geturl", "1", url, kShortWaitTimeout);
+ WaitForFinish("self_delete_plugin_geturl", "1", url,
+ kTestCompleteCookie, kTestCompleteSuccess,
+ kShortWaitTimeout);
}
// Tests if a plugin executing a self deleting script using Invoke
// works without crashing or hanging
TEST_F(NPAPITester, SelfDeletePluginInvoke) {
std::wstring test_case = L"self_delete_plugin_invoke.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("self_delete_plugin_invoke", "1", url, kShortWaitTimeout);
+ WaitForFinish("self_delete_plugin_invoke", "1", url,
+ kTestCompleteCookie, kTestCompleteSuccess,
+ kShortWaitTimeout);
}
// Tests if a plugin executing a self deleting script in the context of
@@ -231,9 +211,11 @@ TEST_F(NPAPIVisiblePluginTester, SelfDeletePluginInvokeInSynchronousPaint) {
if (!UITest::in_process_plugins() && !UITest::in_process_renderer()) {
show_window_ = true;
std::wstring test_case = L"execute_script_delete_in_paint.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("execute_script_delete_in_paint", "1", url, kShortWaitTimeout);
+ WaitForFinish("execute_script_delete_in_paint", "1", url,
+ kTestCompleteCookie, kTestCompleteSuccess,
+ kShortWaitTimeout);
}
}
@@ -241,9 +223,11 @@ TEST_F(NPAPIVisiblePluginTester, SelfDeletePluginInNewStream) {
if (!UITest::in_process_plugins() && !UITest::in_process_renderer()) {
show_window_ = true;
std::wstring test_case = L"self_delete_plugin_stream.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("self_delete_plugin_stream", "1", url, kShortWaitTimeout);
+ WaitForFinish("self_delete_plugin_stream", "1", url,
+ kTestCompleteCookie, kTestCompleteSuccess,
+ kShortWaitTimeout);
}
}
@@ -251,33 +235,39 @@ TEST_F(NPAPIVisiblePluginTester, SelfDeletePluginInNewStream) {
TEST_F(NPAPIVisiblePluginTester, VerifyPluginWindowRect) {
show_window_ = true;
std::wstring test_case = L"verify_plugin_window_rect.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("checkwindowrect", "1", url, kShortWaitTimeout);
+ WaitForFinish("checkwindowrect", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
}
TEST_F(NPAPIVisiblePluginTester, VerifyNPObjectLifetimeTest) {
if (!UITest::in_process_plugins() && !UITest::in_process_renderer()) {
show_window_ = true;
std::wstring test_case = L"npobject_lifetime_test.html";
- GURL url = GetTestUrl(test_case);
+ GURL url = GetTestUrl(L"npapi", test_case);
NavigateToURL(url);
- WaitForFinish("npobject_lifetime_test", "1", url, kShortWaitTimeout);
+ WaitForFinish("npobject_lifetime_test", "1", url,
+ kTestCompleteCookie, kTestCompleteSuccess,
+ kShortWaitTimeout);
}
}
// Tests that we don't crash or assert if NPP_New fails
TEST_F(NPAPIVisiblePluginTester, NewFails) {
- GURL url = GetTestUrl(L"new_fails.html");
+ GURL url = GetTestUrl(L"npapi", L"new_fails.html");
NavigateToURL(url);
- WaitForFinish("new_fails", "1", url, kShortWaitTimeout);
+ WaitForFinish("new_fails", "1", url, kTestCompleteCookie,
+ kTestCompleteSuccess, kShortWaitTimeout);
}
TEST_F(NPAPIVisiblePluginTester, SelfDeletePluginInNPNEvaluate) {
if (!UITest::in_process_plugins() && !UITest::in_process_renderer()) {
- GURL url = GetTestUrl(L"execute_script_delete_in_npn_evaluate.html");
+ GURL url = GetTestUrl(L"npapi",
+ L"execute_script_delete_in_npn_evaluate.html");
NavigateToURL(url);
WaitForFinish("npobject_delete_plugin_in_evaluate", "1", url,
+ kTestCompleteCookie, kTestCompleteSuccess,
kShortWaitTimeout);
}
} \ No newline at end of file
diff --git a/chrome/test/ui/ui_test.cc b/chrome/test/ui/ui_test.cc
index 263b7b7..a9e799f 100644
--- a/chrome/test/ui/ui_test.cc
+++ b/chrome/test/ui/ui_test.cc
@@ -28,6 +28,7 @@
#include "chrome/test/automation/window_proxy.h"
#include "chrome/test/test_file_util.h"
#include "googleurl/src/gurl.h"
+#include "net/base/net_util.h"
bool UITest::in_process_renderer_ = false;
bool UITest::in_process_plugins_ = false;
@@ -586,5 +587,40 @@ void UITest::PrintResult(const std::wstring& measurement,
trace.c_str(), value, units.c_str());
}
+GURL UITest::GetTestUrl(const std::wstring& test_directory,
+ const std::wstring &test_case) {
+ std::wstring path;
+ PathService::Get(chrome::DIR_TEST_DATA, &path);
+ file_util::AppendToPath(&path, test_directory);
+ file_util::AppendToPath(&path, test_case);
+ return net::FilePathToFileURL(path);
+}
+
+void UITest::WaitForFinish(const std::string &name,
+ const std::string &id,
+ const GURL &url,
+ const std::string& test_complete_cookie,
+ const std::string& expected_cookie_value,
+ const int wait_time) {
+ const int kIntervalMilliSeconds = 50;
+ // The webpage being tested has javascript which sets a cookie
+ // which signals completion of the test. The cookie name is
+ // a concatenation of the test name and the test id. This allows
+ // us to run multiple tests within a single webpage and test
+ // that they all c
+ std::string cookie_name = name;
+ cookie_name.append(".");
+ cookie_name.append(id);
+ cookie_name.append(".");
+ cookie_name.append(test_complete_cookie);
+
+ scoped_ptr<TabProxy> tab(GetActiveTab());
+
+ bool test_result = WaitUntilCookieValue(tab.get(), url,
+ cookie_name.c_str(),
+ kIntervalMilliSeconds, wait_time,
+ expected_cookie_value.c_str());
+ EXPECT_EQ(true, test_result);
+}
diff --git a/chrome/test/ui/ui_test.h b/chrome/test/ui/ui_test.h
index 5752bc7..0027c97 100644
--- a/chrome/test/ui/ui_test.h
+++ b/chrome/test/ui/ui_test.h
@@ -273,6 +273,19 @@ class UITest : public testing::Test {
// error.
DictionaryValue* GetDefaultProfilePreferences();
+ // Generate the URL for testing a particular test.
+ // HTML for the tests is all located in
+ // test_root_directory\test_directory\<testcase>
+ static GURL GetTestUrl(const std::wstring& test_directory,
+ const std::wstring &test_case);
+
+ // Waits for the test case to finish.
+ // ASSERTS if there are test failures.
+ void WaitForFinish(const std::string &name,
+ const std::string &id, const GURL &url,
+ const std::string& test_complete_cookie,
+ const std::string& expected_cookie_value,
+ const int wait_time);
private:
// Check that no processes related to Chrome exist, displaying
// the given message if any do.
diff --git a/chrome/test/ui/ui_tests.vcproj b/chrome/test/ui/ui_tests.vcproj
index d9eb832..9cbe00b 100644
--- a/chrome/test/ui/ui_tests.vcproj
+++ b/chrome/test/ui/ui_tests.vcproj
@@ -221,6 +221,14 @@
RelativePath="..\..\browser\browser_uitest.cc"
>
</File>
+ <Filter
+ Name="TestImages"
+ >
+ <File
+ RelativePath="..\..\browser\images_uitest.cc"
+ >
+ </File>
+ </Filter>
</Filter>
<Filter
Name="TestChromeLogging"
@@ -239,14 +247,6 @@
</File>
</Filter>
<Filter
- Name="TestImages"
- >
- <File
- RelativePath="..\..\browser\images_uitest.cc"
- >
- </File>
- </Filter>
- <Filter
Name="TestIFrame"
>
<File
@@ -522,6 +522,14 @@
>
</File>
</Filter>
+ <Filter
+ Name="TestHistory"
+ >
+ <File
+ RelativePath=".\history_uitest.cc"
+ >
+ </File>
+ </Filter>
</Files>
<Globals>
</Globals>
diff --git a/webkit/glue/webview_delegate.h b/webkit/glue/webview_delegate.h
index 4db62be..15e93ba 100644
--- a/webkit/glue/webview_delegate.h
+++ b/webkit/glue/webview_delegate.h
@@ -716,6 +716,9 @@ class WebViewDelegate : virtual public WebWidgetDelegate {
// will occur.
virtual void TransitionToCommittedForNewPage() { }
+ // Called when an item was added to the history
+ virtual void DidAddHistoryItem() { }
+
WebViewDelegate() { }
virtual ~WebViewDelegate() { }
diff --git a/webkit/glue/webview_impl.cc b/webkit/glue/webview_impl.cc
index 8bbe9c7..6697970 100644
--- a/webkit/glue/webview_impl.cc
+++ b/webkit/glue/webview_impl.cc
@@ -1494,6 +1494,7 @@ void WebViewImpl::didAddHistoryItem(WebCore::HistoryItem* item) {
#ifndef NDEBUG
new_navigation_loader_ = main_frame_->frame()->loader()->documentLoader();
#endif
+ delegate_->DidAddHistoryItem();
}
void WebViewImpl::willGoToHistoryItem(WebCore::HistoryItem* item) {