diff options
author | mirandac@google.com <mirandac@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-16 15:48:05 +0000 |
---|---|---|
committer | mirandac@google.com <mirandac@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-16 15:48:05 +0000 |
commit | 39909f9ccfd4746f8bac60bb356032efcd0951d3 (patch) | |
tree | 49994e45b4993e5676e2e1c51fbeb26f1f0ebdd8 /chrome/browser | |
parent | 7c46c809686906f9c5bd33dadb2836c00f909104 (diff) | |
download | chromium_src-39909f9ccfd4746f8bac60bb356032efcd0951d3.zip chromium_src-39909f9ccfd4746f8bac60bb356032efcd0951d3.tar.gz chromium_src-39909f9ccfd4746f8bac60bb356032efcd0951d3.tar.bz2 |
Allow randomized search engines in selection dialog.
Add an option in the master_preferences to randomize the order of logos in the search engine selection screen. This allows us to cull out a small subset of users to take part in a test of the effects of logo position on search engine choice.
I also filed http://crbug.com/46606 to remind me to revert this change when testing is complete.
BUG=46302
TEST=Add the following options to master_preferences:
"distribution": {
"search_engine_experiment": true,
"search_engine_experiment_randomize": true
}
Run a few times as --first-run, and see search engines appear in random order in the selection box.
Review URL: http://codereview.chromium.org/2808006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49950 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/browser_main.cc | 1 | ||||
-rw-r--r-- | chrome/browser/first_run.h | 4 | ||||
-rw-r--r-- | chrome/browser/first_run_gtk.cc | 1 | ||||
-rw-r--r-- | chrome/browser/first_run_mac.mm | 1 | ||||
-rw-r--r-- | chrome/browser/first_run_win.cc | 11 | ||||
-rw-r--r-- | chrome/browser/views/first_run_customize_view.cc | 21 | ||||
-rw-r--r-- | chrome/browser/views/first_run_customize_view.h | 1 | ||||
-rw-r--r-- | chrome/browser/views/first_run_search_engine_view.cc | 16 | ||||
-rw-r--r-- | chrome/browser/views/first_run_search_engine_view.h | 8 | ||||
-rw-r--r-- | chrome/browser/views/first_run_view.cc | 18 | ||||
-rw-r--r-- | chrome/browser/views/first_run_view.h | 8 | ||||
-rw-r--r-- | chrome/browser/views/first_run_view_base.cc | 6 | ||||
-rw-r--r-- | chrome/browser/views/first_run_view_base.h | 4 |
13 files changed, 73 insertions, 27 deletions
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index 361be11..9bec9f2 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -1205,6 +1205,7 @@ int BrowserMain(const MainFunctionParams& parameters) { master_prefs.do_import_items, master_prefs.dont_import_items, master_prefs.run_search_engine_experiment, + master_prefs.randomize_search_engine_experiment, &process_singleton)) { // The user cancelled the first run dialog box, we should exit Chrome. return ResultCodes::NORMAL_EXIT; diff --git a/chrome/browser/first_run.h b/chrome/browser/first_run.h index 92c80c0..6994855 100644 --- a/chrome/browser/first_run.h +++ b/chrome/browser/first_run.h @@ -44,6 +44,7 @@ class FirstRun { int do_import_items; int dont_import_items; bool run_search_engine_experiment; + bool randomize_search_engine_experiment; std::vector<GURL> new_tabs; std::vector<GURL> bookmarks; }; @@ -262,6 +263,8 @@ class FirstRunImportObserver : public ImportObserver { // preferences and will override default behavior of importer. // |search_engine_experiment| indicates whether the experimental search engine // window should be shown. +// |randomize_search_engine_experiment| is true if the logos in the search +// engine window should be shown in randomized order. // Returns true if the user clicked "Start", false if the user pressed "Cancel" // or closed the dialog. bool OpenFirstRunDialog(Profile* profile, @@ -269,6 +272,7 @@ bool OpenFirstRunDialog(Profile* profile, int import_items, int dont_import_items, bool search_engine_experiment, + bool randomize_search_engine_experiment, ProcessSingleton* process_singleton); #endif // CHROME_BROWSER_FIRST_RUN_H_ diff --git a/chrome/browser/first_run_gtk.cc b/chrome/browser/first_run_gtk.cc index 202d095..c35063d 100644 --- a/chrome/browser/first_run_gtk.cc +++ b/chrome/browser/first_run_gtk.cc @@ -25,6 +25,7 @@ bool OpenFirstRunDialog(Profile* profile, bool homepage_defined, int import_items, int dont_import_items, bool search_engine_experiment, + bool randomize_search_engine_experiment, ProcessSingleton* process_singleton) { return FirstRunDialog::Show(profile, process_singleton); } diff --git a/chrome/browser/first_run_mac.mm b/chrome/browser/first_run_mac.mm index 3a73403..948e806 100644 --- a/chrome/browser/first_run_mac.mm +++ b/chrome/browser/first_run_mac.mm @@ -51,6 +51,7 @@ bool OpenFirstRunDialog(Profile* profile, int import_items, int dont_import_items, bool search_engine_experiment, + bool randomize_search_engine_experiment, ProcessSingleton* process_singleton) { FirstRunController* controller = new FirstRunController; return controller->DoFirstRun(profile, process_singleton); diff --git a/chrome/browser/first_run_win.cc b/chrome/browser/first_run_win.cc index fc1e0cc..512385c 100644 --- a/chrome/browser/first_run_win.cc +++ b/chrome/browser/first_run_win.cc @@ -324,6 +324,13 @@ bool FirstRun::ProcessMasterPreferences(const FilePath& user_data_dir, &value) && value) { // Set the first run dialog to include the search choice window. out_prefs->run_search_engine_experiment = true; + // Check to see if search engine logos should be randomized. + if (installer_util::GetDistroBooleanPreference(prefs.get(), + installer_util::master_preferences:: + kSearchEngineExperimentRandomizePref, + &value) && value) { + out_prefs->randomize_search_engine_experiment = true; + } // Set the first run bubble to minimal. FirstRun::SetMinimalFirstRunBubblePref(); } @@ -491,6 +498,7 @@ bool OpenFirstRunDialog(Profile* profile, int import_items, int dont_import_items, bool search_engine_experiment, + bool randomize_search_engine_experiment, ProcessSingleton* process_singleton) { DCHECK(profile); DCHECK(process_singleton); @@ -502,7 +510,8 @@ bool OpenFirstRunDialog(Profile* profile, homepage_defined, import_items, dont_import_items, - search_engine_experiment)); + search_engine_experiment, + randomize_search_engine_experiment)); first_run_view->set_parent_owned(false); views::Window* first_run_ui = views::Window::CreateChromeWindow( NULL, gfx::Rect(), first_run_view.get()); diff --git a/chrome/browser/views/first_run_customize_view.cc b/chrome/browser/views/first_run_customize_view.cc index 503d75a..cbaab1d 100644 --- a/chrome/browser/views/first_run_customize_view.cc +++ b/chrome/browser/views/first_run_customize_view.cc @@ -22,16 +22,19 @@ #include "views/standard_layout.h" #include "views/window/window.h" -FirstRunCustomizeView::FirstRunCustomizeView(Profile* profile, - ImporterHost* importer_host, - CustomizeViewObserver* observer, - bool default_browser_checked, - bool homepage_defined, - int import_items, - int dont_import_items, - bool search_engine_experiment) +FirstRunCustomizeView::FirstRunCustomizeView( + Profile* profile, + ImporterHost* importer_host, + CustomizeViewObserver* observer, + bool default_browser_checked, + bool homepage_defined, + int import_items, + int dont_import_items, + bool search_engine_experiment, + bool randomize_search_engine_experiment) : FirstRunViewBase(profile, homepage_defined, import_items, - dont_import_items, search_engine_experiment), + dont_import_items, search_engine_experiment, + randomize_search_engine_experiment), main_label_(NULL), import_cbox_(NULL), import_from_combo_(NULL), diff --git a/chrome/browser/views/first_run_customize_view.h b/chrome/browser/views/first_run_customize_view.h index ecc3a7aa..11ee459 100644 --- a/chrome/browser/views/first_run_customize_view.h +++ b/chrome/browser/views/first_run_customize_view.h @@ -43,6 +43,7 @@ class FirstRunCustomizeView : public FirstRunViewBase, bool homepage_defined, int import_items, int dont_import_items, + bool randomize_search_engine_experiment, bool search_engine_experiment); virtual ~FirstRunCustomizeView(); diff --git a/chrome/browser/views/first_run_search_engine_view.cc b/chrome/browser/views/first_run_search_engine_view.cc index f1eef9f..90b8ac0 100644 --- a/chrome/browser/views/first_run_search_engine_view.cc +++ b/chrome/browser/views/first_run_search_engine_view.cc @@ -4,11 +4,13 @@ #include "chrome/browser/views/first_run_search_engine_view.h" +#include <algorithm> #include <map> #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/i18n/rtl.h" +#include "base/time.h" #include "chrome/browser/options_window.h" #include "chrome/browser/profile.h" #include "chrome/browser/search_engines/template_url.h" @@ -29,6 +31,7 @@ #include "views/view_text_utils.h" #include "views/window/window.h" +using base::Time; using TemplateURLPrepopulateData::SearchEngineType; namespace { @@ -156,10 +159,11 @@ void SearchEngineChoice::SetChoiceViewBounds(int x, int y, int width, } FirstRunSearchEngineView::FirstRunSearchEngineView( - SearchEngineSelectionObserver* observer, Profile* profile) + SearchEngineSelectionObserver* observer, Profile* profile, bool randomize) : profile_(profile), observer_(observer), - text_direction_is_rtl_(base::i18n::IsRTL()) { + text_direction_is_rtl_(base::i18n::IsRTL()), + randomize_(randomize) { DCHECK(observer); // Don't show ourselves until all the search engines have loaded from // the profile -- otherwise we have nothing to show. @@ -250,6 +254,14 @@ void FirstRunSearchEngineView::OnTemplateURLModelChanged() { AddChildView(default_choice); // The button associated with the choice. } + // Randomize order of logos if option has been set. + if (randomize_) { + int seed = static_cast<int>(Time::Now().ToInternalValue()); + srand(seed); + std::random_shuffle(search_engine_choices_.begin(), + search_engine_choices_.end()); + } + // Now that we know how many logos to show, lay out and become visible. SetVisible(true); Layout(); diff --git a/chrome/browser/views/first_run_search_engine_view.h b/chrome/browser/views/first_run_search_engine_view.h index b012e22..774c682 100644 --- a/chrome/browser/views/first_run_search_engine_view.h +++ b/chrome/browser/views/first_run_search_engine_view.h @@ -85,9 +85,10 @@ class FirstRunSearchEngineView public: // |observer| is the FirstRunView that waits for us to pass back a search // engine choice; |profile| allows us to get the set of imported search - // engines, and display the KeywordEditorView on demand. + // engines, and display the KeywordEditorView on demand; |randomize| + // is true if logos are to be displayed in random order. FirstRunSearchEngineView(SearchEngineSelectionObserver* observer, - Profile* profile); + Profile* profile, bool randomize); virtual ~FirstRunSearchEngineView(); @@ -133,6 +134,9 @@ class FirstRunSearchEngineView bool text_direction_is_rtl_; + // If logos are to be displayed in random order. Used for UX testing. + bool randomize_; + // UI elements: // Text above the first horizontal separator views::Label* title_label_; diff --git a/chrome/browser/views/first_run_view.cc b/chrome/browser/views/first_run_view.cc index 23eb645..209c9be 100644 --- a/chrome/browser/views/first_run_view.cc +++ b/chrome/browser/views/first_run_view.cc @@ -40,9 +40,11 @@ std::wstring AddBullet(const std::wstring& text) { FirstRunView::FirstRunView(Profile* profile, bool homepage_defined, int import_items, int dont_import_items, - bool search_engine_experiment) + bool search_engine_experiment, + bool randomize_search_engine_experiment) : FirstRunViewBase(profile, homepage_defined, import_items, - dont_import_items, search_engine_experiment), + dont_import_items, search_engine_experiment, + randomize_search_engine_experiment), welcome_label_(NULL), actions_label_(NULL), actions_import_(NULL), @@ -186,15 +188,17 @@ void FirstRunView::OpenCustomizeDialog() { homepage_defined_, import_items_, dont_import_items_, - search_engine_experiment_))->Show(); + search_engine_experiment_, + randomize_search_engine_experiment_))->Show(); } -void FirstRunView::OpenSearchEngineDialog() { +void FirstRunView::OpenSearchEngineDialog(bool randomize) { views::Window::CreateChromeWindow( window()->GetNativeWindow(), gfx::Rect(), new FirstRunSearchEngineView(this, - profile_))->Show(); + profile_, + randomize))->Show(); } void FirstRunView::LinkActivated(views::Link* source, int event_flags) { @@ -229,7 +233,7 @@ bool FirstRunView::Accept() { // Launch the search engine dialog. if (search_engine_experiment_) { - OpenSearchEngineDialog(); + OpenSearchEngineDialog(randomize_search_engine_experiment_); // Leave without shutting down; we'll observe the search engine dialog and // shut down after it closes. return false; @@ -251,7 +255,7 @@ bool FirstRunView::Cancel() { // the work is done there we have nothing else to do. void FirstRunView::CustomizeAccepted() { if (search_engine_experiment_) { - OpenSearchEngineDialog(); + OpenSearchEngineDialog(randomize_search_engine_experiment_); // We'll shut down after search engine has been chosen. return; } diff --git a/chrome/browser/views/first_run_view.h b/chrome/browser/views/first_run_view.h index 05a8a09..bab3581f 100644 --- a/chrome/browser/views/first_run_view.h +++ b/chrome/browser/views/first_run_view.h @@ -30,7 +30,8 @@ class FirstRunView : public FirstRunViewBase, public: explicit FirstRunView(Profile* profile, bool homepage_defined, int import_items, int dont_import_items, - bool search_engine_experiment); + bool search_engine_experiment, + bool randomize_search_engine_experiment); virtual ~FirstRunView(); bool accepted() const { return accepted_;} @@ -64,8 +65,9 @@ class FirstRunView : public FirstRunViewBase, // Creates the dialog that allows the user to customize work items. void OpenCustomizeDialog(); - // Creates the search engine selection dialog. - void OpenSearchEngineDialog(); + // Creates the search engine selection dialog. If |randomize|, the display + // of search engine logos should be randomized. + void OpenSearchEngineDialog(bool randomize); views::Label* welcome_label_; views::Label* actions_label_; diff --git a/chrome/browser/views/first_run_view_base.cc b/chrome/browser/views/first_run_view_base.cc index 47897cf..474c569 100644 --- a/chrome/browser/views/first_run_view_base.cc +++ b/chrome/browser/views/first_run_view_base.cc @@ -34,7 +34,8 @@ FirstRunViewBase::FirstRunViewBase(Profile* profile, bool homepage_defined, int import_items, int dont_import_items, - bool search_engine_experiment) + bool search_engine_experiment, + bool randomize_search_engine_experiment) : preferred_width_(0), background_image_(NULL), separator_1_(NULL), @@ -46,7 +47,8 @@ FirstRunViewBase::FirstRunViewBase(Profile* profile, bool homepage_defined, homepage_defined_(homepage_defined), import_items_(import_items), dont_import_items_(dont_import_items), - search_engine_experiment_(search_engine_experiment) { + search_engine_experiment_(search_engine_experiment), + randomize_search_engine_experiment_(randomize_search_engine_experiment) { DCHECK(profile); SetupControls(); } diff --git a/chrome/browser/views/first_run_view_base.h b/chrome/browser/views/first_run_view_base.h index 31b57b4..9198e22 100644 --- a/chrome/browser/views/first_run_view_base.h +++ b/chrome/browser/views/first_run_view_base.h @@ -30,7 +30,8 @@ class FirstRunViewBase : public views::View, public: explicit FirstRunViewBase(Profile* profile, bool homepage_defined, int import_items, int dont_import_items, - bool search_engine_experiment); + bool search_engine_experiment, + bool randomize_search_engine_experiment); virtual ~FirstRunViewBase(); // Overridden from views::View. @@ -94,6 +95,7 @@ class FirstRunViewBase : public views::View, int import_items_; int dont_import_items_; bool search_engine_experiment_; + bool randomize_search_engine_experiment_; private: // Initializes the controls on the dialog. |