summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-09 19:10:41 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-09 19:10:41 +0000
commit71a742d202c338aff094c0dd62f8b8603130d9cf (patch)
tree07bc3b247bd9978915083a56502a187f95500676 /chrome
parent72eb68c9482f4dcdd397e5744bcb046b514e224c (diff)
downloadchromium_src-71a742d202c338aff094c0dd62f8b8603130d9cf.zip
chromium_src-71a742d202c338aff094c0dd62f8b8603130d9cf.tar.gz
chromium_src-71a742d202c338aff094c0dd62f8b8603130d9cf.tar.bz2
Scrape search definitions from forms that have onsubmit handlers. The scraping is done after submit events are handled by the page DOM so doing this is safe.
Adds test infrastructure for determining that scraping occurs on submit: - allow testserver to be configured to serve pages from / on the server - provide a ui test util that navigates and waits for N subsequent redirections/navigations before returning control to the test to handle automated submission Eric, please review the test server changes. Scott, please look over everything else. Review URL: http://codereview.chromium.org/62145 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13444 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/search_engines/template_url_scraper_unittest.cc88
-rw-r--r--chrome/test/data/template_url_scraper/submit_handler/index.html24
-rw-r--r--chrome/test/in_process_browser_test.cc15
-rw-r--r--chrome/test/in_process_browser_test.h8
-rw-r--r--chrome/test/ui_test_utils.cc31
-rw-r--r--chrome/test/ui_test_utils.h10
-rw-r--r--chrome/test/unit/unittests.vcproj4
7 files changed, 169 insertions, 11 deletions
diff --git a/chrome/browser/search_engines/template_url_scraper_unittest.cc b/chrome/browser/search_engines/template_url_scraper_unittest.cc
new file mode 100644
index 0000000..dc02852
--- /dev/null
+++ b/chrome/browser/search_engines/template_url_scraper_unittest.cc
@@ -0,0 +1,88 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
+// source code is governed by a BSD-style license that can be found in the
+// LICENSE file.
+
+#include "chrome/browser/browser.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/search_engines/template_url_model.h"
+#include "chrome/browser/search_engines/template_url_prepopulate_data.h"
+#include "chrome/common/notification_registrar.h"
+#include "chrome/common/notification_source.h"
+#include "chrome/common/notification_type.h"
+#include "chrome/test/in_process_browser_test.h"
+#include "chrome/test/ui_test_utils.h"
+#include "net/base/host_resolver_unittest.h"
+#include "net/base/net_util.h"
+
+namespace {
+class TemplateURLScraperTest : public InProcessBrowserTest {
+ public:
+ TemplateURLScraperTest() {
+ }
+
+ protected:
+ virtual void ConfigureHostMapper(net::RuleBasedHostMapper* host_mapper) {
+ InProcessBrowserTest::ConfigureHostMapper(host_mapper);
+ // We use foo.com in our tests.
+ host_mapper->AddRule("*.foo.com", "localhost");
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TemplateURLScraperTest);
+};
+
+class TemplateURLModelLoader : public NotificationObserver {
+ public:
+ explicit TemplateURLModelLoader(TemplateURLModel* model) : model_(model) {
+ registrar_.Add(this, NotificationType::TEMPLATE_URL_MODEL_LOADED,
+ Source<TemplateURLModel>(model));
+ model_->Load();
+ ui_test_utils::RunMessageLoop();
+ }
+
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (type == NotificationType::TEMPLATE_URL_MODEL_LOADED &&
+ Source<TemplateURLModel>(source).ptr() == model_) {
+ MessageLoop::current()->Quit();
+ }
+ }
+
+ private:
+ NotificationRegistrar registrar_;
+
+ TemplateURLModel* model_;
+
+ DISALLOW_COPY_AND_ASSIGN(TemplateURLModelLoader);
+};
+
+} // namespace
+
+IN_PROC_BROWSER_TEST_F(TemplateURLScraperTest, ScrapeWithOnSubmit) {
+ TemplateURLModel* template_urls = browser()->profile()->GetTemplateURLModel();
+ TemplateURLModelLoader loader(template_urls);
+
+ std::vector<const TemplateURL*> all_urls = template_urls->GetTemplateURLs();
+
+ // We need to substract the default pre-populated engines that the profile is
+ // set up with.
+ size_t default_index = 0;
+ std::vector<TemplateURL*> prepopulate_urls;
+ TemplateURLPrepopulateData::GetPrepopulatedEngines(
+ browser()->profile()->GetPrefs(),
+ &prepopulate_urls,
+ &default_index);
+
+ EXPECT_EQ(prepopulate_urls.size(), all_urls.size());
+
+ scoped_refptr<HTTPTestServer> server(
+ HTTPTestServer::CreateServerWithFileRootURL(
+ L"chrome/test/data/template_url_scraper/submit_handler", L"/",
+ g_browser_process->io_thread()->message_loop()));
+ ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
+ browser(), GURL("http://www.foo.com:1337/"), 2);
+
+ all_urls = template_urls->GetTemplateURLs();
+ EXPECT_EQ(1, all_urls.size() - prepopulate_urls.size());
+}
diff --git a/chrome/test/data/template_url_scraper/submit_handler/index.html b/chrome/test/data/template_url_scraper/submit_handler/index.html
new file mode 100644
index 0000000..2e0b04f
--- /dev/null
+++ b/chrome/test/data/template_url_scraper/submit_handler/index.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<title>Submit handler TemplateURL scraping test</title>
+<script>
+
+function submit_handler() {
+ document.getElementById("data").value = "test_data";
+}
+
+function submit_form() {
+ document.forms[0].submit();
+}
+
+</script>
+</head>
+
+<body onload="submit_form();">
+<form action="http://www.foo.com:1337" onsubmit="submit_handler();">
+<input type="hidden" id="data" />
+<input type="text" name="q" />
+<input type="submit" />
+</form>
+</body>
+</html>
diff --git a/chrome/test/in_process_browser_test.cc b/chrome/test/in_process_browser_test.cc
index 39114ee..6699144 100644
--- a/chrome/test/in_process_browser_test.cc
+++ b/chrome/test/in_process_browser_test.cc
@@ -125,12 +125,7 @@ void InProcessBrowserTest::SetUp() {
scoped_refptr<net::RuleBasedHostMapper> host_mapper(
new net::RuleBasedHostMapper());
- // TODO(sky): Don't make a real dns lookup here or simulate a failing
- // lookup.
- host_mapper->AllowDirectLookup("*.google.com");
- // See http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol
- // We don't want the test code to use it.
- host_mapper->AddSimulatedFailure("wpad");
+ ConfigureHostMapper(host_mapper.get());
net::ScopedHostMapper scoped_host_mapper(host_mapper.get());
BrowserMain(params);
}
@@ -221,3 +216,11 @@ void InProcessBrowserTest::RunTestOnMainThreadLoop() {
MessageLoopForUI::current()->Quit();
}
+
+void InProcessBrowserTest::ConfigureHostMapper(
+ net::RuleBasedHostMapper* host_mapper) {
+ host_mapper->AllowDirectLookup("*.google.com");
+ // See http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol
+ // We don't want the test code to use it.
+ host_mapper->AddSimulatedFailure("wpad");
+}
diff --git a/chrome/test/in_process_browser_test.h b/chrome/test/in_process_browser_test.h
index 89de9b9..457516e 100644
--- a/chrome/test/in_process_browser_test.h
+++ b/chrome/test/in_process_browser_test.h
@@ -12,6 +12,9 @@
class Browser;
class Profile;
+namespace net {
+class RuleBasedHostMapper;
+}
// Base class for tests wanting to bring up a browser in the unit test process.
// Writing tests with InProcessBrowserTest is slightly different than that of
@@ -64,6 +67,11 @@ class InProcessBrowserTest : public testing::Test, public NotificationObserver {
// Override this rather than TestBody.
virtual void RunTestOnMainThread() = 0;
+ // Allows subclasses to configure the host mapper. By default this blocks
+ // requests to google.com as Chrome pings that on startup and we don't want to
+ // do that during testing.
+ virtual void ConfigureHostMapper(net::RuleBasedHostMapper* host_mapper);
+
// Starts an HTTP server.
HTTPTestServer* StartHTTPServer();
diff --git a/chrome/test/ui_test_utils.cc b/chrome/test/ui_test_utils.cc
index 47e3ef2..6af1091 100644
--- a/chrome/test/ui_test_utils.cc
+++ b/chrome/test/ui_test_utils.cc
@@ -20,8 +20,11 @@ namespace {
// Used to block until a navigation completes.
class NavigationNotificationObserver : public NotificationObserver {
public:
- explicit NavigationNotificationObserver(NavigationController* controller)
- : navigation_started_(false) {
+ NavigationNotificationObserver(NavigationController* controller,
+ int number_of_navigations)
+ : navigation_started_(false),
+ navigations_completed_(0),
+ number_of_navigations_(number_of_navigations) {
registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED,
Source<NavigationController>(controller));
registrar_.Add(this, NotificationType::LOAD_START,
@@ -38,7 +41,8 @@ class NavigationNotificationObserver : public NotificationObserver {
type == NotificationType::LOAD_START) {
navigation_started_ = true;
} else if (type == NotificationType::LOAD_STOP) {
- if (navigation_started_) {
+ if (navigation_started_ &&
+ ++navigations_completed_ == number_of_navigations_) {
navigation_started_ = false;
MessageLoopForUI::current()->Quit();
}
@@ -51,6 +55,12 @@ class NavigationNotificationObserver : public NotificationObserver {
// If true the navigation has started.
bool navigation_started_;
+ // The number of navigations that have been completed.
+ int navigations_completed_;
+
+ // The number of navigations to wait for.
+ int number_of_navigations_;
+
DISALLOW_COPY_AND_ASSIGN(NavigationNotificationObserver);
};
@@ -66,15 +76,26 @@ void RunMessageLoop() {
}
void WaitForNavigation(NavigationController* controller) {
- NavigationNotificationObserver observer(controller);
+ WaitForNavigations(controller, 1);
+}
+
+void WaitForNavigations(NavigationController* controller,
+ int number_of_navigations) {
+ NavigationNotificationObserver observer(controller, number_of_navigations);
}
void NavigateToURL(Browser* browser, const GURL& url) {
+ NavigateToURLBlockUntilNavigationsComplete(browser, url, 1);
+}
+
+void NavigateToURLBlockUntilNavigationsComplete(Browser* browser,
+ const GURL& url,
+ int number_of_navigations) {
NavigationController* controller =
browser->GetSelectedTabContents()->controller();
browser->OpenURLFromTab(browser->GetSelectedTabContents(), url, GURL(),
CURRENT_TAB, PageTransition::TYPED);
- WaitForNavigation(controller);
+ WaitForNavigations(controller, number_of_navigations);
}
} // namespace ui_test_utils
diff --git a/chrome/test/ui_test_utils.h b/chrome/test/ui_test_utils.h
index f0433b0..ced32d2 100644
--- a/chrome/test/ui_test_utils.h
+++ b/chrome/test/ui_test_utils.h
@@ -21,10 +21,20 @@ void RunMessageLoop();
// the navigation finishes.
void WaitForNavigation(NavigationController* controller);
+// Waits for |controller| to complete a navigation. This blocks until
+// the specified number of navigations complete.
+void WaitForNavigations(NavigationController* controller,
+ int number_of_navigations);
+
// Navigates the selected tab of |browser| to |url|, blocking until the
// navigation finishes.
void NavigateToURL(Browser* browser, const GURL& url);
+// Navigates the selected tab of |browser| to |url|, blocking until the
+// number of navigations specified complete.
+void NavigateToURLBlockUntilNavigationsComplete(Browser* browser,
+ const GURL& url,
+ int number_of_navigations);
}
#endif // CHROME_TEST_UI_TEST_UTILS_H_
diff --git a/chrome/test/unit/unittests.vcproj b/chrome/test/unit/unittests.vcproj
index 4a5d3cd..fb35266 100644
--- a/chrome/test/unit/unittests.vcproj
+++ b/chrome/test/unit/unittests.vcproj
@@ -704,6 +704,10 @@
>
</File>
<File
+ RelativePath="..\..\browser\search_engines\template_url_scraper_unittest.cc"
+ >
+ </File>
+ <File
RelativePath="..\..\browser\search_engines\template_url_unittest.cc"
>
</File>