Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // This file defines specific implementation of BrowserDistribution class for | 5 // This file defines specific implementation of BrowserDistribution class for |
| 6 // Google Chrome. | 6 // Google Chrome. |
| 7 | 7 |
| 8 #include "chrome/installer/util/google_chrome_distribution.h" | 8 #include "chrome/installer/util/google_chrome_distribution.h" |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 642 // The experiment with the more compact bubble. This one is a bit special | 642 // The experiment with the more compact bubble. This one is a bit special |
| 643 // because it is split into two: CAxx is regular style bubble and CBxx is | 643 // because it is split into two: CAxx is regular style bubble and CBxx is |
| 644 // compact style bubble. See |compact_bubble| below. | 644 // compact style bubble. See |compact_bubble| below. |
| 645 {L"en-US", kBrief, 1, L'C', L'A', 2, { kEnUs3, kEnUs3, 0, 0 } }, | 645 {L"en-US", kBrief, 1, L'C', L'A', 2, { kEnUs3, kEnUs3, 0, 0 } }, |
| 646 | 646 |
| 647 // Catch-all rules. | 647 // Catch-all rules. |
| 648 {kAll, kAll, 1, L'B', L'A', 1, {kEnUs3, 0, 0, 0} }, | 648 {kAll, kAll, 1, L'B', L'A', 1, {kEnUs3, 0, 0, 0} }, |
| 649 }; | 649 }; |
| 650 | 650 |
| 651 string16 locale; | 651 string16 locale; |
| 652 GoogleUpdateSettings::GetLanguage(&locale); | |
| 653 if (locale.empty() || (locale == ASCIIToWide("en"))) | |
| 654 locale = ASCIIToWide("en-US"); | |
| 655 | |
| 652 string16 brand; | 656 string16 brand; |
| 653 | |
| 654 if (!GoogleUpdateSettings::GetLanguage(&locale)) | |
| 655 locale = ASCIIToWide("en-US"); | |
| 656 if (!GoogleUpdateSettings::GetBrand(&brand)) | 657 if (!GoogleUpdateSettings::GetBrand(&brand)) |
| 657 brand = ASCIIToWide(""); // Could still be viable for catch-all rules. | 658 brand = ASCIIToWide(""); // Could still be viable for catch-all rules. |
| 658 if (brand == kEnterprise) | 659 if (brand == kEnterprise) |
| 659 return false; | 660 return false; |
| 660 | 661 |
| 661 for (int i = 0; i < arraysize(kExperimentFlavors); ++i) { | 662 for (int i = 0; i < arraysize(kExperimentFlavors); ++i) { |
| 662 // A maximum of four flavors are supported at the moment. | 663 // A maximum of four flavors are supported at the moment. |
| 663 DCHECK_LE(kExperimentFlavors[i].flavors, kMax); | 664 CHECK_LE(kExperimentFlavors[i].flavors, kMax); |
| 664 DCHECK_GT(kExperimentFlavors[i].flavors, 0); | 665 CHECK_GT(kExperimentFlavors[i].flavors, 0); |
| 665 // Make sure each experiment has valid headings. | 666 // Make sure each experiment has valid headings. |
| 666 for (int f = 0; f < kMax; ++f) { | 667 for (int f = 0; f < kMax; ++f) { |
| 667 if (f < kExperimentFlavors[i].flavors) { | 668 if (f < kExperimentFlavors[i].flavors) { |
| 668 DCHECK_GT(kExperimentFlavors[i].headings[f], 0); | 669 CHECK_GT(kExperimentFlavors[i].headings[f], 0); |
| 669 } else { | 670 } else { |
| 670 DCHECK_EQ(kExperimentFlavors[i].headings[f], 0); | 671 CHECK_EQ(kExperimentFlavors[i].headings[f], 0); |
| 671 } | 672 } |
| 672 } | 673 } |
| 673 // Make sure we don't overflow on the second letter of the experiment code. | 674 // The prefix has to be a valid two letter combo. |
| 674 DCHECK(kExperimentFlavors[i].prefix2 + | 675 CHECK(kExperimentFlavors[i].prefix1 >= 'A'); |
| 675 kExperimentFlavors[i].flavors - 1 <= 'Z'); | 676 CHECK(kExperimentFlavors[i].prefix2 >= 'A'); |
| 677 CHECK(kExperimentFlavors[i].prefix2 + | |
| 678 kExperimentFlavors[i].flavors - 1 <= 'Z'); | |
| 676 | 679 |
| 677 if (kExperimentFlavors[i].locale != locale && | 680 if (kExperimentFlavors[i].locale != locale && |
| 678 kExperimentFlavors[i].locale != ASCIIToWide("*")) | 681 kExperimentFlavors[i].locale != ASCIIToWide("*")) |
| 679 continue; | 682 continue; |
| 680 | 683 |
| 681 std::vector<string16> brand_codes; | 684 std::vector<string16> brand_codes; |
| 682 base::SplitString(kExperimentFlavors[i].brands, L',', &brand_codes); | 685 base::SplitString(kExperimentFlavors[i].brands, L',', &brand_codes); |
| 683 if (brand_codes.empty()) | 686 if (brand_codes.empty()) |
| 684 return false; | 687 return false; |
| 685 for (std::vector<string16>::iterator it = brand_codes.begin(); | 688 for (std::vector<string16>::iterator it = brand_codes.begin(); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 744 return; | 747 return; |
| 745 } | 748 } |
| 746 int flavor = experiment.flavor; | 749 int flavor = experiment.flavor; |
| 747 string16 base_group = experiment.prefix; | 750 string16 base_group = experiment.prefix; |
| 748 | 751 |
| 749 string16 brand; | 752 string16 brand; |
| 750 if (GoogleUpdateSettings::GetBrand(&brand) && (brand == L"CHXX")) { | 753 if (GoogleUpdateSettings::GetBrand(&brand) && (brand == L"CHXX")) { |
| 751 // Testing only: the user automatically qualifies for the experiment. | 754 // Testing only: the user automatically qualifies for the experiment. |
| 752 VLOG(1) << "Experiment qualification bypass"; | 755 VLOG(1) << "Experiment qualification bypass"; |
| 753 } else { | 756 } else { |
| 757 // Check that the user was not already drafted in this experiment. | |
| 758 string16 client; | |
| 759 GoogleUpdateSettings::GetClient(&client); | |
| 760 if (client.size() > 2) { | |
| 761 if (base_group == client.substr(0, 2)) { | |
|
Finnur
2012/07/25 10:51:10
nit: Probably more readable to combine these into
| |
| 762 VLOG(1) << "User already participated in this experiment"; | |
| 763 return; | |
|
Finnur
2012/07/25 10:51:10
Are you intentionally setting no results for Omaha
| |
| 764 } | |
| 765 } | |
| 754 // Check browser usage inactivity by the age of the last-write time of the | 766 // Check browser usage inactivity by the age of the last-write time of the |
| 755 // chrome user data directory. | 767 // chrome user data directory. |
| 756 FilePath user_data_dir(product.GetUserDataPath()); | 768 FilePath user_data_dir(product.GetUserDataPath()); |
| 757 | 769 |
| 758 const bool experiment_enabled = false; | 770 const bool experiment_enabled = false; |
| 759 const int kThirtyDays = 30 * 24; | 771 const int kThirtyDays = 30 * 24; |
| 760 | 772 |
| 761 int dir_age_hours = GetDirectoryWriteAgeInHours( | 773 int dir_age_hours = GetDirectoryWriteAgeInHours( |
| 762 user_data_dir.value().c_str()); | 774 user_data_dir.value().c_str()); |
| 763 if (!experiment_enabled) { | 775 if (!experiment_enabled) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 850 // we waited for chrome to exit so the uninstall would not detect chrome | 862 // we waited for chrome to exit so the uninstall would not detect chrome |
| 851 // running. | 863 // running. |
| 852 bool system_level_toast = CommandLine::ForCurrentProcess()->HasSwitch( | 864 bool system_level_toast = CommandLine::ForCurrentProcess()->HasSwitch( |
| 853 installer::switches::kSystemLevelToast); | 865 installer::switches::kSystemLevelToast); |
| 854 | 866 |
| 855 CommandLine cmd(InstallUtil::GetChromeUninstallCmd(system_level_toast, | 867 CommandLine cmd(InstallUtil::GetChromeUninstallCmd(system_level_toast, |
| 856 GetType())); | 868 GetType())); |
| 857 base::LaunchProcess(cmd, base::LaunchOptions(), NULL); | 869 base::LaunchProcess(cmd, base::LaunchOptions(), NULL); |
| 858 } | 870 } |
| 859 #endif | 871 #endif |
| OLD | NEW |