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 #include "chrome/browser/metrics/metrics_log.h" | 5 #include "chrome/browser/metrics/metrics_log.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 10 matching lines...) Expand all Loading... | |
21 #include "base/time/time.h" | 21 #include "base/time/time.h" |
22 #include "base/tracked_objects.h" | 22 #include "base/tracked_objects.h" |
23 #include "chrome/browser/google/google_util.h" | 23 #include "chrome/browser/google/google_util.h" |
24 #include "chrome/browser/prefs/browser_prefs.h" | 24 #include "chrome/browser/prefs/browser_prefs.h" |
25 #include "chrome/common/chrome_switches.h" | 25 #include "chrome/common/chrome_switches.h" |
26 #include "chrome/common/metrics/proto/profiler_event.pb.h" | 26 #include "chrome/common/metrics/proto/profiler_event.pb.h" |
27 #include "chrome/common/metrics/proto/system_profile.pb.h" | 27 #include "chrome/common/metrics/proto/system_profile.pb.h" |
28 #include "chrome/common/metrics/variations/variations_util.h" | 28 #include "chrome/common/metrics/variations/variations_util.h" |
29 #include "chrome/common/pref_names.h" | 29 #include "chrome/common/pref_names.h" |
30 #include "chrome/installer/util/google_update_settings.h" | 30 #include "chrome/installer/util/google_update_settings.h" |
31 #include "components/metrics/metrics_hashes.h" | |
31 #include "components/variations/metrics_util.h" | 32 #include "components/variations/metrics_util.h" |
32 #include "content/public/browser/browser_thread.h" | 33 #include "content/public/browser/browser_thread.h" |
33 #include "content/public/common/process_type.h" | 34 #include "content/public/common/process_type.h" |
34 #include "content/public/common/webplugininfo.h" | 35 #include "content/public/common/webplugininfo.h" |
35 #include "content/public/test/test_browser_thread_bundle.h" | 36 #include "content/public/test/test_browser_thread_bundle.h" |
36 #include "content/public/test/test_utils.h" | 37 #include "content/public/test/test_utils.h" |
37 #include "testing/gtest/include/gtest/gtest.h" | 38 #include "testing/gtest/include/gtest/gtest.h" |
38 #include "ui/gfx/size.h" | 39 #include "ui/gfx/size.h" |
39 #include "url/gurl.h" | 40 #include "url/gurl.h" |
40 | 41 |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
460 EXPECT_FALSE(stability.plugin_stability(0).plugin().is_pepper()); | 461 EXPECT_FALSE(stability.plugin_stability(0).plugin().is_pepper()); |
461 EXPECT_EQ(1, stability.plugin_stability(0).launch_count()); | 462 EXPECT_EQ(1, stability.plugin_stability(0).launch_count()); |
462 EXPECT_EQ(2, stability.plugin_stability(0).crash_count()); | 463 EXPECT_EQ(2, stability.plugin_stability(0).crash_count()); |
463 EXPECT_EQ(3, stability.plugin_stability(0).instance_count()); | 464 EXPECT_EQ(3, stability.plugin_stability(0).instance_count()); |
464 EXPECT_EQ(4, stability.plugin_stability(0).loading_error_count()); | 465 EXPECT_EQ(4, stability.plugin_stability(0).loading_error_count()); |
465 } | 466 } |
466 #endif // defined(ENABLE_PLUGINS) | 467 #endif // defined(ENABLE_PLUGINS) |
467 | 468 |
468 // Test that we properly write profiler data to the log. | 469 // Test that we properly write profiler data to the log. |
469 TEST_F(MetricsLogTest, RecordProfilerData) { | 470 TEST_F(MetricsLogTest, RecordProfilerData) { |
471 // WARNING: If you broke the below check, you've modified how | |
472 // metrics::HashMetricName works. Please also modify all server-side code that | |
473 // relies on the existing way of hashing. | |
474 EXPECT_EQ(GG_UINT64_C(1518842999910132863), | |
475 metrics::HashMetricName("birth_thread*")); | |
Ilya Sherman
2014/04/03 00:49:58
nit: Please indent this line to align with the "G"
vadimt
2014/04/03 00:54:55
Done.
| |
476 | |
470 TestMetricsLog log(kClientId, kSessionId); | 477 TestMetricsLog log(kClientId, kSessionId); |
471 EXPECT_EQ(0, log.uma_proto().profiler_event_size()); | 478 EXPECT_EQ(0, log.uma_proto().profiler_event_size()); |
472 | 479 |
473 { | 480 { |
474 ProcessDataSnapshot process_data; | 481 ProcessDataSnapshot process_data; |
475 process_data.process_id = 177; | 482 process_data.process_id = 177; |
476 process_data.tasks.push_back(TaskSnapshot()); | 483 process_data.tasks.push_back(TaskSnapshot()); |
477 process_data.tasks.back().birth.location.file_name = "file"; | 484 process_data.tasks.back().birth.location.file_name = "a/b/file.h"; |
478 process_data.tasks.back().birth.location.function_name = "function"; | 485 process_data.tasks.back().birth.location.function_name = "function"; |
479 process_data.tasks.back().birth.location.line_number = 1337; | 486 process_data.tasks.back().birth.location.line_number = 1337; |
480 process_data.tasks.back().birth.thread_name = "birth_thread"; | 487 process_data.tasks.back().birth.thread_name = "birth_thread"; |
481 process_data.tasks.back().death_data.count = 37; | 488 process_data.tasks.back().death_data.count = 37; |
482 process_data.tasks.back().death_data.run_duration_sum = 31; | 489 process_data.tasks.back().death_data.run_duration_sum = 31; |
483 process_data.tasks.back().death_data.run_duration_max = 17; | 490 process_data.tasks.back().death_data.run_duration_max = 17; |
484 process_data.tasks.back().death_data.run_duration_sample = 13; | 491 process_data.tasks.back().death_data.run_duration_sample = 13; |
485 process_data.tasks.back().death_data.queue_duration_sum = 8; | 492 process_data.tasks.back().death_data.queue_duration_sum = 8; |
486 process_data.tasks.back().death_data.queue_duration_max = 5; | 493 process_data.tasks.back().death_data.queue_duration_max = 5; |
487 process_data.tasks.back().death_data.queue_duration_sample = 3; | 494 process_data.tasks.back().death_data.queue_duration_sample = 3; |
488 process_data.tasks.back().death_thread_name = "Still_Alive"; | 495 process_data.tasks.back().death_thread_name = "Still_Alive"; |
489 process_data.tasks.push_back(TaskSnapshot()); | 496 process_data.tasks.push_back(TaskSnapshot()); |
490 process_data.tasks.back().birth.location.file_name = "file2"; | 497 process_data.tasks.back().birth.location.file_name = "c\\d\\file2"; |
491 process_data.tasks.back().birth.location.function_name = "function2"; | 498 process_data.tasks.back().birth.location.function_name = "function2"; |
492 process_data.tasks.back().birth.location.line_number = 1773; | 499 process_data.tasks.back().birth.location.line_number = 1773; |
493 process_data.tasks.back().birth.thread_name = "birth_thread2"; | 500 process_data.tasks.back().birth.thread_name = "birth_thread2"; |
494 process_data.tasks.back().death_data.count = 19; | 501 process_data.tasks.back().death_data.count = 19; |
495 process_data.tasks.back().death_data.run_duration_sum = 23; | 502 process_data.tasks.back().death_data.run_duration_sum = 23; |
496 process_data.tasks.back().death_data.run_duration_max = 11; | 503 process_data.tasks.back().death_data.run_duration_max = 11; |
497 process_data.tasks.back().death_data.run_duration_sample = 7; | 504 process_data.tasks.back().death_data.run_duration_sample = 7; |
498 process_data.tasks.back().death_data.queue_duration_sum = 0; | 505 process_data.tasks.back().death_data.queue_duration_sum = 0; |
499 process_data.tasks.back().death_data.queue_duration_max = 0; | 506 process_data.tasks.back().death_data.queue_duration_max = 0; |
500 process_data.tasks.back().death_data.queue_duration_sample = 0; | 507 process_data.tasks.back().death_data.queue_duration_sample = 0; |
501 process_data.tasks.back().death_thread_name = "death_thread"; | 508 process_data.tasks.back().death_thread_name = "death_thread"; |
502 | 509 |
503 log.RecordProfilerData(process_data, content::PROCESS_TYPE_BROWSER); | 510 log.RecordProfilerData(process_data, content::PROCESS_TYPE_BROWSER); |
504 ASSERT_EQ(1, log.uma_proto().profiler_event_size()); | 511 ASSERT_EQ(1, log.uma_proto().profiler_event_size()); |
505 EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, | 512 EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, |
506 log.uma_proto().profiler_event(0).profile_type()); | 513 log.uma_proto().profiler_event(0).profile_type()); |
507 EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, | 514 EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, |
508 log.uma_proto().profiler_event(0).time_source()); | 515 log.uma_proto().profiler_event(0).time_source()); |
509 | 516 |
510 ASSERT_EQ(2, log.uma_proto().profiler_event(0).tracked_object_size()); | 517 ASSERT_EQ(2, log.uma_proto().profiler_event(0).tracked_object_size()); |
511 | 518 |
512 const ProfilerEventProto::TrackedObject* tracked_object = | 519 const ProfilerEventProto::TrackedObject* tracked_object = |
513 &log.uma_proto().profiler_event(0).tracked_object(0); | 520 &log.uma_proto().profiler_event(0).tracked_object(0); |
514 EXPECT_EQ(GG_UINT64_C(10123486280357988687), | 521 EXPECT_EQ(metrics::HashMetricName("file.h"), |
515 tracked_object->source_file_name_hash()); | 522 tracked_object->source_file_name_hash()); |
516 EXPECT_EQ(GG_UINT64_C(13962325592283560029), | 523 EXPECT_EQ(metrics::HashMetricName("function"), |
517 tracked_object->source_function_name_hash()); | 524 tracked_object->source_function_name_hash()); |
518 EXPECT_EQ(1337, tracked_object->source_line_number()); | 525 EXPECT_EQ(1337, tracked_object->source_line_number()); |
519 EXPECT_EQ(GG_UINT64_C(3400908935414830400), | 526 EXPECT_EQ(metrics::HashMetricName("birth_thread"), |
520 tracked_object->birth_thread_name_hash()); | 527 tracked_object->birth_thread_name_hash()); |
521 EXPECT_EQ(37, tracked_object->exec_count()); | 528 EXPECT_EQ(37, tracked_object->exec_count()); |
522 EXPECT_EQ(31, tracked_object->exec_time_total()); | 529 EXPECT_EQ(31, tracked_object->exec_time_total()); |
523 EXPECT_EQ(13, tracked_object->exec_time_sampled()); | 530 EXPECT_EQ(13, tracked_object->exec_time_sampled()); |
524 EXPECT_EQ(8, tracked_object->queue_time_total()); | 531 EXPECT_EQ(8, tracked_object->queue_time_total()); |
525 EXPECT_EQ(3, tracked_object->queue_time_sampled()); | 532 EXPECT_EQ(3, tracked_object->queue_time_sampled()); |
526 EXPECT_EQ(GG_UINT64_C(10151977472163283085), | 533 EXPECT_EQ(metrics::HashMetricName("Still_Alive"), |
527 tracked_object->exec_thread_name_hash()); | 534 tracked_object->exec_thread_name_hash()); |
528 EXPECT_EQ(177U, tracked_object->process_id()); | 535 EXPECT_EQ(177U, tracked_object->process_id()); |
529 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | 536 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, |
530 tracked_object->process_type()); | 537 tracked_object->process_type()); |
531 | 538 |
532 tracked_object = &log.uma_proto().profiler_event(0).tracked_object(1); | 539 tracked_object = &log.uma_proto().profiler_event(0).tracked_object(1); |
533 EXPECT_EQ(GG_UINT64_C(2025659946535236365), | 540 EXPECT_EQ(metrics::HashMetricName("file2"), |
534 tracked_object->source_file_name_hash()); | 541 tracked_object->source_file_name_hash()); |
535 EXPECT_EQ(GG_UINT64_C(55232426147951219), | 542 EXPECT_EQ(metrics::HashMetricName("function2"), |
536 tracked_object->source_function_name_hash()); | 543 tracked_object->source_function_name_hash()); |
537 EXPECT_EQ(1773, tracked_object->source_line_number()); | 544 EXPECT_EQ(1773, tracked_object->source_line_number()); |
538 EXPECT_EQ(GG_UINT64_C(1518842999910132863), | 545 EXPECT_EQ(metrics::HashMetricName("birth_thread*"), |
539 tracked_object->birth_thread_name_hash()); | 546 tracked_object->birth_thread_name_hash()); |
540 EXPECT_EQ(19, tracked_object->exec_count()); | 547 EXPECT_EQ(19, tracked_object->exec_count()); |
541 EXPECT_EQ(23, tracked_object->exec_time_total()); | 548 EXPECT_EQ(23, tracked_object->exec_time_total()); |
542 EXPECT_EQ(7, tracked_object->exec_time_sampled()); | 549 EXPECT_EQ(7, tracked_object->exec_time_sampled()); |
543 EXPECT_EQ(0, tracked_object->queue_time_total()); | 550 EXPECT_EQ(0, tracked_object->queue_time_total()); |
544 EXPECT_EQ(0, tracked_object->queue_time_sampled()); | 551 EXPECT_EQ(0, tracked_object->queue_time_sampled()); |
545 EXPECT_EQ(GG_UINT64_C(14275151213201158253), | 552 EXPECT_EQ(metrics::HashMetricName("death_thread"), |
546 tracked_object->exec_thread_name_hash()); | 553 tracked_object->exec_thread_name_hash()); |
547 EXPECT_EQ(177U, tracked_object->process_id()); | 554 EXPECT_EQ(177U, tracked_object->process_id()); |
548 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | 555 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, |
549 tracked_object->process_type()); | 556 tracked_object->process_type()); |
550 } | 557 } |
551 | 558 |
552 { | 559 { |
553 ProcessDataSnapshot process_data; | 560 ProcessDataSnapshot process_data; |
554 process_data.process_id = 1177; | 561 process_data.process_id = 1177; |
555 process_data.tasks.push_back(TaskSnapshot()); | 562 process_data.tasks.push_back(TaskSnapshot()); |
556 process_data.tasks.back().birth.location.file_name = "file3"; | 563 process_data.tasks.back().birth.location.file_name = "file3"; |
557 process_data.tasks.back().birth.location.function_name = "function3"; | 564 process_data.tasks.back().birth.location.function_name = "function3"; |
558 process_data.tasks.back().birth.location.line_number = 7331; | 565 process_data.tasks.back().birth.location.line_number = 7331; |
559 process_data.tasks.back().birth.thread_name = "birth_thread3"; | 566 process_data.tasks.back().birth.thread_name = "birth_thread3"; |
560 process_data.tasks.back().death_data.count = 137; | 567 process_data.tasks.back().death_data.count = 137; |
561 process_data.tasks.back().death_data.run_duration_sum = 131; | 568 process_data.tasks.back().death_data.run_duration_sum = 131; |
562 process_data.tasks.back().death_data.run_duration_max = 117; | 569 process_data.tasks.back().death_data.run_duration_max = 117; |
563 process_data.tasks.back().death_data.run_duration_sample = 113; | 570 process_data.tasks.back().death_data.run_duration_sample = 113; |
564 process_data.tasks.back().death_data.queue_duration_sum = 108; | 571 process_data.tasks.back().death_data.queue_duration_sum = 108; |
565 process_data.tasks.back().death_data.queue_duration_max = 105; | 572 process_data.tasks.back().death_data.queue_duration_max = 105; |
566 process_data.tasks.back().death_data.queue_duration_sample = 103; | 573 process_data.tasks.back().death_data.queue_duration_sample = 103; |
567 process_data.tasks.back().death_thread_name = "death_thread3"; | 574 process_data.tasks.back().death_thread_name = "death_thread3"; |
575 process_data.tasks.push_back(TaskSnapshot()); | |
576 process_data.tasks.back().birth.location.file_name = ""; | |
577 process_data.tasks.back().birth.location.function_name = ""; | |
578 process_data.tasks.back().birth.location.line_number = 7332; | |
579 process_data.tasks.back().birth.thread_name = ""; | |
580 process_data.tasks.back().death_data.count = 138; | |
581 process_data.tasks.back().death_data.run_duration_sum = 132; | |
582 process_data.tasks.back().death_data.run_duration_max = 118; | |
583 process_data.tasks.back().death_data.run_duration_sample = 114; | |
584 process_data.tasks.back().death_data.queue_duration_sum = 109; | |
585 process_data.tasks.back().death_data.queue_duration_max = 106; | |
586 process_data.tasks.back().death_data.queue_duration_sample = 104; | |
587 process_data.tasks.back().death_thread_name = ""; | |
568 | 588 |
569 log.RecordProfilerData(process_data, content::PROCESS_TYPE_RENDERER); | 589 log.RecordProfilerData(process_data, content::PROCESS_TYPE_RENDERER); |
570 ASSERT_EQ(1, log.uma_proto().profiler_event_size()); | 590 ASSERT_EQ(1, log.uma_proto().profiler_event_size()); |
571 EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, | 591 EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, |
572 log.uma_proto().profiler_event(0).profile_type()); | 592 log.uma_proto().profiler_event(0).profile_type()); |
573 EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, | 593 EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, |
574 log.uma_proto().profiler_event(0).time_source()); | 594 log.uma_proto().profiler_event(0).time_source()); |
575 ASSERT_EQ(3, log.uma_proto().profiler_event(0).tracked_object_size()); | 595 ASSERT_EQ(4, log.uma_proto().profiler_event(0).tracked_object_size()); |
576 | 596 |
577 const ProfilerEventProto::TrackedObject* tracked_object = | 597 const ProfilerEventProto::TrackedObject* tracked_object = |
578 &log.uma_proto().profiler_event(0).tracked_object(2); | 598 &log.uma_proto().profiler_event(0).tracked_object(2); |
579 EXPECT_EQ(GG_UINT64_C(2686523203278102732), | 599 EXPECT_EQ(metrics::HashMetricName("file3"), |
580 tracked_object->source_file_name_hash()); | 600 tracked_object->source_file_name_hash()); |
581 EXPECT_EQ(GG_UINT64_C(5081672290546182009), | 601 EXPECT_EQ(metrics::HashMetricName("function3"), |
582 tracked_object->source_function_name_hash()); | 602 tracked_object->source_function_name_hash()); |
583 EXPECT_EQ(7331, tracked_object->source_line_number()); | 603 EXPECT_EQ(7331, tracked_object->source_line_number()); |
584 EXPECT_EQ(GG_UINT64_C(1518842999910132863), | 604 EXPECT_EQ(metrics::HashMetricName("birth_thread*"), |
585 tracked_object->birth_thread_name_hash()); | 605 tracked_object->birth_thread_name_hash()); |
586 EXPECT_EQ(137, tracked_object->exec_count()); | 606 EXPECT_EQ(137, tracked_object->exec_count()); |
587 EXPECT_EQ(131, tracked_object->exec_time_total()); | 607 EXPECT_EQ(131, tracked_object->exec_time_total()); |
588 EXPECT_EQ(113, tracked_object->exec_time_sampled()); | 608 EXPECT_EQ(113, tracked_object->exec_time_sampled()); |
589 EXPECT_EQ(108, tracked_object->queue_time_total()); | 609 EXPECT_EQ(108, tracked_object->queue_time_total()); |
590 EXPECT_EQ(103, tracked_object->queue_time_sampled()); | 610 EXPECT_EQ(103, tracked_object->queue_time_sampled()); |
591 EXPECT_EQ(GG_UINT64_C(2203893603452504755), | 611 EXPECT_EQ(metrics::HashMetricName("death_thread*"), |
592 tracked_object->exec_thread_name_hash()); | 612 tracked_object->exec_thread_name_hash()); |
593 EXPECT_EQ(1177U, tracked_object->process_id()); | 613 EXPECT_EQ(1177U, tracked_object->process_id()); |
594 EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, | 614 EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, |
595 tracked_object->process_type()); | 615 tracked_object->process_type()); |
616 | |
617 tracked_object = &log.uma_proto().profiler_event(0).tracked_object(3); | |
618 EXPECT_EQ(metrics::HashMetricName(""), | |
619 tracked_object->source_file_name_hash()); | |
620 EXPECT_EQ(metrics::HashMetricName(""), | |
621 tracked_object->source_function_name_hash()); | |
622 EXPECT_EQ(7332, tracked_object->source_line_number()); | |
623 EXPECT_EQ(metrics::HashMetricName(""), | |
624 tracked_object->birth_thread_name_hash()); | |
625 EXPECT_EQ(138, tracked_object->exec_count()); | |
626 EXPECT_EQ(132, tracked_object->exec_time_total()); | |
627 EXPECT_EQ(114, tracked_object->exec_time_sampled()); | |
628 EXPECT_EQ(109, tracked_object->queue_time_total()); | |
629 EXPECT_EQ(104, tracked_object->queue_time_sampled()); | |
630 EXPECT_EQ(metrics::HashMetricName(""), | |
631 tracked_object->exec_thread_name_hash()); | |
632 EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, | |
633 tracked_object->process_type()); | |
596 } | 634 } |
597 } | 635 } |
598 | 636 |
599 #if defined(OS_CHROMEOS) | 637 #if defined(OS_CHROMEOS) |
600 TEST_F(MetricsLogTest, MultiProfileUserCount) { | 638 TEST_F(MetricsLogTest, MultiProfileUserCount) { |
601 std::string user1("user1@example.com"); | 639 std::string user1("user1@example.com"); |
602 std::string user2("user2@example.com"); | 640 std::string user2("user2@example.com"); |
603 std::string user3("user3@example.com"); | 641 std::string user3("user3@example.com"); |
604 | 642 |
605 // |scoped_enabler| takes over the lifetime of |user_manager|. | 643 // |scoped_enabler| takes over the lifetime of |user_manager|. |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
727 PairedDevice device2 = | 765 PairedDevice device2 = |
728 log.system_profile().hardware().bluetooth().paired_device(1); | 766 log.system_profile().hardware().bluetooth().paired_device(1); |
729 | 767 |
730 EXPECT_EQ(FakeBluetoothDeviceClient::kConfirmPasskeyClass, | 768 EXPECT_EQ(FakeBluetoothDeviceClient::kConfirmPasskeyClass, |
731 device2.bluetooth_class()); | 769 device2.bluetooth_class()); |
732 EXPECT_EQ(PairedDevice::DEVICE_PHONE, device2.type()); | 770 EXPECT_EQ(PairedDevice::DEVICE_PHONE, device2.type()); |
733 EXPECT_EQ(0x207D74U, device2.vendor_prefix()); | 771 EXPECT_EQ(0x207D74U, device2.vendor_prefix()); |
734 EXPECT_EQ(PairedDevice::VENDOR_ID_UNKNOWN, device2.vendor_id_source()); | 772 EXPECT_EQ(PairedDevice::VENDOR_ID_UNKNOWN, device2.vendor_id_source()); |
735 } | 773 } |
736 #endif // OS_CHROMEOS | 774 #endif // OS_CHROMEOS |
OLD | NEW |