| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "chrome/browser/labs.h" | 5 #include "chrome/browser/about_flags.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "app/l10n_util.h" | 12 #include "app/l10n_util.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/prefs/pref_service.h" | 15 #include "chrome/browser/prefs/pref_service.h" |
| 16 #include "chrome/common/chrome_switches.h" | 16 #include "chrome/common/chrome_switches.h" |
| 17 #include "chrome/common/pref_names.h" | 17 #include "chrome/common/pref_names.h" |
| 18 #include "grit/generated_resources.h" | 18 #include "grit/generated_resources.h" |
| 19 | 19 |
| 20 namespace about_labs { | 20 namespace about_flags { |
| 21 | 21 |
| 22 enum { kOsMac = 1 << 0, kOsWin = 1 << 1, kOsLinux = 1 << 2 }; | 22 enum { kOsMac = 1 << 0, kOsWin = 1 << 1, kOsLinux = 1 << 2 }; |
| 23 | 23 |
| 24 unsigned kOsAll = kOsMac | kOsWin | kOsLinux; | 24 unsigned kOsAll = kOsMac | kOsWin | kOsLinux; |
| 25 | 25 |
| 26 struct Experiment { | 26 struct Experiment { |
| 27 // The internal name of the experiment. This is never shown to the user. | 27 // The internal name of the experiment. This is never shown to the user. |
| 28 // It _is_ however stored in the prefs file, so you shouldn't change the | 28 // It _is_ however stored in the prefs file, so you shouldn't change the |
| 29 // name of existing labs. | 29 // name of existing flags. |
| 30 const char* internal_name; | 30 const char* internal_name; |
| 31 | 31 |
| 32 // String id of the message containing the experiment's name. | 32 // String id of the message containing the experiment's name. |
| 33 int visible_name_id; | 33 int visible_name_id; |
| 34 | 34 |
| 35 // String id of the message containing the experiment's description. | 35 // String id of the message containing the experiment's description. |
| 36 int visible_description_id; | 36 int visible_description_id; |
| 37 | 37 |
| 38 // The platforms the experiment is available on | 38 // The platforms the experiment is available on |
| 39 // Needs to be more than a compile-time #ifdef because of profile sync. | 39 // Needs to be more than a compile-time #ifdef because of profile sync. |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 #endif | 124 #endif |
| 125 switches::kEnableCloudPrintProxy | 125 switches::kEnableCloudPrintProxy |
| 126 }, | 126 }, |
| 127 { | 127 { |
| 128 "match-preview", // Do not change; see above. | 128 "match-preview", // Do not change; see above. |
| 129 IDS_FLAGS_INSTANT_NAME, | 129 IDS_FLAGS_INSTANT_NAME, |
| 130 IDS_FLAGS_INSTANT_DESCRIPTION, | 130 IDS_FLAGS_INSTANT_DESCRIPTION, |
| 131 kOsMac, | 131 kOsMac, |
| 132 switches::kEnableMatchPreview | 132 switches::kEnableMatchPreview |
| 133 }, | 133 }, |
| 134 // FIXME(scheib): Add Labs entry for accelerated Compositing, | 134 // FIXME(scheib): Add Flags entry for accelerated Compositing, |
| 135 // or pull it and the strings in generated_resources.grd by Dec 2010 | 135 // or pull it and the strings in generated_resources.grd by Dec 2010 |
| 136 //{ | 136 //{ |
| 137 // "gpu-compositing", // Do not change; see above | 137 // "gpu-compositing", // Do not change; see above |
| 138 // IDS_FLAGS_ACCELERATED_COMPOSITING_NAME, | 138 // IDS_FLAGS_ACCELERATED_COMPOSITING_NAME, |
| 139 // IDS_FLAGS_ACCELERATED_COMPOSITING_DESCRIPTION, | 139 // IDS_FLAGS_ACCELERATED_COMPOSITING_DESCRIPTION, |
| 140 // kOsAll, | 140 // kOsAll, |
| 141 // switches::kDisableAcceleratedCompositing | 141 // switches::kDisableAcceleratedCompositing |
| 142 //}, | 142 //}, |
| 143 { | 143 { |
| 144 "gpu-canvas-2d", // Do not change; see above | 144 "gpu-canvas-2d", // Do not change; see above |
| 145 IDS_FLAGS_ACCELERATED_CANVAS_2D_NAME, | 145 IDS_FLAGS_ACCELERATED_CANVAS_2D_NAME, |
| 146 IDS_FLAGS_ACCELERATED_CANVAS_2D_DESCRIPTION, | 146 IDS_FLAGS_ACCELERATED_CANVAS_2D_DESCRIPTION, |
| 147 kOsWin | kOsLinux, | 147 kOsWin | kOsLinux, |
| 148 switches::kEnableAccelerated2dCanvas | 148 switches::kEnableAccelerated2dCanvas |
| 149 }, | 149 }, |
| 150 // FIXME(scheib): Add Labs entry for WebGL, | 150 // FIXME(scheib): Add Flags entry for WebGL, |
| 151 // or pull it and the strings in generated_resources.grd by Dec 2010 | 151 // or pull it and the strings in generated_resources.grd by Dec 2010 |
| 152 //{ | 152 //{ |
| 153 // "webgl", // Do not change; see above | 153 // "webgl", // Do not change; see above |
| 154 // IDS_FLAGS_WEBGL_NAME, | 154 // IDS_FLAGS_WEBGL_NAME, |
| 155 // IDS_FLAGS_WEBGL_DESCRIPTION, | 155 // IDS_FLAGS_WEBGL_DESCRIPTION, |
| 156 // kOsAll, | 156 // kOsAll, |
| 157 // switches::kDisableExperimentalWebGL | 157 // switches::kDisableExperimentalWebGL |
| 158 //} | 158 //} |
| 159 { | 159 { |
| 160 "print-preview", // Do not change; see above | 160 "print-preview", // Do not change; see above |
| 161 IDS_FLAGS_PRINT_PREVIEW_NAME, | 161 IDS_FLAGS_PRINT_PREVIEW_NAME, |
| 162 IDS_FLAGS_PRINT_PREVIEW_DESCRIPTION, | 162 IDS_FLAGS_PRINT_PREVIEW_DESCRIPTION, |
| 163 kOsAll, | 163 kOsAll, |
| 164 switches::kEnablePrintPreview | 164 switches::kEnablePrintPreview |
| 165 } | 165 } |
| 166 }; | 166 }; |
| 167 | 167 |
| 168 // Extracts the list of enabled lab experiments from preferences and stores them | 168 // Extracts the list of enabled lab experiments from preferences and stores them |
| 169 // in a set. | 169 // in a set. |
| 170 void GetEnabledLabs(const PrefService* prefs, std::set<std::string>* result) { | 170 void GetEnabledFlags(const PrefService* prefs, std::set<std::string>* result) { |
| 171 const ListValue* enabled_experiments = prefs->GetList( | 171 const ListValue* enabled_experiments = prefs->GetList( |
| 172 prefs::kEnabledLabsExperiments); | 172 prefs::kEnabledLabsExperiments); |
| 173 if (!enabled_experiments) | 173 if (!enabled_experiments) |
| 174 return; | 174 return; |
| 175 | 175 |
| 176 for (ListValue::const_iterator it = enabled_experiments->begin(); | 176 for (ListValue::const_iterator it = enabled_experiments->begin(); |
| 177 it != enabled_experiments->end(); | 177 it != enabled_experiments->end(); |
| 178 ++it) { | 178 ++it) { |
| 179 std::string experiment_name; | 179 std::string experiment_name; |
| 180 if (!(*it)->GetAsString(&experiment_name)) { | 180 if (!(*it)->GetAsString(&experiment_name)) { |
| 181 LOG(WARNING) << "Invalid entry in " << prefs::kEnabledLabsExperiments; | 181 LOG(WARNING) << "Invalid entry in " << prefs::kEnabledLabsExperiments; |
| 182 continue; | 182 continue; |
| 183 } | 183 } |
| 184 result->insert(experiment_name); | 184 result->insert(experiment_name); |
| 185 } | 185 } |
| 186 } | 186 } |
| 187 | 187 |
| 188 // Takes a set of enabled lab experiments | 188 // Takes a set of enabled lab experiments |
| 189 void SetEnabledLabs( | 189 void SetEnabledFlags( |
| 190 PrefService* prefs, const std::set<std::string>& enabled_experiments) { | 190 PrefService* prefs, const std::set<std::string>& enabled_experiments) { |
| 191 ListValue* experiments_list = prefs->GetMutableList( | 191 ListValue* experiments_list = prefs->GetMutableList( |
| 192 prefs::kEnabledLabsExperiments); | 192 prefs::kEnabledLabsExperiments); |
| 193 if (!experiments_list) | 193 if (!experiments_list) |
| 194 return; | 194 return; |
| 195 | 195 |
| 196 experiments_list->Clear(); | 196 experiments_list->Clear(); |
| 197 for (std::set<std::string>::const_iterator it = enabled_experiments.begin(); | 197 for (std::set<std::string>::const_iterator it = enabled_experiments.begin(); |
| 198 it != enabled_experiments.end(); | 198 it != enabled_experiments.end(); |
| 199 ++it) { | 199 ++it) { |
| 200 experiments_list->Append(new StringValue(*it)); | 200 experiments_list->Append(new StringValue(*it)); |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 | 203 |
| 204 // Removes all experiments from prefs::kEnabledLabsExperiments that are | 204 // Removes all experiments from prefs::kEnabledLabsExperiments that are |
| 205 // unknown, to prevent this list to become very long as experiments are added | 205 // unknown, to prevent this list to become very long as experiments are added |
| 206 // and removed. | 206 // and removed. |
| 207 void SanitizeList(PrefService* prefs) { | 207 void SanitizeList(PrefService* prefs) { |
| 208 std::set<std::string> known_experiments; | 208 std::set<std::string> known_experiments; |
| 209 for (size_t i = 0; i < arraysize(kExperiments); ++i) | 209 for (size_t i = 0; i < arraysize(kExperiments); ++i) |
| 210 known_experiments.insert(kExperiments[i].internal_name); | 210 known_experiments.insert(kExperiments[i].internal_name); |
| 211 | 211 |
| 212 std::set<std::string> enabled_experiments; | 212 std::set<std::string> enabled_experiments; |
| 213 GetEnabledLabs(prefs, &enabled_experiments); | 213 GetEnabledFlags(prefs, &enabled_experiments); |
| 214 | 214 |
| 215 std::set<std::string> new_enabled_experiments; | 215 std::set<std::string> new_enabled_experiments; |
| 216 std::set_intersection( | 216 std::set_intersection( |
| 217 known_experiments.begin(), known_experiments.end(), | 217 known_experiments.begin(), known_experiments.end(), |
| 218 enabled_experiments.begin(), enabled_experiments.end(), | 218 enabled_experiments.begin(), enabled_experiments.end(), |
| 219 std::inserter(new_enabled_experiments, new_enabled_experiments.begin())); | 219 std::inserter(new_enabled_experiments, new_enabled_experiments.begin())); |
| 220 | 220 |
| 221 SetEnabledLabs(prefs, new_enabled_experiments); | 221 SetEnabledFlags(prefs, new_enabled_experiments); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void GetSanitizedEnabledLabs( | 224 void GetSanitizedEnabledFlags( |
| 225 PrefService* prefs, std::set<std::string>* result) { | 225 PrefService* prefs, std::set<std::string>* result) { |
| 226 SanitizeList(prefs); | 226 SanitizeList(prefs); |
| 227 GetEnabledLabs(prefs, result); | 227 GetEnabledFlags(prefs, result); |
| 228 } | 228 } |
| 229 | 229 |
| 230 int GetCurrentPlatform() { | 230 int GetCurrentPlatform() { |
| 231 #if defined(OS_MACOSX) | 231 #if defined(OS_MACOSX) |
| 232 return kOsMac; | 232 return kOsMac; |
| 233 #elif defined(OS_WIN) | 233 #elif defined(OS_WIN) |
| 234 return kOsWin; | 234 return kOsWin; |
| 235 #elif defined(OS_LINUX) | 235 #elif defined(OS_LINUX) |
| 236 return kOsLinux; | 236 return kOsLinux; |
| 237 #else | 237 #else |
| 238 #error Unknown platform | 238 #error Unknown platform |
| 239 #endif | 239 #endif |
| 240 } | 240 } |
| 241 | 241 |
| 242 bool IsEnabled() { | 242 bool IsEnabled() { |
| 243 #if defined(OS_CHROMEOS) | 243 #if defined(OS_CHROMEOS) |
| 244 // ChromeOS uses a different mechanism for about:labs; integrated with their | 244 // TODO(thakis): Port about:flags to chromeos -- http://crbug.com/57634 |
| 245 // dom ui options. | |
| 246 // TODO(thakis): Port about:labs to chromeos -- http://crbug.com/57634 | |
| 247 return false; | 245 return false; |
| 248 #else | 246 #else |
| 249 return true; | 247 return true; |
| 250 #endif | 248 #endif |
| 251 } | 249 } |
| 252 | 250 |
| 253 void ConvertLabsToSwitches(PrefService* prefs, CommandLine* command_line) { | 251 void ConvertFlagsToSwitches(PrefService* prefs, CommandLine* command_line) { |
| 254 if (!IsEnabled()) | 252 if (!IsEnabled()) |
| 255 return; | 253 return; |
| 256 | 254 |
| 257 if (command_line->HasSwitch(switches::kNoLabs)) | 255 if (command_line->HasSwitch(switches::kNoExperiments)) |
| 258 return; | 256 return; |
| 259 | 257 |
| 260 std::set<std::string> enabled_experiments; | 258 std::set<std::string> enabled_experiments; |
| 261 GetSanitizedEnabledLabs(prefs, &enabled_experiments); | 259 GetSanitizedEnabledFlags(prefs, &enabled_experiments); |
| 262 | 260 |
| 263 std::map<std::string, const Experiment*> experiments; | 261 std::map<std::string, const Experiment*> experiments; |
| 264 for (size_t i = 0; i < arraysize(kExperiments); ++i) | 262 for (size_t i = 0; i < arraysize(kExperiments); ++i) |
| 265 experiments[kExperiments[i].internal_name] = &kExperiments[i]; | 263 experiments[kExperiments[i].internal_name] = &kExperiments[i]; |
| 266 | 264 |
| 267 for (std::set<std::string>::iterator it = enabled_experiments.begin(); | 265 for (std::set<std::string>::iterator it = enabled_experiments.begin(); |
| 268 it != enabled_experiments.end(); | 266 it != enabled_experiments.end(); |
| 269 ++it) { | 267 ++it) { |
| 270 const std::string& experiment_name = *it; | 268 const std::string& experiment_name = *it; |
| 271 std::map<std::string, const Experiment*>::iterator experiment = | 269 std::map<std::string, const Experiment*>::iterator experiment = |
| 272 experiments.find(experiment_name); | 270 experiments.find(experiment_name); |
| 273 DCHECK(experiment != experiments.end()); | 271 DCHECK(experiment != experiments.end()); |
| 274 if (experiment == experiments.end()) | 272 if (experiment == experiments.end()) |
| 275 continue; | 273 continue; |
| 276 | 274 |
| 277 command_line->AppendSwitch(experiment->second->command_line); | 275 command_line->AppendSwitch(experiment->second->command_line); |
| 278 } | 276 } |
| 279 } | 277 } |
| 280 | 278 |
| 281 ListValue* GetLabsExperimentsData(PrefService* prefs) { | 279 ListValue* GetFlagsExperimentsData(PrefService* prefs) { |
| 282 std::set<std::string> enabled_experiments; | 280 std::set<std::string> enabled_experiments; |
| 283 GetSanitizedEnabledLabs(prefs, &enabled_experiments); | 281 GetSanitizedEnabledFlags(prefs, &enabled_experiments); |
| 284 | 282 |
| 285 int current_platform = GetCurrentPlatform(); | 283 int current_platform = GetCurrentPlatform(); |
| 286 | 284 |
| 287 ListValue* experiments_data = new ListValue(); | 285 ListValue* experiments_data = new ListValue(); |
| 288 for (size_t i = 0; i < arraysize(kExperiments); ++i) { | 286 for (size_t i = 0; i < arraysize(kExperiments); ++i) { |
| 289 const Experiment& experiment = kExperiments[i]; | 287 const Experiment& experiment = kExperiments[i]; |
| 290 if (!(experiment.supported_platforms & current_platform)) | 288 if (!(experiment.supported_platforms & current_platform)) |
| 291 continue; | 289 continue; |
| 292 | 290 |
| 293 DictionaryValue* data = new DictionaryValue(); | 291 DictionaryValue* data = new DictionaryValue(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 309 | 307 |
| 310 bool IsRestartNeededToCommitChanges() { | 308 bool IsRestartNeededToCommitChanges() { |
| 311 return needs_restart_; | 309 return needs_restart_; |
| 312 } | 310 } |
| 313 | 311 |
| 314 void SetExperimentEnabled( | 312 void SetExperimentEnabled( |
| 315 PrefService* prefs, const std::string& internal_name, bool enable) { | 313 PrefService* prefs, const std::string& internal_name, bool enable) { |
| 316 needs_restart_ = true; | 314 needs_restart_ = true; |
| 317 | 315 |
| 318 std::set<std::string> enabled_experiments; | 316 std::set<std::string> enabled_experiments; |
| 319 GetSanitizedEnabledLabs(prefs, &enabled_experiments); | 317 GetSanitizedEnabledFlags(prefs, &enabled_experiments); |
| 320 | 318 |
| 321 if (enable) | 319 if (enable) |
| 322 enabled_experiments.insert(internal_name); | 320 enabled_experiments.insert(internal_name); |
| 323 else | 321 else |
| 324 enabled_experiments.erase(internal_name); | 322 enabled_experiments.erase(internal_name); |
| 325 | 323 |
| 326 SetEnabledLabs(prefs, enabled_experiments); | 324 SetEnabledFlags(prefs, enabled_experiments); |
| 327 } | 325 } |
| 328 | 326 |
| 329 } // namespace Labs | 327 } // namespace about_flags |
| OLD | NEW |