OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/browser_main.h" | 5 #include "chrome/browser/browser_main.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 | 210 |
211 #if defined(TOUCH_UI) | 211 #if defined(TOUCH_UI) |
212 #include "views/touchui/touch_factory.h" | 212 #include "views/touchui/touch_factory.h" |
213 #endif | 213 #endif |
214 | 214 |
215 namespace net { | 215 namespace net { |
216 class NetLog; | 216 class NetLog; |
217 } // namespace net | 217 } // namespace net |
218 | 218 |
219 namespace { | 219 namespace { |
220 void SetSocketReusePolicy(int warmest_socket_trial_group, | |
221 const int socket_policy[], | |
222 int num_groups); | |
223 } // namespace | |
224 | |
225 // BrowserMainParts ------------------------------------------------------------ | |
226 | |
227 BrowserMainParts::BrowserMainParts(const MainFunctionParams& parameters) | |
228 : parameters_(parameters), | |
229 parsed_command_line_(parameters.command_line_) { | |
230 } | |
231 | |
232 BrowserMainParts::~BrowserMainParts() { | |
233 } | |
234 | |
235 // BrowserMainParts: |EarlyInitialization()| and related ----------------------- | |
236 | |
237 void BrowserMainParts::EarlyInitialization() { | |
238 PreEarlyInitialization(); | |
239 | |
240 if (parsed_command_line().HasSwitch(switches::kEnableBenchmarking)) | |
241 base::FieldTrial::EnableBenchmarking(); | |
242 | |
243 InitializeSSL(); | |
244 | |
245 if (parsed_command_line().HasSwitch(switches::kDisableSSLFalseStart)) | |
246 net::SSLConfigService::DisableFalseStart(); | |
247 if (parsed_command_line().HasSwitch(switches::kEnableSSLCachedInfo)) | |
248 net::SSLConfigService::EnableCachedInfo(); | |
249 if (parsed_command_line().HasSwitch(switches::kEnableOriginBoundCerts)) | |
250 net::SSLConfigService::EnableOriginBoundCerts(); | |
251 if (parsed_command_line().HasSwitch( | |
252 switches::kEnableDNSCertProvenanceChecking)) { | |
253 net::SSLConfigService::EnableDNSCertProvenanceChecking(); | |
254 } | |
255 | |
256 // TODO(abarth): Should this move to InitializeNetworkOptions? This doesn't | |
257 // seem dependent on InitializeSSL(). | |
258 if (parsed_command_line().HasSwitch(switches::kEnableTcpFastOpen)) | |
259 net::set_tcp_fastopen_enabled(true); | |
260 | |
261 PostEarlyInitialization(); | |
262 } | |
263 | |
264 // This will be called after the command-line has been mutated by about:flags | |
265 MetricsService* BrowserMainParts::SetupMetricsAndFieldTrials( | |
266 const CommandLine& parsed_command_line, | |
267 PrefService* local_state) { | |
268 // Must initialize metrics after labs have been converted into switches, | |
269 // but before field trials are set up (so that client ID is available for | |
270 // one-time randomized field trials). | |
271 MetricsService* metrics = InitializeMetrics(parsed_command_line, local_state); | |
272 | |
273 // Initialize FieldTrialList to support FieldTrials that use one-time | |
274 // randomization. The client ID will be empty if the user has not opted | |
275 // to send metrics. | |
276 field_trial_list_.reset(new base::FieldTrialList(metrics->GetClientId())); | |
277 | |
278 SetupFieldTrials(metrics->recording_active(), | |
279 local_state->IsManagedPreference( | |
280 prefs::kMaxConnectionsPerProxy)); | |
281 | |
282 // Initialize FieldTrialSynchronizer system. This is a singleton and is used | |
283 // for posting tasks via NewRunnableMethod. Its deleted when it goes out of | |
284 // scope. Even though NewRunnableMethod does AddRef and Release, the object | |
285 // will not be deleted after the Task is executed. | |
286 field_trial_synchronizer_ = new FieldTrialSynchronizer(); | |
287 | |
288 return metrics; | |
289 } | |
290 | |
291 // This is an A/B test for the maximum number of persistent connections per | |
292 // host. Currently Chrome, Firefox, and IE8 have this value set at 6. Safari | |
293 // uses 4, and Fasterfox (a plugin for Firefox that supposedly configures it to | |
294 // run faster) uses 8. We would like to see how much of an effect this value has | |
295 // on browsing. Too large a value might cause us to run into SYN flood detection | |
296 // mechanisms. | |
297 void BrowserMainParts::ConnectionFieldTrial() { | |
298 const base::FieldTrial::Probability kConnectDivisor = 100; | |
299 const base::FieldTrial::Probability kConnectProbability = 1; // 1% prob. | |
300 | |
301 // After June 30, 2011 builds, it will always be in default group. | |
302 scoped_refptr<base::FieldTrial> connect_trial( | |
303 new base::FieldTrial( | |
304 "ConnCountImpact", kConnectDivisor, "conn_count_6", 2011, 6, 30)); | |
305 | |
306 // This (6) is the current default value. Having this group declared here | |
307 // makes it straightforward to modify |kConnectProbability| such that the same | |
308 // probability value will be assigned to all the other groups, while | |
309 // preserving the remainder of the of probability space to the default value. | |
310 const int connect_6 = connect_trial->kDefaultGroupNumber; | |
311 | |
312 const int connect_5 = connect_trial->AppendGroup("conn_count_5", | |
313 kConnectProbability); | |
314 const int connect_7 = connect_trial->AppendGroup("conn_count_7", | |
315 kConnectProbability); | |
316 const int connect_8 = connect_trial->AppendGroup("conn_count_8", | |
317 kConnectProbability); | |
318 const int connect_9 = connect_trial->AppendGroup("conn_count_9", | |
319 kConnectProbability); | |
320 | |
321 const int connect_trial_group = connect_trial->group(); | |
322 | |
323 if (connect_trial_group == connect_5) { | |
324 net::ClientSocketPoolManager::set_max_sockets_per_group(5); | |
325 } else if (connect_trial_group == connect_6) { | |
326 net::ClientSocketPoolManager::set_max_sockets_per_group(6); | |
327 } else if (connect_trial_group == connect_7) { | |
328 net::ClientSocketPoolManager::set_max_sockets_per_group(7); | |
329 } else if (connect_trial_group == connect_8) { | |
330 net::ClientSocketPoolManager::set_max_sockets_per_group(8); | |
331 } else if (connect_trial_group == connect_9) { | |
332 net::ClientSocketPoolManager::set_max_sockets_per_group(9); | |
333 } else { | |
334 NOTREACHED(); | |
335 } | |
336 } | |
337 | |
338 // A/B test for determining a value for unused socket timeout. Currently the | |
339 // timeout defaults to 10 seconds. Having this value set too low won't allow us | |
340 // to take advantage of idle sockets. Setting it to too high could possibly | |
341 // result in more ERR_CONNECTION_RESETs, since some servers will kill a socket | |
342 // before we time it out. Since these are "unused" sockets, we won't retry the | |
343 // connection and instead show an error to the user. So we need to be | |
344 // conservative here. We've seen that some servers will close the socket after | |
345 // as short as 10 seconds. See http://crbug.com/84313 for more details. | |
346 void BrowserMainParts::SocketTimeoutFieldTrial() { | |
347 const base::FieldTrial::Probability kIdleSocketTimeoutDivisor = 100; | |
348 // 1% probability for all experimental settings. | |
349 const base::FieldTrial::Probability kSocketTimeoutProbability = 1; | |
350 | |
351 // After June 30, 2011 builds, it will always be in default group. | |
352 scoped_refptr<base::FieldTrial> socket_timeout_trial( | |
353 new base::FieldTrial("IdleSktToImpact", kIdleSocketTimeoutDivisor, | |
354 "idle_timeout_10", 2011, 6, 30)); | |
355 const int socket_timeout_10 = socket_timeout_trial->kDefaultGroupNumber; | |
356 | |
357 const int socket_timeout_5 = | |
358 socket_timeout_trial->AppendGroup("idle_timeout_5", | |
359 kSocketTimeoutProbability); | |
360 const int socket_timeout_20 = | |
361 socket_timeout_trial->AppendGroup("idle_timeout_20", | |
362 kSocketTimeoutProbability); | |
363 | |
364 const int idle_to_trial_group = socket_timeout_trial->group(); | |
365 | |
366 if (idle_to_trial_group == socket_timeout_5) { | |
367 net::ClientSocketPool::set_unused_idle_socket_timeout(5); | |
368 } else if (idle_to_trial_group == socket_timeout_10) { | |
369 net::ClientSocketPool::set_unused_idle_socket_timeout(10); | |
370 } else if (idle_to_trial_group == socket_timeout_20) { | |
371 net::ClientSocketPool::set_unused_idle_socket_timeout(20); | |
372 } else { | |
373 NOTREACHED(); | |
374 } | |
375 } | |
376 | |
377 void BrowserMainParts::ProxyConnectionsFieldTrial() { | |
378 const base::FieldTrial::Probability kProxyConnectionsDivisor = 100; | |
379 // 25% probability | |
380 const base::FieldTrial::Probability kProxyConnectionProbability = 1; | |
381 | |
382 // After June 30, 2011 builds, it will always be in default group. | |
383 scoped_refptr<base::FieldTrial> proxy_connection_trial( | |
384 new base::FieldTrial("ProxyConnectionImpact", kProxyConnectionsDivisor, | |
385 "proxy_connections_32", 2011, 6, 30)); | |
386 | |
387 // This (32 connections per proxy server) is the current default value. | |
388 // Declaring it here allows us to easily re-assign the probability space while | |
389 // maintaining that the default group always has the remainder of the "share", | |
390 // which allows for cleaner and quicker changes down the line if needed. | |
391 const int proxy_connections_32 = proxy_connection_trial->kDefaultGroupNumber; | |
392 | |
393 // The number of max sockets per group cannot be greater than the max number | |
394 // of sockets per proxy server. We tried using 8, and it can easily | |
395 // lead to total browser stalls. | |
396 const int proxy_connections_16 = | |
397 proxy_connection_trial->AppendGroup("proxy_connections_16", | |
398 kProxyConnectionProbability); | |
399 const int proxy_connections_64 = | |
400 proxy_connection_trial->AppendGroup("proxy_connections_64", | |
401 kProxyConnectionProbability); | |
402 | |
403 const int proxy_connections_trial_group = proxy_connection_trial->group(); | |
404 | |
405 if (proxy_connections_trial_group == proxy_connections_16) { | |
406 net::ClientSocketPoolManager::set_max_sockets_per_proxy_server(16); | |
407 } else if (proxy_connections_trial_group == proxy_connections_32) { | |
408 net::ClientSocketPoolManager::set_max_sockets_per_proxy_server(32); | |
409 } else if (proxy_connections_trial_group == proxy_connections_64) { | |
410 net::ClientSocketPoolManager::set_max_sockets_per_proxy_server(64); | |
411 } else { | |
412 NOTREACHED(); | |
413 } | |
414 } | |
415 | |
416 // When --use-spdy not set, users will be in A/B test for spdy. | |
417 // group A (npn_with_spdy): this means npn and spdy are enabled. In case server | |
418 // supports spdy, browser will use spdy. | |
419 // group B (npn_with_http): this means npn is enabled but spdy won't be used. | |
420 // Http is still used for all requests. | |
421 // default group: no npn or spdy is involved. The "old" non-spdy | |
422 // chrome behavior. | |
423 void BrowserMainParts::SpdyFieldTrial() { | |
424 if (parsed_command_line().HasSwitch(switches::kUseSpdy)) { | |
425 std::string spdy_mode = | |
426 parsed_command_line().GetSwitchValueASCII(switches::kUseSpdy); | |
427 net::HttpNetworkLayer::EnableSpdy(spdy_mode); | |
428 } else { | |
429 #if !defined(OS_CHROMEOS) | |
430 bool is_spdy_trial = false; | |
431 const base::FieldTrial::Probability kSpdyDivisor = 100; | |
432 base::FieldTrial::Probability npnhttp_probability = 5; | |
433 | |
434 // After June 30, 2011 builds, it will always be in default group. | |
435 scoped_refptr<base::FieldTrial> trial( | |
436 new base::FieldTrial( | |
437 "SpdyImpact", kSpdyDivisor, "npn_with_spdy", 2011, 6, 30)); | |
438 | |
439 // npn with spdy support is the default. | |
440 int npn_spdy_grp = trial->kDefaultGroupNumber; | |
441 | |
442 // npn with only http support, no spdy. | |
443 int npn_http_grp = trial->AppendGroup("npn_with_http", npnhttp_probability); | |
444 | |
445 int trial_grp = trial->group(); | |
446 if (trial_grp == npn_http_grp) { | |
447 is_spdy_trial = true; | |
448 net::HttpNetworkLayer::EnableSpdy("npn-http"); | |
449 } else if (trial_grp == npn_spdy_grp) { | |
450 is_spdy_trial = true; | |
451 net::HttpNetworkLayer::EnableSpdy("npn"); | |
452 } else { | |
453 CHECK(!is_spdy_trial); | |
454 } | |
455 #else | |
456 // Always enable SPDY on Chrome OS | |
457 net::HttpNetworkLayer::EnableSpdy("npn"); | |
458 #endif // !defined(OS_CHROMEOS) | |
459 } | |
460 | |
461 // Setup SPDY CWND Field trial. | |
462 const base::FieldTrial::Probability kSpdyCwndDivisor = 100; | |
463 const base::FieldTrial::Probability kSpdyCwnd16 = 20; // fixed at 16 | |
464 const base::FieldTrial::Probability kSpdyCwnd10 = 20; // fixed at 10 | |
465 const base::FieldTrial::Probability kSpdyCwndMin16 = 20; // no less than 16 | |
466 const base::FieldTrial::Probability kSpdyCwndMin10 = 20; // no less than 10 | |
467 | |
468 // After June 30, 2011 builds, it will always be in default group | |
469 // (cwndDynamic). | |
470 scoped_refptr<base::FieldTrial> trial( | |
471 new base::FieldTrial( | |
472 "SpdyCwnd", kSpdyCwndDivisor, "cwndDynamic", 2011, 6, 30)); | |
473 | |
474 trial->AppendGroup("cwnd10", kSpdyCwnd10); | |
475 trial->AppendGroup("cwnd16", kSpdyCwnd16); | |
476 trial->AppendGroup("cwndMin16", kSpdyCwndMin16); | |
477 trial->AppendGroup("cwndMin10", kSpdyCwndMin10); | |
478 | |
479 if (parsed_command_line().HasSwitch(switches::kMaxSpdyConcurrentStreams)) { | |
480 int value = 0; | |
481 base::StringToInt(parsed_command_line().GetSwitchValueASCII( | |
482 switches::kMaxSpdyConcurrentStreams), | |
483 &value); | |
484 if (value > 0) | |
485 net::SpdySession::set_max_concurrent_streams(value); | |
486 } | |
487 } | |
488 | |
489 // If --socket-reuse-policy is not specified, run an A/B test for choosing the | |
490 // warmest socket. | |
491 void BrowserMainParts::WarmConnectionFieldTrial() { | |
492 const CommandLine& command_line = parsed_command_line(); | |
493 if (command_line.HasSwitch(switches::kSocketReusePolicy)) { | |
494 std::string socket_reuse_policy_str = command_line.GetSwitchValueASCII( | |
495 switches::kSocketReusePolicy); | |
496 int policy = -1; | |
497 base::StringToInt(socket_reuse_policy_str, &policy); | |
498 | |
499 const int policy_list[] = { 0, 1, 2 }; | |
500 VLOG(1) << "Setting socket_reuse_policy = " << policy; | |
501 SetSocketReusePolicy(policy, policy_list, arraysize(policy_list)); | |
502 return; | |
503 } | |
504 | |
505 const base::FieldTrial::Probability kWarmSocketDivisor = 100; | |
506 const base::FieldTrial::Probability kWarmSocketProbability = 33; | |
507 | |
508 // After January 30, 2013 builds, it will always be in default group. | |
509 scoped_refptr<base::FieldTrial> warmest_socket_trial( | |
510 new base::FieldTrial( | |
511 "WarmSocketImpact", kWarmSocketDivisor, "last_accessed_socket", | |
512 2013, 1, 30)); | |
513 | |
514 // Default value is USE_LAST_ACCESSED_SOCKET. | |
515 const int last_accessed_socket = warmest_socket_trial->kDefaultGroupNumber; | |
516 const int warmest_socket = warmest_socket_trial->AppendGroup( | |
517 "warmest_socket", kWarmSocketProbability); | |
518 const int warm_socket = warmest_socket_trial->AppendGroup( | |
519 "warm_socket", kWarmSocketProbability); | |
520 | |
521 const int warmest_socket_trial_group = warmest_socket_trial->group(); | |
522 | |
523 const int policy_list[] = { warmest_socket, warm_socket, | |
524 last_accessed_socket }; | |
525 SetSocketReusePolicy(warmest_socket_trial_group, policy_list, | |
526 arraysize(policy_list)); | |
527 } | |
528 | |
529 // If neither --enable-connect-backup-jobs or --disable-connect-backup-jobs is | |
530 // specified, run an A/B test for automatically establishing backup TCP | |
531 // connections when a certain timeout value is exceeded. | |
532 void BrowserMainParts::ConnectBackupJobsFieldTrial() { | |
533 if (parsed_command_line().HasSwitch(switches::kEnableConnectBackupJobs)) { | |
534 net::internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( | |
535 true); | |
536 } else if (parsed_command_line().HasSwitch( | |
537 switches::kDisableConnectBackupJobs)) { | |
538 net::internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( | |
539 false); | |
540 } else { | |
541 const base::FieldTrial::Probability kConnectBackupJobsDivisor = 100; | |
542 // 1% probability. | |
543 const base::FieldTrial::Probability kConnectBackupJobsProbability = 1; | |
544 // After June 30, 2011 builds, it will always be in default group. | |
545 scoped_refptr<base::FieldTrial> trial( | |
546 new base::FieldTrial("ConnnectBackupJobs", | |
547 kConnectBackupJobsDivisor, "ConnectBackupJobsEnabled", 2011, 6, | |
548 30)); | |
549 const int connect_backup_jobs_enabled = trial->kDefaultGroupNumber; | |
550 trial->AppendGroup("ConnectBackupJobsDisabled", | |
551 kConnectBackupJobsProbability); | |
552 const int trial_group = trial->group(); | |
553 net::internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( | |
554 trial_group == connect_backup_jobs_enabled); | |
555 } | |
556 } | |
557 | |
558 // Test the impact on subsequent Google searches of getting suggestions from | |
559 // www.google.TLD instead of clients1.google.TLD. | |
560 void BrowserMainParts::SuggestPrefixFieldTrial() { | |
561 const base::FieldTrial::Probability kSuggestPrefixDivisor = 100; | |
562 // 50% probability. | |
563 const base::FieldTrial::Probability kSuggestPrefixProbability = 50; | |
564 // After Jan 1, 2012, it will always be in default group. | |
565 scoped_refptr<base::FieldTrial> trial( | |
566 new base::FieldTrial("SuggestHostPrefix", | |
567 kSuggestPrefixDivisor, "Default_Prefix", 2012, 1, 1)); | |
568 trial->AppendGroup("Www_Prefix", kSuggestPrefixProbability); | |
569 // The field trial is detected directly, so we don't need to call anything. | |
570 } | |
571 | |
572 // BrowserMainParts: |MainMessageLoopStart()| and related ---------------------- | |
573 | |
574 void BrowserMainParts::MainMessageLoopStart() { | |
575 PreMainMessageLoopStart(); | |
576 | |
577 main_message_loop_.reset(new MessageLoop(MessageLoop::TYPE_UI)); | |
578 | |
579 // TODO(viettrungluu): should these really go before setting the thread name? | |
580 system_monitor_.reset(new base::SystemMonitor); | |
581 hi_res_timer_manager_.reset(new HighResolutionTimerManager); | |
582 | |
583 InitializeMainThread(); | |
584 | |
585 network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); | |
586 | |
587 PostMainMessageLoopStart(); | |
588 Profiling::MainMessageLoopStarted(); | |
589 } | |
590 | |
591 void BrowserMainParts::InitializeMainThread() { | |
592 const char* kThreadName = "CrBrowserMain"; | |
593 base::PlatformThread::SetName(kThreadName); | |
594 main_message_loop().set_thread_name(kThreadName); | |
595 | |
596 // Register the main thread by instantiating it, but don't call any methods. | |
597 main_thread_.reset(new BrowserThread(BrowserThread::UI, | |
598 MessageLoop::current())); | |
599 } | |
600 | |
601 // BrowserMainParts: |SetupMetricsAndFieldTrials()| related -------------------- | |
602 | |
603 // Initializes the metrics service with the configuration for this process, | |
604 // returning the created service (guaranteed non-NULL). | |
605 MetricsService* BrowserMainParts::InitializeMetrics( | |
606 const CommandLine& parsed_command_line, | |
607 const PrefService* local_state) { | |
608 #if defined(OS_WIN) | |
609 if (parsed_command_line.HasSwitch(switches::kChromeFrame)) | |
610 MetricsLog::set_version_extension("-F"); | |
611 #elif defined(ARCH_CPU_64_BITS) | |
612 MetricsLog::set_version_extension("-64"); | |
613 #endif // defined(OS_WIN) | |
614 | |
615 MetricsService* metrics = g_browser_process->metrics_service(); | |
616 | |
617 if (parsed_command_line.HasSwitch(switches::kMetricsRecordingOnly) || | |
618 parsed_command_line.HasSwitch(switches::kEnableBenchmarking)) { | |
619 // If we're testing then we don't care what the user preference is, we turn | |
620 // on recording, but not reporting, otherwise tests fail. | |
621 metrics->StartRecordingOnly(); | |
622 return metrics; | |
623 } | |
624 | |
625 // If the user permits metrics reporting with the checkbox in the | |
626 // prefs, we turn on recording. We disable metrics completely for | |
627 // non-official builds. | |
628 #if defined(GOOGLE_CHROME_BUILD) | |
629 #if defined(OS_CHROMEOS) | |
630 bool enabled = chromeos::UserCrosSettingsProvider::cached_reporting_enabled(); | |
631 #else | |
632 bool enabled = local_state->GetBoolean(prefs::kMetricsReportingEnabled); | |
633 #endif // #if defined(OS_CHROMEOS) | |
634 if (enabled) { | |
635 metrics->Start(); | |
636 } | |
637 #endif // defined(GOOGLE_CHROME_BUILD) | |
638 | |
639 return metrics; | |
640 } | |
641 | |
642 void BrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled, | |
643 bool proxy_policy_is_set) { | |
644 // Note: make sure to call ConnectionFieldTrial() before | |
645 // ProxyConnectionsFieldTrial(). | |
646 ConnectionFieldTrial(); | |
647 SocketTimeoutFieldTrial(); | |
648 // If a policy is defining the number of active connections this field test | |
649 // shoud not be performed. | |
650 if (!proxy_policy_is_set) | |
651 ProxyConnectionsFieldTrial(); | |
652 prerender::ConfigurePrefetchAndPrerender(parsed_command_line()); | |
653 InstantFieldTrial::Activate(); | |
654 SpdyFieldTrial(); | |
655 ConnectBackupJobsFieldTrial(); | |
656 SuggestPrefixFieldTrial(); | |
657 WarmConnectionFieldTrial(); | |
658 } | |
659 | |
660 // ----------------------------------------------------------------------------- | |
661 // TODO(viettrungluu): move more/rest of BrowserMain() into above structure | |
662 | |
663 namespace { | |
664 | 220 |
665 // This function provides some ways to test crash and assertion handling | 221 // This function provides some ways to test crash and assertion handling |
666 // behavior of the program. | 222 // behavior of the program. |
667 void HandleTestParameters(const CommandLine& command_line) { | 223 void HandleTestParameters(const CommandLine& command_line) { |
668 // This parameter causes an assertion. | 224 // This parameter causes an assertion. |
669 if (command_line.HasSwitch(switches::kBrowserAssertTest)) { | 225 if (command_line.HasSwitch(switches::kBrowserAssertTest)) { |
670 DCHECK(false); | 226 DCHECK(false); |
671 } | 227 } |
672 | 228 |
673 // This parameter causes a null pointer crash (crash reporter trigger). | 229 // This parameter causes a null pointer crash (crash reporter trigger). |
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1267 local_state->GetBoolean(prefs::kMetricsReportingEnabled); | 823 local_state->GetBoolean(prefs::kMetricsReportingEnabled); |
1268 if (!breakpad_enabled && metrics_reporting_enabled->IsUserModifiable()) | 824 if (!breakpad_enabled && metrics_reporting_enabled->IsUserModifiable()) |
1269 breakpad_enabled = getenv(env_vars::kHeadless) != NULL; | 825 breakpad_enabled = getenv(env_vars::kHeadless) != NULL; |
1270 #endif // #if defined(OS_CHROMEOS) | 826 #endif // #if defined(OS_CHROMEOS) |
1271 return breakpad_enabled; | 827 return breakpad_enabled; |
1272 } | 828 } |
1273 #endif // #if defined(USE_LINUX_BREAKPAD) | 829 #endif // #if defined(USE_LINUX_BREAKPAD) |
1274 | 830 |
1275 } // namespace | 831 } // namespace |
1276 | 832 |
| 833 // BrowserMainParts ------------------------------------------------------------ |
| 834 |
| 835 BrowserMainParts::BrowserMainParts(const MainFunctionParams& parameters) |
| 836 : parameters_(parameters), |
| 837 parsed_command_line_(parameters.command_line_) { |
| 838 } |
| 839 |
| 840 BrowserMainParts::~BrowserMainParts() { |
| 841 } |
| 842 |
| 843 // BrowserMainParts: |EarlyInitialization()| and related ----------------------- |
| 844 |
| 845 void BrowserMainParts::EarlyInitialization() { |
| 846 PreEarlyInitialization(); |
| 847 |
| 848 if (parsed_command_line().HasSwitch(switches::kEnableBenchmarking)) |
| 849 base::FieldTrial::EnableBenchmarking(); |
| 850 |
| 851 InitializeSSL(); |
| 852 |
| 853 if (parsed_command_line().HasSwitch(switches::kDisableSSLFalseStart)) |
| 854 net::SSLConfigService::DisableFalseStart(); |
| 855 if (parsed_command_line().HasSwitch(switches::kEnableSSLCachedInfo)) |
| 856 net::SSLConfigService::EnableCachedInfo(); |
| 857 if (parsed_command_line().HasSwitch(switches::kEnableOriginBoundCerts)) |
| 858 net::SSLConfigService::EnableOriginBoundCerts(); |
| 859 if (parsed_command_line().HasSwitch( |
| 860 switches::kEnableDNSCertProvenanceChecking)) { |
| 861 net::SSLConfigService::EnableDNSCertProvenanceChecking(); |
| 862 } |
| 863 |
| 864 // TODO(abarth): Should this move to InitializeNetworkOptions? This doesn't |
| 865 // seem dependent on InitializeSSL(). |
| 866 if (parsed_command_line().HasSwitch(switches::kEnableTcpFastOpen)) |
| 867 net::set_tcp_fastopen_enabled(true); |
| 868 |
| 869 PostEarlyInitialization(); |
| 870 } |
| 871 |
| 872 // This will be called after the command-line has been mutated by about:flags |
| 873 MetricsService* BrowserMainParts::SetupMetricsAndFieldTrials( |
| 874 const CommandLine& parsed_command_line, |
| 875 PrefService* local_state) { |
| 876 // Must initialize metrics after labs have been converted into switches, |
| 877 // but before field trials are set up (so that client ID is available for |
| 878 // one-time randomized field trials). |
| 879 MetricsService* metrics = InitializeMetrics(parsed_command_line, local_state); |
| 880 |
| 881 // Initialize FieldTrialList to support FieldTrials that use one-time |
| 882 // randomization. The client ID will be empty if the user has not opted |
| 883 // to send metrics. |
| 884 field_trial_list_.reset(new base::FieldTrialList(metrics->GetClientId())); |
| 885 |
| 886 SetupFieldTrials(metrics->recording_active(), |
| 887 local_state->IsManagedPreference( |
| 888 prefs::kMaxConnectionsPerProxy)); |
| 889 |
| 890 // Initialize FieldTrialSynchronizer system. This is a singleton and is used |
| 891 // for posting tasks via NewRunnableMethod. Its deleted when it goes out of |
| 892 // scope. Even though NewRunnableMethod does AddRef and Release, the object |
| 893 // will not be deleted after the Task is executed. |
| 894 field_trial_synchronizer_ = new FieldTrialSynchronizer(); |
| 895 |
| 896 return metrics; |
| 897 } |
| 898 |
| 899 // This is an A/B test for the maximum number of persistent connections per |
| 900 // host. Currently Chrome, Firefox, and IE8 have this value set at 6. Safari |
| 901 // uses 4, and Fasterfox (a plugin for Firefox that supposedly configures it to |
| 902 // run faster) uses 8. We would like to see how much of an effect this value has |
| 903 // on browsing. Too large a value might cause us to run into SYN flood detection |
| 904 // mechanisms. |
| 905 void BrowserMainParts::ConnectionFieldTrial() { |
| 906 const base::FieldTrial::Probability kConnectDivisor = 100; |
| 907 const base::FieldTrial::Probability kConnectProbability = 1; // 1% prob. |
| 908 |
| 909 // After June 30, 2011 builds, it will always be in default group. |
| 910 scoped_refptr<base::FieldTrial> connect_trial( |
| 911 new base::FieldTrial( |
| 912 "ConnCountImpact", kConnectDivisor, "conn_count_6", 2011, 6, 30)); |
| 913 |
| 914 // This (6) is the current default value. Having this group declared here |
| 915 // makes it straightforward to modify |kConnectProbability| such that the same |
| 916 // probability value will be assigned to all the other groups, while |
| 917 // preserving the remainder of the of probability space to the default value. |
| 918 const int connect_6 = connect_trial->kDefaultGroupNumber; |
| 919 |
| 920 const int connect_5 = connect_trial->AppendGroup("conn_count_5", |
| 921 kConnectProbability); |
| 922 const int connect_7 = connect_trial->AppendGroup("conn_count_7", |
| 923 kConnectProbability); |
| 924 const int connect_8 = connect_trial->AppendGroup("conn_count_8", |
| 925 kConnectProbability); |
| 926 const int connect_9 = connect_trial->AppendGroup("conn_count_9", |
| 927 kConnectProbability); |
| 928 |
| 929 const int connect_trial_group = connect_trial->group(); |
| 930 |
| 931 if (connect_trial_group == connect_5) { |
| 932 net::ClientSocketPoolManager::set_max_sockets_per_group(5); |
| 933 } else if (connect_trial_group == connect_6) { |
| 934 net::ClientSocketPoolManager::set_max_sockets_per_group(6); |
| 935 } else if (connect_trial_group == connect_7) { |
| 936 net::ClientSocketPoolManager::set_max_sockets_per_group(7); |
| 937 } else if (connect_trial_group == connect_8) { |
| 938 net::ClientSocketPoolManager::set_max_sockets_per_group(8); |
| 939 } else if (connect_trial_group == connect_9) { |
| 940 net::ClientSocketPoolManager::set_max_sockets_per_group(9); |
| 941 } else { |
| 942 NOTREACHED(); |
| 943 } |
| 944 } |
| 945 |
| 946 // A/B test for determining a value for unused socket timeout. Currently the |
| 947 // timeout defaults to 10 seconds. Having this value set too low won't allow us |
| 948 // to take advantage of idle sockets. Setting it to too high could possibly |
| 949 // result in more ERR_CONNECTION_RESETs, since some servers will kill a socket |
| 950 // before we time it out. Since these are "unused" sockets, we won't retry the |
| 951 // connection and instead show an error to the user. So we need to be |
| 952 // conservative here. We've seen that some servers will close the socket after |
| 953 // as short as 10 seconds. See http://crbug.com/84313 for more details. |
| 954 void BrowserMainParts::SocketTimeoutFieldTrial() { |
| 955 const base::FieldTrial::Probability kIdleSocketTimeoutDivisor = 100; |
| 956 // 1% probability for all experimental settings. |
| 957 const base::FieldTrial::Probability kSocketTimeoutProbability = 1; |
| 958 |
| 959 // After June 30, 2011 builds, it will always be in default group. |
| 960 scoped_refptr<base::FieldTrial> socket_timeout_trial( |
| 961 new base::FieldTrial("IdleSktToImpact", kIdleSocketTimeoutDivisor, |
| 962 "idle_timeout_10", 2011, 6, 30)); |
| 963 const int socket_timeout_10 = socket_timeout_trial->kDefaultGroupNumber; |
| 964 |
| 965 const int socket_timeout_5 = |
| 966 socket_timeout_trial->AppendGroup("idle_timeout_5", |
| 967 kSocketTimeoutProbability); |
| 968 const int socket_timeout_20 = |
| 969 socket_timeout_trial->AppendGroup("idle_timeout_20", |
| 970 kSocketTimeoutProbability); |
| 971 |
| 972 const int idle_to_trial_group = socket_timeout_trial->group(); |
| 973 |
| 974 if (idle_to_trial_group == socket_timeout_5) { |
| 975 net::ClientSocketPool::set_unused_idle_socket_timeout(5); |
| 976 } else if (idle_to_trial_group == socket_timeout_10) { |
| 977 net::ClientSocketPool::set_unused_idle_socket_timeout(10); |
| 978 } else if (idle_to_trial_group == socket_timeout_20) { |
| 979 net::ClientSocketPool::set_unused_idle_socket_timeout(20); |
| 980 } else { |
| 981 NOTREACHED(); |
| 982 } |
| 983 } |
| 984 |
| 985 void BrowserMainParts::ProxyConnectionsFieldTrial() { |
| 986 const base::FieldTrial::Probability kProxyConnectionsDivisor = 100; |
| 987 // 25% probability |
| 988 const base::FieldTrial::Probability kProxyConnectionProbability = 1; |
| 989 |
| 990 // After June 30, 2011 builds, it will always be in default group. |
| 991 scoped_refptr<base::FieldTrial> proxy_connection_trial( |
| 992 new base::FieldTrial("ProxyConnectionImpact", kProxyConnectionsDivisor, |
| 993 "proxy_connections_32", 2011, 6, 30)); |
| 994 |
| 995 // This (32 connections per proxy server) is the current default value. |
| 996 // Declaring it here allows us to easily re-assign the probability space while |
| 997 // maintaining that the default group always has the remainder of the "share", |
| 998 // which allows for cleaner and quicker changes down the line if needed. |
| 999 const int proxy_connections_32 = proxy_connection_trial->kDefaultGroupNumber; |
| 1000 |
| 1001 // The number of max sockets per group cannot be greater than the max number |
| 1002 // of sockets per proxy server. We tried using 8, and it can easily |
| 1003 // lead to total browser stalls. |
| 1004 const int proxy_connections_16 = |
| 1005 proxy_connection_trial->AppendGroup("proxy_connections_16", |
| 1006 kProxyConnectionProbability); |
| 1007 const int proxy_connections_64 = |
| 1008 proxy_connection_trial->AppendGroup("proxy_connections_64", |
| 1009 kProxyConnectionProbability); |
| 1010 |
| 1011 const int proxy_connections_trial_group = proxy_connection_trial->group(); |
| 1012 |
| 1013 if (proxy_connections_trial_group == proxy_connections_16) { |
| 1014 net::ClientSocketPoolManager::set_max_sockets_per_proxy_server(16); |
| 1015 } else if (proxy_connections_trial_group == proxy_connections_32) { |
| 1016 net::ClientSocketPoolManager::set_max_sockets_per_proxy_server(32); |
| 1017 } else if (proxy_connections_trial_group == proxy_connections_64) { |
| 1018 net::ClientSocketPoolManager::set_max_sockets_per_proxy_server(64); |
| 1019 } else { |
| 1020 NOTREACHED(); |
| 1021 } |
| 1022 } |
| 1023 |
| 1024 // When --use-spdy not set, users will be in A/B test for spdy. |
| 1025 // group A (npn_with_spdy): this means npn and spdy are enabled. In case server |
| 1026 // supports spdy, browser will use spdy. |
| 1027 // group B (npn_with_http): this means npn is enabled but spdy won't be used. |
| 1028 // Http is still used for all requests. |
| 1029 // default group: no npn or spdy is involved. The "old" non-spdy |
| 1030 // chrome behavior. |
| 1031 void BrowserMainParts::SpdyFieldTrial() { |
| 1032 if (parsed_command_line().HasSwitch(switches::kUseSpdy)) { |
| 1033 std::string spdy_mode = |
| 1034 parsed_command_line().GetSwitchValueASCII(switches::kUseSpdy); |
| 1035 net::HttpNetworkLayer::EnableSpdy(spdy_mode); |
| 1036 } else { |
| 1037 #if !defined(OS_CHROMEOS) |
| 1038 bool is_spdy_trial = false; |
| 1039 const base::FieldTrial::Probability kSpdyDivisor = 100; |
| 1040 base::FieldTrial::Probability npnhttp_probability = 5; |
| 1041 |
| 1042 // After June 30, 2011 builds, it will always be in default group. |
| 1043 scoped_refptr<base::FieldTrial> trial( |
| 1044 new base::FieldTrial( |
| 1045 "SpdyImpact", kSpdyDivisor, "npn_with_spdy", 2011, 6, 30)); |
| 1046 |
| 1047 // npn with spdy support is the default. |
| 1048 int npn_spdy_grp = trial->kDefaultGroupNumber; |
| 1049 |
| 1050 // npn with only http support, no spdy. |
| 1051 int npn_http_grp = trial->AppendGroup("npn_with_http", npnhttp_probability); |
| 1052 |
| 1053 int trial_grp = trial->group(); |
| 1054 if (trial_grp == npn_http_grp) { |
| 1055 is_spdy_trial = true; |
| 1056 net::HttpNetworkLayer::EnableSpdy("npn-http"); |
| 1057 } else if (trial_grp == npn_spdy_grp) { |
| 1058 is_spdy_trial = true; |
| 1059 net::HttpNetworkLayer::EnableSpdy("npn"); |
| 1060 } else { |
| 1061 CHECK(!is_spdy_trial); |
| 1062 } |
| 1063 #else |
| 1064 // Always enable SPDY on Chrome OS |
| 1065 net::HttpNetworkLayer::EnableSpdy("npn"); |
| 1066 #endif // !defined(OS_CHROMEOS) |
| 1067 } |
| 1068 |
| 1069 // Setup SPDY CWND Field trial. |
| 1070 const base::FieldTrial::Probability kSpdyCwndDivisor = 100; |
| 1071 const base::FieldTrial::Probability kSpdyCwnd16 = 20; // fixed at 16 |
| 1072 const base::FieldTrial::Probability kSpdyCwnd10 = 20; // fixed at 10 |
| 1073 const base::FieldTrial::Probability kSpdyCwndMin16 = 20; // no less than 16 |
| 1074 const base::FieldTrial::Probability kSpdyCwndMin10 = 20; // no less than 10 |
| 1075 |
| 1076 // After June 30, 2011 builds, it will always be in default group |
| 1077 // (cwndDynamic). |
| 1078 scoped_refptr<base::FieldTrial> trial( |
| 1079 new base::FieldTrial( |
| 1080 "SpdyCwnd", kSpdyCwndDivisor, "cwndDynamic", 2011, 6, 30)); |
| 1081 |
| 1082 trial->AppendGroup("cwnd10", kSpdyCwnd10); |
| 1083 trial->AppendGroup("cwnd16", kSpdyCwnd16); |
| 1084 trial->AppendGroup("cwndMin16", kSpdyCwndMin16); |
| 1085 trial->AppendGroup("cwndMin10", kSpdyCwndMin10); |
| 1086 |
| 1087 if (parsed_command_line().HasSwitch(switches::kMaxSpdyConcurrentStreams)) { |
| 1088 int value = 0; |
| 1089 base::StringToInt(parsed_command_line().GetSwitchValueASCII( |
| 1090 switches::kMaxSpdyConcurrentStreams), |
| 1091 &value); |
| 1092 if (value > 0) |
| 1093 net::SpdySession::set_max_concurrent_streams(value); |
| 1094 } |
| 1095 } |
| 1096 |
| 1097 // If --socket-reuse-policy is not specified, run an A/B test for choosing the |
| 1098 // warmest socket. |
| 1099 void BrowserMainParts::WarmConnectionFieldTrial() { |
| 1100 const CommandLine& command_line = parsed_command_line(); |
| 1101 if (command_line.HasSwitch(switches::kSocketReusePolicy)) { |
| 1102 std::string socket_reuse_policy_str = command_line.GetSwitchValueASCII( |
| 1103 switches::kSocketReusePolicy); |
| 1104 int policy = -1; |
| 1105 base::StringToInt(socket_reuse_policy_str, &policy); |
| 1106 |
| 1107 const int policy_list[] = { 0, 1, 2 }; |
| 1108 VLOG(1) << "Setting socket_reuse_policy = " << policy; |
| 1109 SetSocketReusePolicy(policy, policy_list, arraysize(policy_list)); |
| 1110 return; |
| 1111 } |
| 1112 |
| 1113 const base::FieldTrial::Probability kWarmSocketDivisor = 100; |
| 1114 const base::FieldTrial::Probability kWarmSocketProbability = 33; |
| 1115 |
| 1116 // After January 30, 2013 builds, it will always be in default group. |
| 1117 scoped_refptr<base::FieldTrial> warmest_socket_trial( |
| 1118 new base::FieldTrial( |
| 1119 "WarmSocketImpact", kWarmSocketDivisor, "last_accessed_socket", |
| 1120 2013, 1, 30)); |
| 1121 |
| 1122 // Default value is USE_LAST_ACCESSED_SOCKET. |
| 1123 const int last_accessed_socket = warmest_socket_trial->kDefaultGroupNumber; |
| 1124 const int warmest_socket = warmest_socket_trial->AppendGroup( |
| 1125 "warmest_socket", kWarmSocketProbability); |
| 1126 const int warm_socket = warmest_socket_trial->AppendGroup( |
| 1127 "warm_socket", kWarmSocketProbability); |
| 1128 |
| 1129 const int warmest_socket_trial_group = warmest_socket_trial->group(); |
| 1130 |
| 1131 const int policy_list[] = { warmest_socket, warm_socket, |
| 1132 last_accessed_socket }; |
| 1133 SetSocketReusePolicy(warmest_socket_trial_group, policy_list, |
| 1134 arraysize(policy_list)); |
| 1135 } |
| 1136 |
| 1137 // If neither --enable-connect-backup-jobs or --disable-connect-backup-jobs is |
| 1138 // specified, run an A/B test for automatically establishing backup TCP |
| 1139 // connections when a certain timeout value is exceeded. |
| 1140 void BrowserMainParts::ConnectBackupJobsFieldTrial() { |
| 1141 if (parsed_command_line().HasSwitch(switches::kEnableConnectBackupJobs)) { |
| 1142 net::internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( |
| 1143 true); |
| 1144 } else if (parsed_command_line().HasSwitch( |
| 1145 switches::kDisableConnectBackupJobs)) { |
| 1146 net::internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( |
| 1147 false); |
| 1148 } else { |
| 1149 const base::FieldTrial::Probability kConnectBackupJobsDivisor = 100; |
| 1150 // 1% probability. |
| 1151 const base::FieldTrial::Probability kConnectBackupJobsProbability = 1; |
| 1152 // After June 30, 2011 builds, it will always be in default group. |
| 1153 scoped_refptr<base::FieldTrial> trial( |
| 1154 new base::FieldTrial("ConnnectBackupJobs", |
| 1155 kConnectBackupJobsDivisor, "ConnectBackupJobsEnabled", 2011, 6, |
| 1156 30)); |
| 1157 const int connect_backup_jobs_enabled = trial->kDefaultGroupNumber; |
| 1158 trial->AppendGroup("ConnectBackupJobsDisabled", |
| 1159 kConnectBackupJobsProbability); |
| 1160 const int trial_group = trial->group(); |
| 1161 net::internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( |
| 1162 trial_group == connect_backup_jobs_enabled); |
| 1163 } |
| 1164 } |
| 1165 |
| 1166 // Test the impact on subsequent Google searches of getting suggestions from |
| 1167 // www.google.TLD instead of clients1.google.TLD. |
| 1168 void BrowserMainParts::SuggestPrefixFieldTrial() { |
| 1169 const base::FieldTrial::Probability kSuggestPrefixDivisor = 100; |
| 1170 // 50% probability. |
| 1171 const base::FieldTrial::Probability kSuggestPrefixProbability = 50; |
| 1172 // After Jan 1, 2012, it will always be in default group. |
| 1173 scoped_refptr<base::FieldTrial> trial( |
| 1174 new base::FieldTrial("SuggestHostPrefix", |
| 1175 kSuggestPrefixDivisor, "Default_Prefix", 2012, 1, 1)); |
| 1176 trial->AppendGroup("Www_Prefix", kSuggestPrefixProbability); |
| 1177 // The field trial is detected directly, so we don't need to call anything. |
| 1178 } |
| 1179 |
| 1180 // BrowserMainParts: |MainMessageLoopStart()| and related ---------------------- |
| 1181 |
| 1182 void BrowserMainParts::MainMessageLoopStart() { |
| 1183 PreMainMessageLoopStart(); |
| 1184 |
| 1185 main_message_loop_.reset(new MessageLoop(MessageLoop::TYPE_UI)); |
| 1186 |
| 1187 // TODO(viettrungluu): should these really go before setting the thread name? |
| 1188 system_monitor_.reset(new base::SystemMonitor); |
| 1189 hi_res_timer_manager_.reset(new HighResolutionTimerManager); |
| 1190 |
| 1191 InitializeMainThread(); |
| 1192 |
| 1193 network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); |
| 1194 |
| 1195 PostMainMessageLoopStart(); |
| 1196 Profiling::MainMessageLoopStarted(); |
| 1197 } |
| 1198 |
| 1199 void BrowserMainParts::InitializeMainThread() { |
| 1200 const char* kThreadName = "CrBrowserMain"; |
| 1201 base::PlatformThread::SetName(kThreadName); |
| 1202 main_message_loop().set_thread_name(kThreadName); |
| 1203 |
| 1204 // Register the main thread by instantiating it, but don't call any methods. |
| 1205 main_thread_.reset(new BrowserThread(BrowserThread::UI, |
| 1206 MessageLoop::current())); |
| 1207 } |
| 1208 |
| 1209 // BrowserMainParts: |SetupMetricsAndFieldTrials()| related -------------------- |
| 1210 |
| 1211 // Initializes the metrics service with the configuration for this process, |
| 1212 // returning the created service (guaranteed non-NULL). |
| 1213 MetricsService* BrowserMainParts::InitializeMetrics( |
| 1214 const CommandLine& parsed_command_line, |
| 1215 const PrefService* local_state) { |
| 1216 #if defined(OS_WIN) |
| 1217 if (parsed_command_line.HasSwitch(switches::kChromeFrame)) |
| 1218 MetricsLog::set_version_extension("-F"); |
| 1219 #elif defined(ARCH_CPU_64_BITS) |
| 1220 MetricsLog::set_version_extension("-64"); |
| 1221 #endif // defined(OS_WIN) |
| 1222 |
| 1223 MetricsService* metrics = g_browser_process->metrics_service(); |
| 1224 |
| 1225 if (parsed_command_line.HasSwitch(switches::kMetricsRecordingOnly) || |
| 1226 parsed_command_line.HasSwitch(switches::kEnableBenchmarking)) { |
| 1227 // If we're testing then we don't care what the user preference is, we turn |
| 1228 // on recording, but not reporting, otherwise tests fail. |
| 1229 metrics->StartRecordingOnly(); |
| 1230 return metrics; |
| 1231 } |
| 1232 |
| 1233 // If the user permits metrics reporting with the checkbox in the |
| 1234 // prefs, we turn on recording. We disable metrics completely for |
| 1235 // non-official builds. |
| 1236 #if defined(GOOGLE_CHROME_BUILD) |
| 1237 #if defined(OS_CHROMEOS) |
| 1238 bool enabled = chromeos::UserCrosSettingsProvider::cached_reporting_enabled(); |
| 1239 #else |
| 1240 bool enabled = local_state->GetBoolean(prefs::kMetricsReportingEnabled); |
| 1241 #endif // #if defined(OS_CHROMEOS) |
| 1242 if (enabled) { |
| 1243 metrics->Start(); |
| 1244 } |
| 1245 #endif // defined(GOOGLE_CHROME_BUILD) |
| 1246 |
| 1247 return metrics; |
| 1248 } |
| 1249 |
| 1250 void BrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled, |
| 1251 bool proxy_policy_is_set) { |
| 1252 // Note: make sure to call ConnectionFieldTrial() before |
| 1253 // ProxyConnectionsFieldTrial(). |
| 1254 ConnectionFieldTrial(); |
| 1255 SocketTimeoutFieldTrial(); |
| 1256 // If a policy is defining the number of active connections this field test |
| 1257 // shoud not be performed. |
| 1258 if (!proxy_policy_is_set) |
| 1259 ProxyConnectionsFieldTrial(); |
| 1260 prerender::ConfigurePrefetchAndPrerender(parsed_command_line()); |
| 1261 InstantFieldTrial::Activate(); |
| 1262 SpdyFieldTrial(); |
| 1263 ConnectBackupJobsFieldTrial(); |
| 1264 SuggestPrefixFieldTrial(); |
| 1265 WarmConnectionFieldTrial(); |
| 1266 } |
| 1267 |
| 1268 // ----------------------------------------------------------------------------- |
| 1269 // TODO(viettrungluu): move more/rest of BrowserMain() into BrowserMainParts. |
| 1270 |
1277 #if defined(OS_CHROMEOS) | 1271 #if defined(OS_CHROMEOS) |
1278 // Allows authenticator to be invoked without adding refcounting. The instances | 1272 // Allows authenticator to be invoked without adding refcounting. The instances |
1279 // will delete themselves upon completion. | 1273 // will delete themselves upon completion. |
1280 DISABLE_RUNNABLE_METHOD_REFCOUNT(StubLogin); | 1274 DISABLE_RUNNABLE_METHOD_REFCOUNT(StubLogin); |
1281 #endif | 1275 #endif |
1282 | 1276 |
1283 #if defined(OS_WIN) | 1277 #if defined(OS_WIN) |
1284 #define DLLEXPORT __declspec(dllexport) | 1278 #define DLLEXPORT __declspec(dllexport) |
1285 | 1279 |
1286 // We use extern C for the prototype DLLEXPORT to avoid C++ name mangling. | 1280 // We use extern C for the prototype DLLEXPORT to avoid C++ name mangling. |
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2162 // (environment variable is set, and valid). | 2156 // (environment variable is set, and valid). |
2163 std::string pre_read; | 2157 std::string pre_read; |
2164 if (env->GetVar(kEnvVar, &pre_read) && (pre_read == "0" || pre_read == "1")) { | 2158 if (env->GetVar(kEnvVar, &pre_read) && (pre_read == "0" || pre_read == "1")) { |
2165 std::string uma_name(name); | 2159 std::string uma_name(name); |
2166 uma_name += "_PreRead"; | 2160 uma_name += "_PreRead"; |
2167 uma_name += pre_read == "1" ? "Enabled" : "Disabled"; | 2161 uma_name += pre_read == "1" ? "Enabled" : "Disabled"; |
2168 AddPreReadHistogramTime(uma_name.c_str(), time); | 2162 AddPreReadHistogramTime(uma_name.c_str(), time); |
2169 } | 2163 } |
2170 #endif | 2164 #endif |
2171 } | 2165 } |
OLD | NEW |