172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/core_options_handler.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/url_constants.h"
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/test/ui_test_utils.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/webui/web_ui_browsertest.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "googleurl/src/gurl.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gmock/include/gmock/gmock.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ::testing::StrictMock;
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ::testing::_;
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenMATCHER_P(Eq_ListValue, inList, "") {
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return arg->Equals(inList);
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass MockCoreOptionsHandler : public CoreOptionsHandler {
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleInitialize,
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleFetchPrefs,
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleObservePrefs,
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleSetBooleanPref,
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleSetIntegerPref,
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleSetDoublePref,
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleSetStringPref,
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleSetObjectPref,
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleClearPref,
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MOCK_METHOD1(HandleUserMetricsAction,
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      void(const ListValue* args));
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void RegisterMessages() {
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("coreOptionsInitialize",
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleInitialize));
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("fetchPrefs",
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleFetchPrefs));
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("observePrefs",
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleObservePrefs));
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("setBooleanPref",
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleSetBooleanPref));
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("setIntegerPref",
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleSetIntegerPref));
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("setDoublePref",
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleSetDoublePref));
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("setStringPref",
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleSetStringPref));
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("setObjectPref",
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleSetObjectPref));
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("clearPref",
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleClearPref));
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->RegisterMessageCallback("coreOptionsUserMetricsAction",
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        NewCallback(this, &MockCoreOptionsHandler ::HandleUserMetricsAction));
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass SettingsWebUITest : public WebUIBrowserTest {
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected:
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetUpInProcessBrowserTestFixture() {
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WebUIBrowserTest::SetUpInProcessBrowserTestFixture();
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddLibrary(FILE_PATH_LITERAL("settings.js"));
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetUpOnMainThread() {
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    mock_core_options_handler_.reset(new StrictMock<MockCoreOptionsHandler>());
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void CleanUpOnMainThread() {
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    mock_core_options_handler_.reset();
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual WebUIMessageHandler* GetMockMessageHandler() {
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return mock_core_options_handler_.get();
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<StrictMock<MockCoreOptionsHandler> > mock_core_options_handler_;
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test the end to end js to WebUI handler code path for
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the message setBooleanPref.
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TODO(dtseng): add more EXPECT_CALL's when updating js test.
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Crashes on Mac only. See http://crbug.com/79181
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_MACOSX)
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define MAYBE_TestSetBooleanPrefTriggers DISABLED_TestSetBooleanPrefTriggers
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define MAYBE_TestSetBooleanPrefTriggers TestSetBooleanPrefTriggers
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(SettingsWebUITest, MAYBE_TestSetBooleanPrefTriggers) {
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This serves as an example of a very constrained test.
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ListValue true_list_value;
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  true_list_value.Append(Value::CreateStringValue("browser.show_home_button"));
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  true_list_value.Append(Value::CreateBooleanValue(true));
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  true_list_value.Append(
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      Value::CreateStringValue("Options_Homepage_HomeButton"));
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL));
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(*mock_core_options_handler_,
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      HandleSetBooleanPref(Eq_ListValue(&true_list_value)));
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(RunJavascriptTest("testSetBooleanPrefTriggers"));
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
111