summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-03 00:30:03 +0000
committerdtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-03 00:30:03 +0000
commitb5c5e5f080c47f1c9eafe86479795d5b4ec48f84 (patch)
tree37f8bf5a1da0feff03d82baec17869fd3c0c27f9 /chrome
parent9b092dcdac109a8636fd087fe5d9375e00857bd5 (diff)
downloadchromium_src-b5c5e5f080c47f1c9eafe86479795d5b4ec48f84.zip
chromium_src-b5c5e5f080c47f1c9eafe86479795d5b4ec48f84.tar.gz
chromium_src-b5c5e5f080c47f1c9eafe86479795d5b4ec48f84.tar.bz2
Reland 73532.
BUG=65911 TBR=dtseng Review URL: http://codereview.chromium.org/6286068 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@73558 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/dom_ui/dom_ui.cc7
-rw-r--r--chrome/browser/dom_ui/dom_ui.h11
-rw-r--r--chrome/browser/dom_ui/dom_ui_browsertest.cc24
-rw-r--r--chrome/browser/dom_ui/dom_ui_browsertest.h11
-rw-r--r--chrome/browser/dom_ui/settings_browsertest.cc92
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/test/data/dom_ui/settings_set_boolean_pref_triggers.js13
7 files changed, 153 insertions, 6 deletions
diff --git a/chrome/browser/dom_ui/dom_ui.cc b/chrome/browser/dom_ui/dom_ui.cc
index 98d4bf2..df15f29 100644
--- a/chrome/browser/dom_ui/dom_ui.cc
+++ b/chrome/browser/dom_ui/dom_ui.cc
@@ -126,7 +126,12 @@ ui::ThemeProvider* DOMUI::GetThemeProvider() const {
void DOMUI::RegisterMessageCallback(const std::string &message,
MessageCallback *callback) {
- message_callbacks_.insert(std::make_pair(message, callback));
+ std::pair<MessageCallbackMap::iterator, bool> result =
+ message_callbacks_.insert(std::make_pair(message, callback));
+
+ // Overwrite preexisting message callback mappings.
+ if (register_callback_overwrites() && !result.second)
+ result.first->second = callback;
}
Profile* DOMUI::GetProfile() const {
diff --git a/chrome/browser/dom_ui/dom_ui.h b/chrome/browser/dom_ui/dom_ui.h
index 6ecd311..9ed604a 100644
--- a/chrome/browser/dom_ui/dom_ui.h
+++ b/chrome/browser/dom_ui/dom_ui.h
@@ -105,6 +105,16 @@ class DOMUI {
return bindings_;
}
+ // Indicates whether RegisterMessageCallback() will overwrite an existing
+ // message callback mapping. Serves as the hook for test mocks.
+ bool register_callback_overwrites() const {
+ return register_callback_overwrites_;
+ }
+
+ void register_callback_overwrites(bool value) {
+ register_callback_overwrites_ = value;
+ }
+
// Call a Javascript function by sending its name and arguments down to
// the renderer. This is asynchronous; there's no way to get the result
// of the call, and should be thought of more like sending a message to
@@ -155,6 +165,7 @@ class DOMUI {
PageTransition::Type link_transition_type_; // Defaults to LINK.
int bindings_; // The bindings from BindingsPolicy that should be enabled for
// this page.
+ bool register_callback_overwrites_; // Defaults to false;
// The DOMMessageHandlers we own.
std::vector<DOMMessageHandler*> handlers_;
diff --git a/chrome/browser/dom_ui/dom_ui_browsertest.cc b/chrome/browser/dom_ui/dom_ui_browsertest.cc
index 01856f6..d390139 100644
--- a/chrome/browser/dom_ui/dom_ui_browsertest.cc
+++ b/chrome/browser/dom_ui/dom_ui_browsertest.cc
@@ -10,6 +10,7 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/ui_test_utils.h"
+#include "ui/base/resource/resource_bundle.h"
static const FilePath::CharType* kDOMUILibraryJS =
FILE_PATH_LITERAL("test_api.js");
@@ -19,16 +20,20 @@ static const FilePath::CharType* kDOMUITestFolder =
bool DOMUITest::RunDOMUITest(const FilePath::CharType* src_path) {
std::string content;
BuildJavaScriptTest(FilePath(src_path), &content);
- handler_->Attach(
- browser()->GetSelectedTabContents()->dom_ui());
- return handler_->Execute(content);
+ SetupHandlers();
+ return test_handler_->Execute(content);
}
-DOMUITest::DOMUITest() : handler_(new DOMUITestHandler()) {}
+DOMUITest::DOMUITest() : test_handler_(new DOMUITestHandler()) {}
void DOMUITest::SetUpInProcessBrowserTestFixture() {
ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_));
test_data_directory_ = test_data_directory_.Append(kDOMUITestFolder);
+
+ // TODO(dtseng): should this be part of every BrowserTest or just DOMUI test.
+ FilePath resources_pack_path;
+ PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
+ ResourceBundle::AddDataPackToSharedInstance(resources_pack_path);
}
void DOMUITest::BuildJavaScriptTest(const FilePath& src_path,
@@ -46,6 +51,17 @@ void DOMUITest::BuildJavaScriptTest(const FilePath& src_path,
content->append(src_content);
}
+void DOMUITest::SetupHandlers() {
+ DOMUI* dom_ui_instance =
+ browser()->GetSelectedTabContents()->dom_ui();
+ ASSERT_TRUE(dom_ui_instance != NULL);
+ dom_ui_instance->register_callback_overwrites(true);
+ test_handler_->Attach(dom_ui_instance);
+
+ if (GetMockMessageHandler())
+ GetMockMessageHandler()->Attach(dom_ui_instance);
+}
+
IN_PROC_BROWSER_TEST_F(DOMUITest, TestSamplePass) {
// Navigate to UI.
// TODO(dtseng): make accessor for subclasses to return?
diff --git a/chrome/browser/dom_ui/dom_ui_browsertest.h b/chrome/browser/dom_ui/dom_ui_browsertest.h
index 4207b1a..8203b53 100644
--- a/chrome/browser/dom_ui/dom_ui_browsertest.h
+++ b/chrome/browser/dom_ui/dom_ui_browsertest.h
@@ -12,6 +12,8 @@
#include "chrome/browser/dom_ui/dom_ui_handler_browsertest.h"
#include "chrome/test/in_process_browser_test.h"
+class DOMMessageHandler;
+
// The runner of DOMUI javascript based tests.
// See chrome/test/data/dom_ui/test_api.js for the javascript side test API's.
//
@@ -25,8 +27,12 @@ class DOMUITest : public InProcessBrowserTest {
protected:
DOMUITest();
+ // Setup test path.
virtual void SetUpInProcessBrowserTestFixture();
+ // Returns a mock DOMUI object under test (if any).
+ virtual DOMMessageHandler* GetMockMessageHandler() { return NULL; }
+
private:
// Builds a javascript test in the form:
// <js_library> ...
@@ -37,8 +43,11 @@ class DOMUITest : public InProcessBrowserTest {
void BuildJavaScriptTest(const FilePath& src_path,
std::string* content);
+ // Attaches mock and test handlers.
+ void SetupHandlers();
+
// Handles test framework messages.
- scoped_ptr<DOMUITestHandler> handler_;
+ scoped_ptr<DOMUITestHandler> test_handler_;
// Location of test data (currently test/data/dom_ui).
FilePath test_data_directory_;
diff --git a/chrome/browser/dom_ui/settings_browsertest.cc b/chrome/browser/dom_ui/settings_browsertest.cc
new file mode 100644
index 0000000..af96525
--- /dev/null
+++ b/chrome/browser/dom_ui/settings_browsertest.cc
@@ -0,0 +1,92 @@
+// Copyright (c) 2011 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/dom_ui/dom_ui_browsertest.h"
+#include "chrome/browser/dom_ui/options/core_options_handler.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/test/ui_test_utils.h"
+#include "googleurl/src/gurl.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::StrictMock;
+using ::testing::_;
+
+MATCHER_P(Eq_ListValue, inList, "") {
+ return arg->Equals(inList);
+}
+
+class MockCoreOptionsHandler : public CoreOptionsHandler {
+ public:
+ MOCK_METHOD1(HandleInitialize,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleFetchPrefs,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleObservePrefs,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleSetBooleanPref,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleSetIntegerPref,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleSetDoublePref,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleSetStringPref,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleSetObjectPref,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleClearPref,
+ void(const ListValue* args));
+ MOCK_METHOD1(HandleUserMetricsAction,
+ void(const ListValue* args));
+
+ virtual void RegisterMessages() {
+ dom_ui_->RegisterMessageCallback("coreOptionsInitialize",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleInitialize));
+ dom_ui_->RegisterMessageCallback("fetchPrefs",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleFetchPrefs));
+ dom_ui_->RegisterMessageCallback("observePrefs",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleObservePrefs));
+ dom_ui_->RegisterMessageCallback("setBooleanPref",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleSetBooleanPref));
+ dom_ui_->RegisterMessageCallback("setIntegerPref",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleSetIntegerPref));
+ dom_ui_->RegisterMessageCallback("setDoublePref",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleSetDoublePref));
+ dom_ui_->RegisterMessageCallback("setStringPref",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleSetStringPref));
+ dom_ui_->RegisterMessageCallback("setObjectPref",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleSetObjectPref));
+ dom_ui_->RegisterMessageCallback("clearPref",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleClearPref));
+ dom_ui_->RegisterMessageCallback("coreOptionsUserMetricsAction",
+ NewCallback(this, &MockCoreOptionsHandler ::HandleUserMetricsAction));
+ }
+};
+
+class SettingsDOMUITest : public DOMUITest {
+ protected:
+ virtual DOMMessageHandler* GetMockMessageHandler() {
+ return &mock_core_options_handler_;
+ }
+
+ StrictMock<MockCoreOptionsHandler> mock_core_options_handler_;
+};
+
+// Test the end to end js to DOMUI handler code path for
+// the message setBooleanPref.
+// TODO(dtseng): add more EXPECT_CALL's when updating js test.
+IN_PROC_BROWSER_TEST_F(SettingsDOMUITest, TestSetBooleanPrefTriggers) {
+ // This serves as an example of a very constrained test.
+ ListValue true_list_value;
+ true_list_value.Append(Value::CreateStringValue("browser.show_home_button"));
+ true_list_value.Append(Value::CreateStringValue("true"));
+ true_list_value.Append(
+ Value::CreateStringValue("Options_Homepage_HomeButton"));
+ ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL));
+ EXPECT_CALL(mock_core_options_handler_,
+ HandleSetBooleanPref(Eq_ListValue(&true_list_value)));
+ ASSERT_TRUE(RunDOMUITest(
+ FILE_PATH_LITERAL("settings_set_boolean_pref_triggers.js")));
+}
+
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index dee53e1..de1baf6 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -2066,6 +2066,7 @@
'browser/dom_ui/dom_ui_handler_browsertest.h',
'browser/dom_ui/file_browse_browsertest.cc',
'browser/dom_ui/mediaplayer_browsertest.cc',
+ 'browser/dom_ui/settings_browsertest.cc',
'browser/download/download_browsertest.cc',
'browser/download/save_page_browsertest.cc',
'browser/extensions/alert_apitest.cc',
diff --git a/chrome/test/data/dom_ui/settings_set_boolean_pref_triggers.js b/chrome/test/data/dom_ui/settings_set_boolean_pref_triggers.js
new file mode 100644
index 0000000..c3d1d6d
--- /dev/null
+++ b/chrome/test/data/dom_ui/settings_set_boolean_pref_triggers.js
@@ -0,0 +1,13 @@
+// Copyright (c) 2011 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.
+
+runTests([
+function() {
+ // TODO(dtseng): make generic to click all buttons.
+ var showHomeButton = $('toolbarShowHomeButton');
+ assertTrue(showHomeButton != null);
+ showHomeButton.click();
+ showHomeButton.blur();
+}
+]);