Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: chrome/browser/about_flags.cc

Issue 1413633003: Consolidate some about flags code into FlagsState class. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "chrome/browser/about_flags.h" 5 #include "chrome/browser/about_flags.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 2108 matching lines...) Expand 10 before | Expand all | Expand 10 after
2119 {"enable-ppapi-win32k-lockdown", 2119 {"enable-ppapi-win32k-lockdown",
2120 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_NAME, 2120 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_NAME,
2121 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_DESCRIPTION, kOsWin, 2121 IDS_FLAGS_PPAPI_WIN32K_LOCKDOWN_DESCRIPTION, kOsWin,
2122 MULTI_VALUE_TYPE(kPpapiWin32kLockdown)}, 2122 MULTI_VALUE_TYPE(kPpapiWin32kLockdown)},
2123 #endif // defined(OS_WIN) 2123 #endif // defined(OS_WIN)
2124 // NOTE: Adding new command-line switches requires adding corresponding 2124 // NOTE: Adding new command-line switches requires adding corresponding
2125 // entries to enum "LoginCustomFlags" in histograms.xml. See note in 2125 // entries to enum "LoginCustomFlags" in histograms.xml. See note in
2126 // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test. 2126 // histograms.xml and don't forget to run AboutFlagsHistogramTest unit test.
2127 }; 2127 };
2128 2128
2129 const FeatureEntry* g_entries = kFeatureEntries;
2130 size_t g_num_entries = arraysize(kFeatureEntries);
2131
2132 // Stores and encapsulates the little state that about:flags has. 2129 // Stores and encapsulates the little state that about:flags has.
2133 class FlagsState { 2130 class FlagsState {
2134 public: 2131 public:
2135 FlagsState() : needs_restart_(false) {} 2132 FlagsState()
2133 : feature_entries(kFeatureEntries),
2134 num_feature_entries(arraysize(kFeatureEntries)),
2135 needs_restart_(false) {}
2136 void ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage, 2136 void ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage,
2137 base::CommandLine* command_line, 2137 base::CommandLine* command_line,
2138 SentinelsMode sentinels); 2138 SentinelsMode sentinels);
2139 bool IsRestartNeededToCommitChanges(); 2139 bool IsRestartNeededToCommitChanges();
2140 void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage, 2140 void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage,
2141 const std::string& internal_name, 2141 const std::string& internal_name,
2142 bool enable); 2142 bool enable);
2143 void RemoveFlagsSwitches( 2143 void RemoveFlagsSwitches(
2144 std::map<std::string, base::CommandLine::StringType>* switch_list); 2144 std::map<std::string, base::CommandLine::StringType>* switch_list);
2145 void ResetAllFlags(flags_ui::FlagsStorage* flags_storage); 2145 void ResetAllFlags(flags_ui::FlagsStorage* flags_storage);
2146 void reset(); 2146 void Reset();
2147
2148 // Gets the list of feature entries. Entries that are available for the
2149 // current platform are appended to |supported_entries|; all other entries are
2150 // appended to |unsupported_entries|.
2151 void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage,
2152 FlagAccess access,
2153 base::ListValue* supported_entries,
2154 base::ListValue* unsupported_entries);
2155
2156 void SetFeatureEntries(const FeatureEntry* entries, size_t count);
2157 const FeatureEntry* GetFeatureEntries(size_t* count);
2147 2158
2148 // Returns the singleton instance of this class 2159 // Returns the singleton instance of this class
2149 static FlagsState* GetInstance() { 2160 static FlagsState* GetInstance() {
2150 return base::Singleton<FlagsState>::get(); 2161 return base::Singleton<FlagsState>::get();
2151 } 2162 }
2152 2163
2153 private: 2164 private:
2165 // Removes all entries from prefs::kEnabledLabsExperiments that are unknown,
2166 // to prevent this list to become very long as entries are added and removed.
2167 void SanitizeList(flags_ui::FlagsStorage* flags_storage);
2168
2169 void GetSanitizedEnabledFlags(flags_ui::FlagsStorage* flags_storage,
2170 std::set<std::string>* result);
2171
2172 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't
2173 // enabled on the current platform.
2174 void GetSanitizedEnabledFlagsForCurrentPlatform(
2175 flags_ui::FlagsStorage* flags_storage,
2176 std::set<std::string>* result);
2177
2178 const FeatureEntry* feature_entries;
2179 size_t num_feature_entries;
2180
2154 bool needs_restart_; 2181 bool needs_restart_;
2155 std::map<std::string, std::string> flags_switches_; 2182 std::map<std::string, std::string> flags_switches_;
2156 2183
2157 DISALLOW_COPY_AND_ASSIGN(FlagsState); 2184 DISALLOW_COPY_AND_ASSIGN(FlagsState);
2158 }; 2185 };
2159 2186
2160 // Adds the internal names for the specified entry to |names|. 2187 // Adds the internal names for the specified entry to |names|.
2161 void AddInternalName(const FeatureEntry& e, std::set<std::string>* names) { 2188 void AddInternalName(const FeatureEntry& e, std::set<std::string>* names) {
2162 if (e.type == FeatureEntry::SINGLE_VALUE || 2189 if (e.type == FeatureEntry::SINGLE_VALUE ||
2163 e.type == FeatureEntry::SINGLE_DISABLE_VALUE) { 2190 e.type == FeatureEntry::SINGLE_DISABLE_VALUE) {
(...skipping 28 matching lines...) Expand all
2192 DCHECK(e.command_line_value); 2219 DCHECK(e.command_line_value);
2193 DCHECK(e.disable_command_line_switch); 2220 DCHECK(e.disable_command_line_switch);
2194 DCHECK(e.disable_command_line_value); 2221 DCHECK(e.disable_command_line_value);
2195 break; 2222 break;
2196 default: 2223 default:
2197 NOTREACHED(); 2224 NOTREACHED();
2198 } 2225 }
2199 return true; 2226 return true;
2200 } 2227 }
2201 2228
2202 // Removes all entries from prefs::kEnabledLabsExperiments that are 2229 void FlagsState::SanitizeList(flags_ui::FlagsStorage* flags_storage) {
2203 // unknown, to prevent this list to become very long as entries are added
2204 // and removed.
2205 void SanitizeList(flags_ui::FlagsStorage* flags_storage) {
2206 std::set<std::string> known_entries; 2230 std::set<std::string> known_entries;
2207 for (size_t i = 0; i < g_num_entries; ++i) { 2231 for (size_t i = 0; i < num_feature_entries; ++i) {
2208 DCHECK(ValidateFeatureEntry(g_entries[i])); 2232 DCHECK(ValidateFeatureEntry(feature_entries[i]));
2209 AddInternalName(g_entries[i], &known_entries); 2233 AddInternalName(feature_entries[i], &known_entries);
2210 } 2234 }
2211 2235
2212 std::set<std::string> enabled_entries = flags_storage->GetFlags(); 2236 std::set<std::string> enabled_entries = flags_storage->GetFlags();
2213 2237
2214 std::set<std::string> new_enabled_entries = 2238 std::set<std::string> new_enabled_entries =
2215 base::STLSetIntersection<std::set<std::string> >( 2239 base::STLSetIntersection<std::set<std::string> >(
2216 known_entries, enabled_entries); 2240 known_entries, enabled_entries);
2217 2241
2218 if (new_enabled_entries != enabled_entries) 2242 if (new_enabled_entries != enabled_entries)
2219 flags_storage->SetFlags(new_enabled_entries); 2243 flags_storage->SetFlags(new_enabled_entries);
2220 } 2244 }
2221 2245
2222 void GetSanitizedEnabledFlags(flags_ui::FlagsStorage* flags_storage, 2246 void FlagsState::GetSanitizedEnabledFlags(flags_ui::FlagsStorage* flags_storage,
2223 std::set<std::string>* result) { 2247 std::set<std::string>* result) {
2224 SanitizeList(flags_storage); 2248 SanitizeList(flags_storage);
2225 *result = flags_storage->GetFlags(); 2249 *result = flags_storage->GetFlags();
2226 } 2250 }
2227 2251
2228 bool SkipConditionalFeatureEntry(const FeatureEntry& entry) { 2252 bool SkipConditionalFeatureEntry(const FeatureEntry& entry) {
2229 version_info::Channel channel = chrome::GetChannel(); 2253 version_info::Channel channel = chrome::GetChannel();
2230 2254
2231 #if defined(OS_ANDROID) 2255 #if defined(OS_ANDROID)
2232 // enable-data-reduction-proxy-dev is only available for the Dev/Beta channel. 2256 // enable-data-reduction-proxy-dev is only available for the Dev/Beta channel.
2233 if (!strcmp("enable-data-reduction-proxy-dev", entry.internal_name) && 2257 if (!strcmp("enable-data-reduction-proxy-dev", entry.internal_name) &&
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2279 channel != version_info::Channel::UNKNOWN && 2303 channel != version_info::Channel::UNKNOWN &&
2280 channel != version_info::Channel::CANARY && 2304 channel != version_info::Channel::CANARY &&
2281 channel != version_info::Channel::DEV) { 2305 channel != version_info::Channel::DEV) {
2282 return true; 2306 return true;
2283 } 2307 }
2284 #endif 2308 #endif
2285 2309
2286 return false; 2310 return false;
2287 } 2311 }
2288 2312
2289 2313 void FlagsState::GetSanitizedEnabledFlagsForCurrentPlatform(
2290 // Variant of GetSanitizedEnabledFlags that also removes any flags that aren't
2291 // enabled on the current platform.
2292 void GetSanitizedEnabledFlagsForCurrentPlatform(
2293 flags_ui::FlagsStorage* flags_storage, 2314 flags_ui::FlagsStorage* flags_storage,
2294 std::set<std::string>* result) { 2315 std::set<std::string>* result) {
2295 GetSanitizedEnabledFlags(flags_storage, result); 2316 GetSanitizedEnabledFlags(flags_storage, result);
2296 2317
2297 // Filter out any entries that aren't enabled on the current platform. We 2318 // Filter out any entries that aren't enabled on the current platform. We
2298 // don't remove these from prefs else syncing to a platform with a different 2319 // don't remove these from prefs else syncing to a platform with a different
2299 // set of entries would be lossy. 2320 // set of entries would be lossy.
2300 std::set<std::string> platform_entries; 2321 std::set<std::string> platform_entries;
2301 int current_platform = GetCurrentPlatform(); 2322 int current_platform = GetCurrentPlatform();
2302 for (size_t i = 0; i < g_num_entries; ++i) { 2323 for (size_t i = 0; i < num_feature_entries; ++i) {
2303 const FeatureEntry& entry = g_entries[i]; 2324 const FeatureEntry& entry = feature_entries[i];
2304 if (entry.supported_platforms & current_platform) 2325 if (entry.supported_platforms & current_platform)
2305 AddInternalName(entry, &platform_entries); 2326 AddInternalName(entry, &platform_entries);
2306 #if defined(OS_CHROMEOS) 2327 #if defined(OS_CHROMEOS)
2307 if (g_entries[i].supported_platforms & kOsCrOSOwnerOnly) 2328 if (feature_entries[i].supported_platforms & kOsCrOSOwnerOnly)
2308 AddInternalName(entry, &platform_entries); 2329 AddInternalName(entry, &platform_entries);
2309 #endif 2330 #endif
2310 } 2331 }
2311 2332
2312 std::set<std::string> new_enabled_entries = 2333 std::set<std::string> new_enabled_entries =
2313 base::STLSetIntersection<std::set<std::string> >( 2334 base::STLSetIntersection<std::set<std::string> >(
2314 platform_entries, *result); 2335 platform_entries, *result);
2315 2336
2316 result->swap(new_enabled_entries); 2337 result->swap(new_enabled_entries);
2317 } 2338 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
2412 new_flags.begin(), 2433 new_flags.begin(),
2413 new_flags.end(), 2434 new_flags.end(),
2414 active_flags.begin(), 2435 active_flags.begin(),
2415 active_flags.end(), 2436 active_flags.end(),
2416 std::inserter(*out_difference, out_difference->begin())); 2437 std::inserter(*out_difference, out_difference->begin()));
2417 } 2438 }
2418 2439
2419 return result; 2440 return result;
2420 } 2441 }
2421 2442
2422 void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage, 2443 void FlagsState::GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage,
2423 FlagAccess access, 2444 FlagAccess access,
2424 base::ListValue* supported_entries, 2445 base::ListValue* supported_entries,
2425 base::ListValue* unsupported_entries) { 2446 base::ListValue* unsupported_entries) {
2426 std::set<std::string> enabled_entries; 2447 std::set<std::string> enabled_entries;
2427 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); 2448 GetSanitizedEnabledFlags(flags_storage, &enabled_entries);
2428 2449
2429 int current_platform = GetCurrentPlatform(); 2450 int current_platform = GetCurrentPlatform();
2430 2451
2431 for (size_t i = 0; i < g_num_entries; ++i) { 2452 for (size_t i = 0; i < num_feature_entries; ++i) {
2432 const FeatureEntry& entry = g_entries[i]; 2453 const FeatureEntry& entry = feature_entries[i];
2433 if (SkipConditionalFeatureEntry(entry)) 2454 if (SkipConditionalFeatureEntry(entry))
2434 continue; 2455 continue;
2435 2456
2436 base::DictionaryValue* data = new base::DictionaryValue(); 2457 base::DictionaryValue* data = new base::DictionaryValue();
2437 data->SetString("internal_name", entry.internal_name); 2458 data->SetString("internal_name", entry.internal_name);
2438 data->SetString("name", 2459 data->SetString("name",
2439 l10n_util::GetStringUTF16(entry.visible_name_id)); 2460 l10n_util::GetStringUTF16(entry.visible_name_id));
2440 data->SetString("description", 2461 data->SetString("description",
2441 l10n_util::GetStringUTF16( 2462 l10n_util::GetStringUTF16(
2442 entry.visible_description_id)); 2463 entry.visible_description_id));
(...skipping 30 matching lines...) Expand all
2473 supported = true; 2494 supported = true;
2474 } 2495 }
2475 #endif 2496 #endif
2476 if (supported) 2497 if (supported)
2477 supported_entries->Append(data); 2498 supported_entries->Append(data);
2478 else 2499 else
2479 unsupported_entries->Append(data); 2500 unsupported_entries->Append(data);
2480 } 2501 }
2481 } 2502 }
2482 2503
2504 void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage,
2505 FlagAccess access,
2506 base::ListValue* supported_entries,
2507 base::ListValue* unsupported_entries) {
2508 FlagsState::GetInstance()->GetFlagFeatureEntries(flags_storage, access,
2509 supported_entries,
2510 unsupported_entries);
2511 }
2512
2483 bool IsRestartNeededToCommitChanges() { 2513 bool IsRestartNeededToCommitChanges() {
2484 return FlagsState::GetInstance()->IsRestartNeededToCommitChanges(); 2514 return FlagsState::GetInstance()->IsRestartNeededToCommitChanges();
2485 } 2515 }
2486 2516
2487 void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage, 2517 void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage,
2488 const std::string& internal_name, 2518 const std::string& internal_name,
2489 bool enable) { 2519 bool enable) {
2490 FlagsState::GetInstance()->SetFeatureEntryEnabled(flags_storage, 2520 FlagsState::GetInstance()->SetFeatureEntryEnabled(flags_storage,
2491 internal_name, enable); 2521 internal_name, enable);
2492 } 2522 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
2583 SentinelsMode sentinels) { 2613 SentinelsMode sentinels) {
2584 if (command_line->HasSwitch(switches::kNoExperiments)) 2614 if (command_line->HasSwitch(switches::kNoExperiments))
2585 return; 2615 return;
2586 2616
2587 std::set<std::string> enabled_entries; 2617 std::set<std::string> enabled_entries;
2588 2618
2589 GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, 2619 GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage,
2590 &enabled_entries); 2620 &enabled_entries);
2591 2621
2592 NameToSwitchAndValueMap name_to_switch_map; 2622 NameToSwitchAndValueMap name_to_switch_map;
2593 for (size_t i = 0; i < g_num_entries; ++i) { 2623 for (size_t i = 0; i < num_feature_entries; ++i) {
2594 const FeatureEntry& e = g_entries[i]; 2624 const FeatureEntry& e = feature_entries[i];
2595 if (e.type == FeatureEntry::SINGLE_VALUE || 2625 if (e.type == FeatureEntry::SINGLE_VALUE ||
2596 e.type == FeatureEntry::SINGLE_DISABLE_VALUE) { 2626 e.type == FeatureEntry::SINGLE_DISABLE_VALUE) {
2597 SetFlagToSwitchMapping(e.internal_name, e.command_line_switch, 2627 SetFlagToSwitchMapping(e.internal_name, e.command_line_switch,
2598 e.command_line_value, &name_to_switch_map); 2628 e.command_line_value, &name_to_switch_map);
2599 } else if (e.type == FeatureEntry::MULTI_VALUE) { 2629 } else if (e.type == FeatureEntry::MULTI_VALUE) {
2600 for (int j = 0; j < e.num_choices; ++j) { 2630 for (int j = 0; j < e.num_choices; ++j) {
2601 SetFlagToSwitchMapping(e.NameForChoice(j), 2631 SetFlagToSwitchMapping(e.NameForChoice(j),
2602 e.choices[j].command_line_switch, 2632 e.choices[j].command_line_switch,
2603 e.choices[j].command_line_value, 2633 e.choices[j].command_line_value,
2604 &name_to_switch_map); 2634 &name_to_switch_map);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2667 needs_restart_ |= enabled_entries.insert(internal_name).second; 2697 needs_restart_ |= enabled_entries.insert(internal_name).second;
2668 flags_storage->SetFlags(enabled_entries); 2698 flags_storage->SetFlags(enabled_entries);
2669 } 2699 }
2670 return; 2700 return;
2671 } 2701 }
2672 2702
2673 std::set<std::string> enabled_entries; 2703 std::set<std::string> enabled_entries;
2674 GetSanitizedEnabledFlags(flags_storage, &enabled_entries); 2704 GetSanitizedEnabledFlags(flags_storage, &enabled_entries);
2675 2705
2676 const FeatureEntry* e = NULL; 2706 const FeatureEntry* e = NULL;
2677 for (size_t i = 0; i < g_num_entries; ++i) { 2707 for (size_t i = 0; i < num_feature_entries; ++i) {
2678 if (g_entries[i].internal_name == internal_name) { 2708 if (feature_entries[i].internal_name == internal_name) {
2679 e = g_entries + i; 2709 e = feature_entries + i;
2680 break; 2710 break;
2681 } 2711 }
2682 } 2712 }
2683 DCHECK(e); 2713 DCHECK(e);
2684 2714
2685 if (e->type == FeatureEntry::SINGLE_VALUE) { 2715 if (e->type == FeatureEntry::SINGLE_VALUE) {
2686 if (enable) 2716 if (enable)
2687 needs_restart_ |= enabled_entries.insert(internal_name).second; 2717 needs_restart_ |= enabled_entries.insert(internal_name).second;
2688 else 2718 else
2689 needs_restart_ |= (enabled_entries.erase(internal_name) > 0); 2719 needs_restart_ |= (enabled_entries.erase(internal_name) > 0);
(...skipping 30 matching lines...) Expand all
2720 switch_list->erase(entry.first); 2750 switch_list->erase(entry.first);
2721 } 2751 }
2722 2752
2723 void FlagsState::ResetAllFlags(flags_ui::FlagsStorage* flags_storage) { 2753 void FlagsState::ResetAllFlags(flags_ui::FlagsStorage* flags_storage) {
2724 needs_restart_ = true; 2754 needs_restart_ = true;
2725 2755
2726 std::set<std::string> no_entries; 2756 std::set<std::string> no_entries;
2727 flags_storage->SetFlags(no_entries); 2757 flags_storage->SetFlags(no_entries);
2728 } 2758 }
2729 2759
2730 void FlagsState::reset() { 2760 void FlagsState::Reset() {
2731 needs_restart_ = false; 2761 needs_restart_ = false;
2732 flags_switches_.clear(); 2762 flags_switches_.clear();
2733 } 2763 }
2734 2764
2765 void FlagsState::SetFeatureEntries(const FeatureEntry* entries, size_t count) {
2766 feature_entries = entries;
2767 num_feature_entries = count;
2768 }
2769
2770 const FeatureEntry* FlagsState::GetFeatureEntries(size_t* count) {
2771 *count = num_feature_entries;
2772 return feature_entries;
2773 }
2774
2735 } // namespace 2775 } // namespace
2736 2776
2737 namespace testing { 2777 namespace testing {
2738 2778
2739 // WARNING: '@' is also used in the html file. If you update this constant you 2779 // WARNING: '@' is also used in the html file. If you update this constant you
2740 // also need to update the html file. 2780 // also need to update the html file.
2741 const char kMultiSeparator[] = "@"; 2781 const char kMultiSeparator[] = "@";
2742 2782
2743 const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0; 2783 const base::HistogramBase::Sample kBadSwitchFormatHistogramId = 0;
2744 2784
2745 void ClearState() { 2785 void ClearState() {
2746 FlagsState::GetInstance()->reset(); 2786 FlagsState::GetInstance()->Reset();
2747 } 2787 }
2748 2788
2749 void SetFeatureEntries(const FeatureEntry* entries, size_t count) { 2789 void SetFeatureEntries(const FeatureEntry* entries, size_t count) {
2750 if (!entries) { 2790 if (!entries) {
2751 g_entries = kFeatureEntries; 2791 entries = kFeatureEntries;
2752 g_num_entries = arraysize(kFeatureEntries); 2792 count = arraysize(kFeatureEntries);
2753 } else {
2754 g_entries = entries;
2755 g_num_entries = count;
2756 } 2793 }
2794 FlagsState::GetInstance()->SetFeatureEntries(entries, count);
2757 } 2795 }
2758 2796
2759 const FeatureEntry* GetFeatureEntries(size_t* count) { 2797 const FeatureEntry* GetFeatureEntries(size_t* count) {
2760 *count = g_num_entries; 2798 return FlagsState::GetInstance()->GetFeatureEntries(count);
2761 return g_entries;
2762 } 2799 }
2763 2800
2764 } // namespace testing 2801 } // namespace testing
2765 2802
2766 } // namespace about_flags 2803 } // namespace about_flags
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698