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

Side by Side Diff: content/browser/download/download_item_impl_unittest.cc

Issue 2799333002: Clear the received slices in DownloadItemImpl when etag changed. (Closed)
Patch Set: Address the uma issue. Created 3 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
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 "content/browser/download/download_item_impl.h" 5 #include "content/browser/download/download_item_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <deque> 9 #include <deque>
10 #include <iterator> 10 #include <iterator>
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 DownloadTargetCallback* callback) { 294 DownloadTargetCallback* callback) {
295 MockDownloadFile* mock_download_file = nullptr; 295 MockDownloadFile* mock_download_file = nullptr;
296 std::unique_ptr<DownloadFile> download_file; 296 std::unique_ptr<DownloadFile> download_file;
297 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) 297 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
298 .WillOnce(SaveArg<1>(callback)); 298 .WillOnce(SaveArg<1>(callback));
299 299
300 // Only create a DownloadFile if the request was successful. 300 // Only create a DownloadFile if the request was successful.
301 if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) { 301 if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) {
302 mock_download_file = new StrictMock<MockDownloadFile>; 302 mock_download_file = new StrictMock<MockDownloadFile>;
303 download_file.reset(mock_download_file); 303 download_file.reset(mock_download_file);
304 EXPECT_CALL(*mock_download_file, Initialize(_)) 304 EXPECT_CALL(*mock_download_file, Initialize(_, _))
305 .WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE)); 305 .WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE));
306 EXPECT_CALL(*mock_download_file, FullPath()) 306 EXPECT_CALL(*mock_download_file, FullPath())
307 .WillRepeatedly(ReturnRefOfCopy(base::FilePath())); 307 .WillRepeatedly(ReturnRefOfCopy(base::FilePath()));
308 } 308 }
309 309
310 std::unique_ptr<MockRequestHandle> request_handle = 310 std::unique_ptr<MockRequestHandle> request_handle =
311 base::MakeUnique<NiceMock<MockRequestHandle>>(); 311 base::MakeUnique<NiceMock<MockRequestHandle>>();
312 item->Start(std::move(download_file), std::move(request_handle), 312 item->Start(std::move(download_file), std::move(request_handle),
313 *create_info_); 313 *create_info_);
314 RunAllPendingInMessageLoops(); 314 RunAllPendingInMessageLoops();
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 } 586 }
587 587
588 TEST_F(DownloadItemTest, NotificationAfterTogglePause) { 588 TEST_F(DownloadItemTest, NotificationAfterTogglePause) {
589 DownloadItemImpl* item = CreateDownloadItem(); 589 DownloadItemImpl* item = CreateDownloadItem();
590 TestDownloadItemObserver observer(item); 590 TestDownloadItemObserver observer(item);
591 MockDownloadFile* mock_download_file(new MockDownloadFile); 591 MockDownloadFile* mock_download_file(new MockDownloadFile);
592 std::unique_ptr<DownloadFile> download_file(mock_download_file); 592 std::unique_ptr<DownloadFile> download_file(mock_download_file);
593 std::unique_ptr<DownloadRequestHandleInterface> request_handle( 593 std::unique_ptr<DownloadRequestHandleInterface> request_handle(
594 new NiceMock<MockRequestHandle>); 594 new NiceMock<MockRequestHandle>);
595 595
596 EXPECT_CALL(*mock_download_file, Initialize(_)); 596 EXPECT_CALL(*mock_download_file, Initialize(_, _));
597 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _)); 597 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _));
598 item->Start(std::move(download_file), std::move(request_handle), 598 item->Start(std::move(download_file), std::move(request_handle),
599 *create_info()); 599 *create_info());
600 600
601 item->Pause(); 601 item->Pause();
602 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); 602 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
603 603
604 ASSERT_TRUE(item->IsPaused()); 604 ASSERT_TRUE(item->IsPaused());
605 605
606 item->Resume(); 606 item->Resume();
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime()); 884 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime());
885 EXPECT_EQ(kFirstURL, item->GetURL().spec()); 885 EXPECT_EQ(kFirstURL, item->GetURL().spec());
886 EXPECT_EQ(kMimeType, item->GetMimeType()); 886 EXPECT_EQ(kMimeType, item->GetMimeType());
887 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); 887 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
888 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); 888 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason());
889 EXPECT_EQ(kDummyIntermediatePath, item->GetFullPath().value()); 889 EXPECT_EQ(kDummyIntermediatePath, item->GetFullPath().value());
890 EXPECT_EQ(1, item->GetReceivedBytes()); 890 EXPECT_EQ(1, item->GetReceivedBytes());
891 } 891 }
892 892
893 // If the download resumption request succeeds, the origin state should be 893 // If the download resumption request succeeds, the origin state should be
894 // updated 894 // updated.
895 TEST_F(DownloadItemTest, SucceededResumptionUpdatesOriginState) { 895 TEST_F(DownloadItemTest, SucceededResumptionUpdatesOriginState) {
896 const char kContentDisposition[] = "attachment; filename=foo"; 896 const char kContentDisposition[] = "attachment; filename=foo";
897 const char kFirstETag[] = "ABC"; 897 const char kFirstETag[] = "ABC";
898 const char kFirstLastModified[] = "Yesterday"; 898 const char kFirstLastModified[] = "Yesterday";
899 const char kFirstURL[] = "http://www.example.com/download"; 899 const char kFirstURL[] = "http://www.example.com/download";
900 const char kMimeType[] = "text/css"; 900 const char kMimeType[] = "text/css";
901 create_info()->content_disposition = kContentDisposition; 901 create_info()->content_disposition = kContentDisposition;
902 create_info()->etag = kFirstETag; 902 create_info()->etag = kFirstETag;
903 create_info()->last_modified = kFirstLastModified; 903 create_info()->last_modified = kFirstLastModified;
904 create_info()->url_chain.push_back(GURL(kFirstURL)); 904 create_info()->url_chain.push_back(GURL(kFirstURL));
(...skipping 29 matching lines...) Expand all
934 934
935 EXPECT_EQ(kSecondContentDisposition, item->GetContentDisposition()); 935 EXPECT_EQ(kSecondContentDisposition, item->GetContentDisposition());
936 EXPECT_EQ(kSecondETag, item->GetETag()); 936 EXPECT_EQ(kSecondETag, item->GetETag());
937 EXPECT_EQ(kSecondLastModified, item->GetLastModifiedTime()); 937 EXPECT_EQ(kSecondLastModified, item->GetLastModifiedTime());
938 EXPECT_EQ(kSecondURL, item->GetURL().spec()); 938 EXPECT_EQ(kSecondURL, item->GetURL().spec());
939 EXPECT_EQ(kSecondMimeType, item->GetMimeType()); 939 EXPECT_EQ(kSecondMimeType, item->GetMimeType());
940 940
941 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); 941 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS);
942 } 942 }
943 943
944 // Ensure when strong validators changed on resumption, the received
945 // slices should be cleared.
946 TEST_F(DownloadItemTest, ClearReceivedSliceIfEtagChanged) {
947 const char kFirstETag[] = "ABC";
948 const char kSecondETag[] = "123";
949 const DownloadItem::ReceivedSlices kReceivedSlice = {
950 DownloadItem::ReceivedSlice(0, 10)};
951 create_info()->etag = kFirstETag;
952
953 DownloadItemImpl* item = CreateDownloadItem();
954 MockDownloadFile* download_file =
955 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
956
957 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _));
958 EXPECT_CALL(*download_file, Detach());
959
960 item->DestinationObserverAsWeakPtr()->DestinationUpdate(10, 100,
961 kReceivedSlice);
962 EXPECT_EQ(kReceivedSlice, item->GetReceivedSlices());
963 EXPECT_EQ(10, item->GetReceivedBytes());
964
965 item->DestinationObserverAsWeakPtr()->DestinationError(
966 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 0,
967 std::unique_ptr<crypto::SecureHash>());
968 EXPECT_EQ(kReceivedSlice, item->GetReceivedSlices());
969
970 RunAllPendingInMessageLoops();
971
972 // Change the strong validator and resume the download, the received slices
973 // should be cleared.
974 create_info()->etag = kSecondETag;
975 DownloadTargetCallback target_callback;
976 download_file = CallDownloadItemStart(item, &target_callback);
977 EXPECT_TRUE(item->GetReceivedSlices().empty());
978 EXPECT_EQ(0, item->GetReceivedBytes());
979
980 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS);
981 }
982
944 // Test that resumption uses the final URL in a URL chain when resuming. 983 // Test that resumption uses the final URL in a URL chain when resuming.
945 TEST_F(DownloadItemTest, ResumeUsesFinalURL) { 984 TEST_F(DownloadItemTest, ResumeUsesFinalURL) {
946 create_info()->save_info->prompt_for_save_location = false; 985 create_info()->save_info->prompt_for_save_location = false;
947 create_info()->url_chain.clear(); 986 create_info()->url_chain.clear();
948 create_info()->url_chain.push_back(GURL("http://example.com/a")); 987 create_info()->url_chain.push_back(GURL("http://example.com/a"));
949 create_info()->url_chain.push_back(GURL("http://example.com/b")); 988 create_info()->url_chain.push_back(GURL("http://example.com/b"));
950 create_info()->url_chain.push_back(GURL("http://example.com/c")); 989 create_info()->url_chain.push_back(GURL("http://example.com/c"));
951 990
952 DownloadItemImpl* item = CreateDownloadItem(); 991 DownloadItemImpl* item = CreateDownloadItem();
953 TestDownloadItemObserver observer(item); 992 TestDownloadItemObserver observer(item);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 EXPECT_EQ(FILE_PATH_LITERAL("new.name"), 1039 EXPECT_EQ(FILE_PATH_LITERAL("new.name"),
1001 item->GetFileNameToReportUser().value()); 1040 item->GetFileNameToReportUser().value());
1002 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); 1041 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS);
1003 } 1042 }
1004 1043
1005 // Test to make sure that Start method calls DF initialize properly. 1044 // Test to make sure that Start method calls DF initialize properly.
1006 TEST_F(DownloadItemTest, Start) { 1045 TEST_F(DownloadItemTest, Start) {
1007 MockDownloadFile* mock_download_file(new MockDownloadFile); 1046 MockDownloadFile* mock_download_file(new MockDownloadFile);
1008 std::unique_ptr<DownloadFile> download_file(mock_download_file); 1047 std::unique_ptr<DownloadFile> download_file(mock_download_file);
1009 DownloadItemImpl* item = CreateDownloadItem(); 1048 DownloadItemImpl* item = CreateDownloadItem();
1010 EXPECT_CALL(*mock_download_file, Initialize(_)); 1049 EXPECT_CALL(*mock_download_file, Initialize(_, _));
1011 std::unique_ptr<DownloadRequestHandleInterface> request_handle( 1050 std::unique_ptr<DownloadRequestHandleInterface> request_handle(
1012 new NiceMock<MockRequestHandle>); 1051 new NiceMock<MockRequestHandle>);
1013 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)); 1052 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _));
1014 item->Start(std::move(download_file), std::move(request_handle), 1053 item->Start(std::move(download_file), std::move(request_handle),
1015 *create_info()); 1054 *create_info());
1016 RunAllPendingInMessageLoops(); 1055 RunAllPendingInMessageLoops();
1017 1056
1018 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS); 1057 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS);
1019 } 1058 }
1020 1059
1021 // Download file and the request should be cancelled as a result of download 1060 // Download file and the request should be cancelled as a result of download
1022 // file initialization failing. 1061 // file initialization failing.
1023 TEST_F(DownloadItemTest, InitDownloadFileFails) { 1062 TEST_F(DownloadItemTest, InitDownloadFileFails) {
1024 DownloadItemImpl* item = CreateDownloadItem(); 1063 DownloadItemImpl* item = CreateDownloadItem();
1025 std::unique_ptr<MockDownloadFile> file = base::MakeUnique<MockDownloadFile>(); 1064 std::unique_ptr<MockDownloadFile> file = base::MakeUnique<MockDownloadFile>();
1026 std::unique_ptr<MockRequestHandle> request_handle = 1065 std::unique_ptr<MockRequestHandle> request_handle =
1027 base::MakeUnique<MockRequestHandle>(); 1066 base::MakeUnique<MockRequestHandle>();
1028 1067
1029 EXPECT_CALL(*file, Cancel()); 1068 EXPECT_CALL(*file, Cancel());
1030 EXPECT_CALL(*request_handle, CancelRequest()); 1069 EXPECT_CALL(*request_handle, CancelRequest());
1031 EXPECT_CALL(*file, Initialize(_)) 1070 EXPECT_CALL(*file, Initialize(_, _))
1032 .WillOnce(ScheduleCallbackWithParam( 1071 .WillOnce(ScheduleCallbackWithParam(
1033 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED)); 1072 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED));
1034 1073
1035 base::RunLoop start_download_loop; 1074 base::RunLoop start_download_loop;
1036 DownloadTargetCallback download_target_callback; 1075 DownloadTargetCallback download_target_callback;
1037 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) 1076 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
1038 .WillOnce(DoAll(SaveArg<1>(&download_target_callback), 1077 .WillOnce(DoAll(SaveArg<1>(&download_target_callback),
1039 ScheduleClosure(start_download_loop.QuitClosure()))); 1078 ScheduleClosure(start_download_loop.QuitClosure())));
1040 1079
1041 item->Start(std::move(file), std::move(request_handle), *create_info()); 1080 item->Start(std::move(file), std::move(request_handle), *create_info());
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
2043 // Run through the DII workflow but the embedder cancels the download at target 2082 // Run through the DII workflow but the embedder cancels the download at target
2044 // determination. 2083 // determination.
2045 TEST_P(DownloadItemDestinationUpdateRaceTest, DownloadCancelledByUser) { 2084 TEST_P(DownloadItemDestinationUpdateRaceTest, DownloadCancelledByUser) {
2046 // Expect that the download file and the request will be cancelled as a 2085 // Expect that the download file and the request will be cancelled as a
2047 // result. 2086 // result.
2048 EXPECT_CALL(*file_, Cancel()); 2087 EXPECT_CALL(*file_, Cancel());
2049 EXPECT_CALL(*request_handle_, CancelRequest()); 2088 EXPECT_CALL(*request_handle_, CancelRequest());
2050 2089
2051 base::RunLoop download_start_loop; 2090 base::RunLoop download_start_loop;
2052 DownloadFile::InitializeCallback initialize_callback; 2091 DownloadFile::InitializeCallback initialize_callback;
2053 EXPECT_CALL(*file_, Initialize(_)) 2092 EXPECT_CALL(*file_, Initialize(_, _))
2054 .WillOnce(DoAll(SaveArg<0>(&initialize_callback), 2093 .WillOnce(DoAll(SaveArg<0>(&initialize_callback),
2055 ScheduleClosure(download_start_loop.QuitClosure()))); 2094 ScheduleClosure(download_start_loop.QuitClosure())));
2056 item_->Start(std::move(file_), std::move(request_handle_), *create_info()); 2095 item_->Start(std::move(file_), std::move(request_handle_), *create_info());
2057 download_start_loop.Run(); 2096 download_start_loop.Run();
2058 2097
2059 base::WeakPtr<DownloadDestinationObserver> destination_observer = 2098 base::WeakPtr<DownloadDestinationObserver> destination_observer =
2060 item_->DestinationObserverAsWeakPtr(); 2099 item_->DestinationObserverAsWeakPtr();
2061 2100
2062 ScheduleObservations(PreInitializeFileObservations(), destination_observer); 2101 ScheduleObservations(PreInitializeFileObservations(), destination_observer);
2063 RunAllPendingInMessageLoops(); 2102 RunAllPendingInMessageLoops();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2096 // DownloadFile expectations since we are about to transfer its ownership to 2135 // DownloadFile expectations since we are about to transfer its ownership to
2097 // the DownloadItem. 2136 // the DownloadItem.
2098 base::RunLoop intermediate_rename_loop; 2137 base::RunLoop intermediate_rename_loop;
2099 DownloadFile::RenameCompletionCallback intermediate_rename_callback; 2138 DownloadFile::RenameCompletionCallback intermediate_rename_callback;
2100 EXPECT_CALL(*file_, RenameAndUniquify(_, _)) 2139 EXPECT_CALL(*file_, RenameAndUniquify(_, _))
2101 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback), 2140 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback),
2102 ScheduleClosure(intermediate_rename_loop.QuitClosure()))); 2141 ScheduleClosure(intermediate_rename_loop.QuitClosure())));
2103 2142
2104 base::RunLoop download_start_loop; 2143 base::RunLoop download_start_loop;
2105 DownloadFile::InitializeCallback initialize_callback; 2144 DownloadFile::InitializeCallback initialize_callback;
2106 EXPECT_CALL(*file_, Initialize(_)) 2145 EXPECT_CALL(*file_, Initialize(_, _))
2107 .WillOnce(DoAll(SaveArg<0>(&initialize_callback), 2146 .WillOnce(DoAll(SaveArg<0>(&initialize_callback),
2108 ScheduleClosure(download_start_loop.QuitClosure()))); 2147 ScheduleClosure(download_start_loop.QuitClosure())));
2109 2148
2110 item_->Start(std::move(file_), std::move(request_handle_), *create_info()); 2149 item_->Start(std::move(file_), std::move(request_handle_), *create_info());
2111 download_start_loop.Run(); 2150 download_start_loop.Run();
2112 base::WeakPtr<DownloadDestinationObserver> destination_observer = 2151 base::WeakPtr<DownloadDestinationObserver> destination_observer =
2113 item_->DestinationObserverAsWeakPtr(); 2152 item_->DestinationObserverAsWeakPtr();
2114 2153
2115 ScheduleObservations(PreInitializeFileObservations(), destination_observer); 2154 ScheduleObservations(PreInitializeFileObservations(), destination_observer);
2116 RunAllPendingInMessageLoops(); 2155 RunAllPendingInMessageLoops();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2166 // DownloadFile expectations since we are about to transfer its ownership to 2205 // DownloadFile expectations since we are about to transfer its ownership to
2167 // the DownloadItem. 2206 // the DownloadItem.
2168 base::RunLoop intermediate_rename_loop; 2207 base::RunLoop intermediate_rename_loop;
2169 DownloadFile::RenameCompletionCallback intermediate_rename_callback; 2208 DownloadFile::RenameCompletionCallback intermediate_rename_callback;
2170 EXPECT_CALL(*file_, RenameAndUniquify(_, _)) 2209 EXPECT_CALL(*file_, RenameAndUniquify(_, _))
2171 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback), 2210 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback),
2172 ScheduleClosure(intermediate_rename_loop.QuitClosure()))); 2211 ScheduleClosure(intermediate_rename_loop.QuitClosure())));
2173 2212
2174 base::RunLoop download_start_loop; 2213 base::RunLoop download_start_loop;
2175 DownloadFile::InitializeCallback initialize_callback; 2214 DownloadFile::InitializeCallback initialize_callback;
2176 EXPECT_CALL(*file_, Initialize(_)) 2215 EXPECT_CALL(*file_, Initialize(_, _))
2177 .WillOnce(DoAll(SaveArg<0>(&initialize_callback), 2216 .WillOnce(DoAll(SaveArg<0>(&initialize_callback),
2178 ScheduleClosure(download_start_loop.QuitClosure()))); 2217 ScheduleClosure(download_start_loop.QuitClosure())));
2179 2218
2180 item_->Start(std::move(file_), std::move(request_handle_), *create_info()); 2219 item_->Start(std::move(file_), std::move(request_handle_), *create_info());
2181 download_start_loop.Run(); 2220 download_start_loop.Run();
2182 base::WeakPtr<DownloadDestinationObserver> destination_observer = 2221 base::WeakPtr<DownloadDestinationObserver> destination_observer =
2183 item_->DestinationObserverAsWeakPtr(); 2222 item_->DestinationObserverAsWeakPtr();
2184 2223
2185 ScheduleObservations(PreInitializeFileObservations(), destination_observer); 2224 ScheduleObservations(PreInitializeFileObservations(), destination_observer);
2186 RunAllPendingInMessageLoops(); 2225 RunAllPendingInMessageLoops();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2232 2271
2233 item_->Cancel(true); 2272 item_->Cancel(true);
2234 RunAllPendingInMessageLoops(); 2273 RunAllPendingInMessageLoops();
2235 } 2274 }
2236 2275
2237 TEST(MockDownloadItem, Compiles) { 2276 TEST(MockDownloadItem, Compiles) {
2238 MockDownloadItem mock_item; 2277 MockDownloadItem mock_item;
2239 } 2278 }
2240 2279
2241 } // namespace content 2280 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/download/download_item_impl.cc ('k') | content/browser/download/download_manager_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698