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

Side by Side Diff: chrome/browser/google_apis/fake_drive_service_unittest.cc

Issue 14215003: Add ProgressCallback to DriveServiceInterface::DownloadFile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 8 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 | Annotate | Revision Log
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/google_apis/fake_drive_service.h" 5 #include "chrome/browser/google_apis/fake_drive_service.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 test_util::CreateCopyResultCallback(&error, &about_resource)); 84 test_util::CreateCopyResultCallback(&error, &about_resource));
85 message_loop_.RunUntilIdle(); 85 message_loop_.RunUntilIdle();
86 return about_resource->largest_change_id(); 86 return about_resource->largest_change_id();
87 } 87 }
88 88
89 MessageLoopForUI message_loop_; 89 MessageLoopForUI message_loop_;
90 content::TestBrowserThread ui_thread_; 90 content::TestBrowserThread ui_thread_;
91 FakeDriveService fake_service_; 91 FakeDriveService fake_service_;
92 }; 92 };
93 93
94 void AppendProgressCallbackResult(std::vector<int64>* values,
95 int64 progress,
96 int64 total) {
97 values->push_back(progress);
98 }
99
100 TEST_F(FakeDriveServiceTest, GetAllResourceList) { 94 TEST_F(FakeDriveServiceTest, GetAllResourceList) {
101 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 95 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
102 "chromeos/gdata/root_feed.json")); 96 "chromeos/gdata/root_feed.json"));
103 97
104 GDataErrorCode error = GDATA_OTHER_ERROR; 98 GDataErrorCode error = GDATA_OTHER_ERROR;
105 scoped_ptr<ResourceList> resource_list; 99 scoped_ptr<ResourceList> resource_list;
106 fake_service_.GetAllResourceList( 100 fake_service_.GetAllResourceList(
107 test_util::CreateCopyResultCallback(&error, &resource_list)); 101 test_util::CreateCopyResultCallback(&error, &resource_list));
108 message_loop_.RunUntilIdle(); 102 message_loop_.RunUntilIdle();
109 103
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 EXPECT_EQ(GDATA_NO_CONNECTION, error); 838 EXPECT_EQ(GDATA_NO_CONNECTION, error);
845 } 839 }
846 840
847 TEST_F(FakeDriveServiceTest, DownloadFile_ExistingFile) { 841 TEST_F(FakeDriveServiceTest, DownloadFile_ExistingFile) {
848 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 842 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
849 "chromeos/gdata/root_feed.json")); 843 "chromeos/gdata/root_feed.json"));
850 844
851 base::ScopedTempDir temp_dir; 845 base::ScopedTempDir temp_dir;
852 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 846 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
853 847
848 std::vector<test_util::ProgressInfo> download_progress_values;
849
854 const GURL kContentUrl("https://file_content_url/"); 850 const GURL kContentUrl("https://file_content_url/");
855 const base::FilePath kOutputFilePath = 851 const base::FilePath kOutputFilePath =
856 temp_dir.path().AppendASCII("whatever.txt"); 852 temp_dir.path().AppendASCII("whatever.txt");
857 GDataErrorCode error = GDATA_OTHER_ERROR; 853 GDataErrorCode error = GDATA_OTHER_ERROR;
858 base::FilePath output_file_path; 854 base::FilePath output_file_path;
859 fake_service_.DownloadFile( 855 fake_service_.DownloadFile(
860 base::FilePath::FromUTF8Unsafe("/drive/whatever.txt"), // virtual path 856 base::FilePath::FromUTF8Unsafe("/drive/whatever.txt"), // virtual path
861 kOutputFilePath, 857 kOutputFilePath,
862 kContentUrl, 858 kContentUrl,
863 test_util::CreateCopyResultCallback(&error, &output_file_path), 859 test_util::CreateCopyResultCallback(&error, &output_file_path),
864 GetContentCallback()); 860 GetContentCallback(),
861 base::Bind(&test_util::AppendProgressCallbackResult,
862 &download_progress_values));
865 message_loop_.RunUntilIdle(); 863 message_loop_.RunUntilIdle();
866 864
867 EXPECT_EQ(HTTP_SUCCESS, error); 865 EXPECT_EQ(HTTP_SUCCESS, error);
868 EXPECT_EQ(output_file_path, kOutputFilePath); 866 EXPECT_EQ(output_file_path, kOutputFilePath);
869 std::string content; 867 std::string content;
870 ASSERT_TRUE(file_util::ReadFileToString(output_file_path, &content)); 868 ASSERT_TRUE(file_util::ReadFileToString(output_file_path, &content));
871 // The content is "x"s of the file size specified in root_feed.json. 869 // The content is "x"s of the file size specified in root_feed.json.
872 EXPECT_EQ("xxxxxxxxxx", content); 870 EXPECT_EQ("xxxxxxxxxx", content);
871 ASSERT_TRUE(!download_progress_values.empty());
872 EXPECT_TRUE(base::STLIsSorted(download_progress_values));
873 EXPECT_GE(download_progress_values.front().first, 0);
874 EXPECT_LE(download_progress_values.back().first, 10);
873 } 875 }
874 876
875 TEST_F(FakeDriveServiceTest, DownloadFile_NonexistingFile) { 877 TEST_F(FakeDriveServiceTest, DownloadFile_NonexistingFile) {
876 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 878 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
877 "chromeos/gdata/root_feed.json")); 879 "chromeos/gdata/root_feed.json"));
878 880
879 base::ScopedTempDir temp_dir; 881 base::ScopedTempDir temp_dir;
880 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 882 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
881 883
882 const GURL kContentUrl("https://non_existing_content_url/"); 884 const GURL kContentUrl("https://non_existing_content_url/");
883 const base::FilePath kOutputFilePath = 885 const base::FilePath kOutputFilePath =
884 temp_dir.path().AppendASCII("whatever.txt"); 886 temp_dir.path().AppendASCII("whatever.txt");
885 GDataErrorCode error = GDATA_OTHER_ERROR; 887 GDataErrorCode error = GDATA_OTHER_ERROR;
886 base::FilePath output_file_path; 888 base::FilePath output_file_path;
887 fake_service_.DownloadFile( 889 fake_service_.DownloadFile(
888 base::FilePath::FromUTF8Unsafe("/drive/whatever.txt"), // virtual path 890 base::FilePath::FromUTF8Unsafe("/drive/whatever.txt"), // virtual path
889 kOutputFilePath, 891 kOutputFilePath,
890 kContentUrl, 892 kContentUrl,
891 test_util::CreateCopyResultCallback(&error, &output_file_path), 893 test_util::CreateCopyResultCallback(&error, &output_file_path),
892 GetContentCallback()); 894 GetContentCallback(),
895 ProgressCallback());
893 message_loop_.RunUntilIdle(); 896 message_loop_.RunUntilIdle();
894 897
895 EXPECT_EQ(HTTP_NOT_FOUND, error); 898 EXPECT_EQ(HTTP_NOT_FOUND, error);
896 } 899 }
897 900
898 TEST_F(FakeDriveServiceTest, DownloadFile_Offline) { 901 TEST_F(FakeDriveServiceTest, DownloadFile_Offline) {
899 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 902 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
900 "chromeos/gdata/root_feed.json")); 903 "chromeos/gdata/root_feed.json"));
901 fake_service_.set_offline(true); 904 fake_service_.set_offline(true);
902 905
903 base::ScopedTempDir temp_dir; 906 base::ScopedTempDir temp_dir;
904 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 907 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
905 908
906 const GURL kContentUrl("https://file_content_url/"); 909 const GURL kContentUrl("https://file_content_url/");
907 const base::FilePath kOutputFilePath = 910 const base::FilePath kOutputFilePath =
908 temp_dir.path().AppendASCII("whatever.txt"); 911 temp_dir.path().AppendASCII("whatever.txt");
909 GDataErrorCode error = GDATA_OTHER_ERROR; 912 GDataErrorCode error = GDATA_OTHER_ERROR;
910 base::FilePath output_file_path; 913 base::FilePath output_file_path;
911 fake_service_.DownloadFile( 914 fake_service_.DownloadFile(
912 base::FilePath::FromUTF8Unsafe("/drive/whatever.txt"), // virtual path 915 base::FilePath::FromUTF8Unsafe("/drive/whatever.txt"), // virtual path
913 kOutputFilePath, 916 kOutputFilePath,
914 kContentUrl, 917 kContentUrl,
915 test_util::CreateCopyResultCallback(&error, &output_file_path), 918 test_util::CreateCopyResultCallback(&error, &output_file_path),
916 GetContentCallback()); 919 GetContentCallback(),
920 ProgressCallback());
917 message_loop_.RunUntilIdle(); 921 message_loop_.RunUntilIdle();
918 922
919 EXPECT_EQ(GDATA_NO_CONNECTION, error); 923 EXPECT_EQ(GDATA_NO_CONNECTION, error);
920 } 924 }
921 925
922 TEST_F(FakeDriveServiceTest, CopyHostedDocument_ExistingHostedDocument) { 926 TEST_F(FakeDriveServiceTest, CopyHostedDocument_ExistingHostedDocument) {
923 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 927 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
924 "chromeos/gdata/root_feed.json")); 928 "chromeos/gdata/root_feed.json"));
925 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 929 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi(
926 "chromeos/gdata/account_metadata.json")); 930 "chromeos/gdata/account_metadata.json"));
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
1618 15, 1622 15,
1619 "file:2_file_resource_id", 1623 "file:2_file_resource_id",
1620 "\"HhMOFgxXHit7ImBr\"", 1624 "\"HhMOFgxXHit7ImBr\"",
1621 test_util::CreateCopyResultCallback(&error, &upload_location)); 1625 test_util::CreateCopyResultCallback(&error, &upload_location));
1622 message_loop_.RunUntilIdle(); 1626 message_loop_.RunUntilIdle();
1623 1627
1624 ASSERT_EQ(HTTP_SUCCESS, error); 1628 ASSERT_EQ(HTTP_SUCCESS, error);
1625 1629
1626 UploadRangeResponse response; 1630 UploadRangeResponse response;
1627 scoped_ptr<ResourceEntry> entry; 1631 scoped_ptr<ResourceEntry> entry;
1628 std::vector<int64> upload_progress_values; 1632 std::vector<test_util::ProgressInfo> upload_progress_values;
1629 fake_service_.ResumeUpload( 1633 fake_service_.ResumeUpload(
1630 UPLOAD_EXISTING_FILE, 1634 UPLOAD_EXISTING_FILE,
1631 base::FilePath(FILE_PATH_LITERAL("drive/File 1.txt")), 1635 base::FilePath(FILE_PATH_LITERAL("drive/File 1.txt")),
1632 upload_location, 1636 upload_location,
1633 0, 13, 15, "text/plain", 1637 0, 13, 15, "text/plain",
1634 scoped_refptr<net::IOBuffer>(), 1638 scoped_refptr<net::IOBuffer>(),
1635 test_util::CreateCopyResultCallback(&response, &entry), 1639 test_util::CreateCopyResultCallback(&response, &entry),
1636 base::Bind(&AppendProgressCallbackResult, &upload_progress_values)); 1640 base::Bind(&test_util::AppendProgressCallbackResult,
1641 &upload_progress_values));
1637 message_loop_.RunUntilIdle(); 1642 message_loop_.RunUntilIdle();
1638 1643
1639 EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code); 1644 EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code);
1640 EXPECT_FALSE(entry.get()); 1645 EXPECT_FALSE(entry.get());
1641 ASSERT_TRUE(!upload_progress_values.empty()); 1646 ASSERT_TRUE(!upload_progress_values.empty());
1642 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1647 EXPECT_TRUE(base::STLIsSorted(upload_progress_values));
1643 EXPECT_GE(upload_progress_values.front(), 0); 1648 EXPECT_GE(upload_progress_values.front().first, 0);
1644 EXPECT_LE(upload_progress_values.back(), 13); 1649 EXPECT_LE(upload_progress_values.back().first, 13);
1645 1650
1646 upload_progress_values.clear(); 1651 upload_progress_values.clear();
1647 fake_service_.ResumeUpload( 1652 fake_service_.ResumeUpload(
1648 UPLOAD_EXISTING_FILE, 1653 UPLOAD_EXISTING_FILE,
1649 base::FilePath(FILE_PATH_LITERAL("drive/File 1.txt")), 1654 base::FilePath(FILE_PATH_LITERAL("drive/File 1.txt")),
1650 upload_location, 1655 upload_location,
1651 13, 15, 15, "text/plain", 1656 13, 15, 15, "text/plain",
1652 scoped_refptr<net::IOBuffer>(), 1657 scoped_refptr<net::IOBuffer>(),
1653 test_util::CreateCopyResultCallback(&response, &entry), 1658 test_util::CreateCopyResultCallback(&response, &entry),
1654 base::Bind(&AppendProgressCallbackResult, &upload_progress_values)); 1659 base::Bind(&test_util::AppendProgressCallbackResult,
1660 &upload_progress_values));
1655 message_loop_.RunUntilIdle(); 1661 message_loop_.RunUntilIdle();
1656 1662
1657 EXPECT_EQ(HTTP_SUCCESS, response.code); 1663 EXPECT_EQ(HTTP_SUCCESS, response.code);
1658 EXPECT_TRUE(entry.get()); 1664 EXPECT_TRUE(entry.get());
1659 EXPECT_EQ(15L, entry->file_size()); 1665 EXPECT_EQ(15L, entry->file_size());
1660 EXPECT_TRUE(Exists(entry->resource_id())); 1666 EXPECT_TRUE(Exists(entry->resource_id()));
1661 ASSERT_TRUE(!upload_progress_values.empty()); 1667 ASSERT_TRUE(!upload_progress_values.empty());
1662 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1668 EXPECT_TRUE(base::STLIsSorted(upload_progress_values));
1663 EXPECT_GE(upload_progress_values.front(), 0); 1669 EXPECT_GE(upload_progress_values.front().first, 0);
1664 EXPECT_LE(upload_progress_values.back(), 2); 1670 EXPECT_LE(upload_progress_values.back().first, 2);
1665 } 1671 }
1666 1672
1667 TEST_F(FakeDriveServiceTest, ResumeUpload_NewFile) { 1673 TEST_F(FakeDriveServiceTest, ResumeUpload_NewFile) {
1668 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1674 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1669 "chromeos/gdata/root_feed.json")); 1675 "chromeos/gdata/root_feed.json"));
1670 1676
1671 GDataErrorCode error = GDATA_OTHER_ERROR; 1677 GDataErrorCode error = GDATA_OTHER_ERROR;
1672 GURL upload_location; 1678 GURL upload_location;
1673 fake_service_.InitiateUploadNewFile( 1679 fake_service_.InitiateUploadNewFile(
1674 base::FilePath(FILE_PATH_LITERAL("drive/Directory 1/new file.foo")), 1680 base::FilePath(FILE_PATH_LITERAL("drive/Directory 1/new file.foo")),
1675 "test/foo", 1681 "test/foo",
1676 15, 1682 15,
1677 "folder:1_folder_resource_id", 1683 "folder:1_folder_resource_id",
1678 "new file.foo", 1684 "new file.foo",
1679 test_util::CreateCopyResultCallback(&error, &upload_location)); 1685 test_util::CreateCopyResultCallback(&error, &upload_location));
1680 message_loop_.RunUntilIdle(); 1686 message_loop_.RunUntilIdle();
1681 1687
1682 EXPECT_EQ(HTTP_SUCCESS, error); 1688 EXPECT_EQ(HTTP_SUCCESS, error);
1683 EXPECT_FALSE(upload_location.is_empty()); 1689 EXPECT_FALSE(upload_location.is_empty());
1684 EXPECT_NE(GURL("https://1_folder_resumable_create_media_link"), 1690 EXPECT_NE(GURL("https://1_folder_resumable_create_media_link"),
1685 upload_location); 1691 upload_location);
1686 1692
1687 UploadRangeResponse response; 1693 UploadRangeResponse response;
1688 scoped_ptr<ResourceEntry> entry; 1694 scoped_ptr<ResourceEntry> entry;
1689 std::vector<int64> upload_progress_values; 1695 std::vector<test_util::ProgressInfo> upload_progress_values;
1690 fake_service_.ResumeUpload( 1696 fake_service_.ResumeUpload(
1691 UPLOAD_NEW_FILE, 1697 UPLOAD_NEW_FILE,
1692 base::FilePath(FILE_PATH_LITERAL("drive/Directory 1/new file.foo")), 1698 base::FilePath(FILE_PATH_LITERAL("drive/Directory 1/new file.foo")),
1693 upload_location, 1699 upload_location,
1694 0, 13, 15, "test/foo", 1700 0, 13, 15, "test/foo",
1695 scoped_refptr<net::IOBuffer>(), 1701 scoped_refptr<net::IOBuffer>(),
1696 test_util::CreateCopyResultCallback(&response, &entry), 1702 test_util::CreateCopyResultCallback(&response, &entry),
1697 base::Bind(&AppendProgressCallbackResult, &upload_progress_values)); 1703 base::Bind(&test_util::AppendProgressCallbackResult,
1704 &upload_progress_values));
1698 message_loop_.RunUntilIdle(); 1705 message_loop_.RunUntilIdle();
1699 1706
1700 EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code); 1707 EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code);
1701 EXPECT_FALSE(entry.get()); 1708 EXPECT_FALSE(entry.get());
1702 ASSERT_TRUE(!upload_progress_values.empty()); 1709 ASSERT_TRUE(!upload_progress_values.empty());
1703 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1710 EXPECT_TRUE(base::STLIsSorted(upload_progress_values));
1704 EXPECT_GE(upload_progress_values.front(), 0); 1711 EXPECT_GE(upload_progress_values.front().first, 0);
1705 EXPECT_LE(upload_progress_values.back(), 13); 1712 EXPECT_LE(upload_progress_values.back().first, 13);
1706 1713
1707 upload_progress_values.clear(); 1714 upload_progress_values.clear();
1708 fake_service_.ResumeUpload( 1715 fake_service_.ResumeUpload(
1709 UPLOAD_NEW_FILE, 1716 UPLOAD_NEW_FILE,
1710 base::FilePath(FILE_PATH_LITERAL("drive/Directory 1/new file.foo")), 1717 base::FilePath(FILE_PATH_LITERAL("drive/Directory 1/new file.foo")),
1711 upload_location, 1718 upload_location,
1712 13, 15, 15, "test/foo", 1719 13, 15, 15, "test/foo",
1713 scoped_refptr<net::IOBuffer>(), 1720 scoped_refptr<net::IOBuffer>(),
1714 test_util::CreateCopyResultCallback(&response, &entry), 1721 test_util::CreateCopyResultCallback(&response, &entry),
1715 base::Bind(&AppendProgressCallbackResult, &upload_progress_values)); 1722 base::Bind(&test_util::AppendProgressCallbackResult,
1723 &upload_progress_values));
1716 message_loop_.RunUntilIdle(); 1724 message_loop_.RunUntilIdle();
1717 1725
1718 EXPECT_EQ(HTTP_CREATED, response.code); 1726 EXPECT_EQ(HTTP_CREATED, response.code);
1719 EXPECT_TRUE(entry.get()); 1727 EXPECT_TRUE(entry.get());
1720 EXPECT_EQ(15L, entry->file_size()); 1728 EXPECT_EQ(15L, entry->file_size());
1721 EXPECT_TRUE(Exists(entry->resource_id())); 1729 EXPECT_TRUE(Exists(entry->resource_id()));
1722 ASSERT_TRUE(!upload_progress_values.empty()); 1730 ASSERT_TRUE(!upload_progress_values.empty());
1723 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1731 EXPECT_TRUE(base::STLIsSorted(upload_progress_values));
1724 EXPECT_GE(upload_progress_values.front(), 0); 1732 EXPECT_GE(upload_progress_values.front().first, 0);
1725 EXPECT_LE(upload_progress_values.back(), 2); 1733 EXPECT_LE(upload_progress_values.back().first, 2);
1726 } 1734 }
1727 1735
1728 TEST_F(FakeDriveServiceTest, AddNewFile_ToRootDirectory) { 1736 TEST_F(FakeDriveServiceTest, AddNewFile_ToRootDirectory) {
1729 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1737 ASSERT_TRUE(fake_service_.LoadResourceListForWapi(
1730 "chromeos/gdata/root_feed.json")); 1738 "chromeos/gdata/root_feed.json"));
1731 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1739 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi(
1732 "chromeos/gdata/account_metadata.json")); 1740 "chromeos/gdata/account_metadata.json"));
1733 1741
1734 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1742 int64 old_largest_change_id = GetLargestChangeByAboutResource();
1735 1743
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1937 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1945 test_util::CreateCopyResultCallback(&error, &resource_entry));
1938 message_loop_.RunUntilIdle(); 1946 message_loop_.RunUntilIdle();
1939 1947
1940 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1948 EXPECT_EQ(GDATA_NO_CONNECTION, error);
1941 EXPECT_FALSE(resource_entry); 1949 EXPECT_FALSE(resource_entry);
1942 } 1950 }
1943 1951
1944 } // namespace 1952 } // namespace
1945 1953
1946 } // namespace google_apis 1954 } // namespace google_apis
OLDNEW
« no previous file with comments | « chrome/browser/google_apis/fake_drive_service.cc ('k') | chrome/browser/google_apis/gdata_wapi_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698