diff options
-rw-r--r-- | chrome/browser/dom_ui/dom_ui.cc | 7 | ||||
-rw-r--r-- | chrome/browser/dom_ui/dom_ui.h | 11 | ||||
-rw-r--r-- | chrome/browser/dom_ui/dom_ui_browsertest.cc | 24 | ||||
-rw-r--r-- | chrome/browser/dom_ui/dom_ui_browsertest.h | 11 | ||||
-rw-r--r-- | chrome/browser/dom_ui/settings_browsertest.cc | 92 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 | ||||
-rw-r--r-- | chrome/test/data/dom_ui/settings_set_boolean_pref_triggers.js | 13 |
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(); +} +]); |