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/download/chrome_download_manager_delegate.h" | 5 #include "chrome/browser/download/chrome_download_manager_delegate.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) | 46 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) |
47 : profile_(profile), | 47 : profile_(profile), |
48 download_prefs_(new DownloadPrefs(profile->GetPrefs())) { | 48 download_prefs_(new DownloadPrefs(profile->GetPrefs())) { |
49 } | 49 } |
50 | 50 |
51 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { | 51 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { |
52 } | 52 } |
53 | 53 |
54 bool ChromeDownloadManagerDelegate::IsExtensionDownload( | 54 bool ChromeDownloadManagerDelegate::IsExtensionDownload( |
55 const DownloadItem* item) { | 55 const DownloadItem* item) { |
56 if (item->prompt_user_for_save_location()) | 56 if (item->PromptUserForSaveLocation()) |
57 return false; | 57 return false; |
58 | 58 |
59 return (item->mime_type() == Extension::kMimeType) || | 59 return (item->GetMimeType() == Extension::kMimeType) || |
60 UserScript::IsURLUserScript(item->GetURL(), item->mime_type()); | 60 UserScript::IsURLUserScript(item->GetURL(), item->GetMimeType()); |
61 } | 61 } |
62 | 62 |
63 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { | 63 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { |
64 download_manager_ = dm; | 64 download_manager_ = dm; |
65 download_history_.reset(new DownloadHistory(profile_)); | 65 download_history_.reset(new DownloadHistory(profile_)); |
66 download_history_->Load( | 66 download_history_->Load( |
67 base::Bind(&DownloadManager::OnPersistentStoreQueryComplete, | 67 base::Bind(&DownloadManager::OnPersistentStoreQueryComplete, |
68 base::Unretained(dm))); | 68 base::Unretained(dm))); |
69 } | 69 } |
70 | 70 |
(...skipping 18 matching lines...) Expand all Loading... |
89 #if defined(ENABLE_SAFE_BROWSING) | 89 #if defined(ENABLE_SAFE_BROWSING) |
90 DownloadProtectionService* service = GetDownloadProtectionService(); | 90 DownloadProtectionService* service = GetDownloadProtectionService(); |
91 if (service) { | 91 if (service) { |
92 VLOG(2) << __FUNCTION__ << "() Start SB URL check for download = " | 92 VLOG(2) << __FUNCTION__ << "() Start SB URL check for download = " |
93 << download->DebugString(false); | 93 << download->DebugString(false); |
94 service->CheckDownloadUrl( | 94 service->CheckDownloadUrl( |
95 DownloadProtectionService::DownloadInfo::FromDownloadItem(*download), | 95 DownloadProtectionService::DownloadInfo::FromDownloadItem(*download), |
96 base::Bind( | 96 base::Bind( |
97 &ChromeDownloadManagerDelegate::CheckDownloadUrlDone, | 97 &ChromeDownloadManagerDelegate::CheckDownloadUrlDone, |
98 this, | 98 this, |
99 download->id())); | 99 download->GetId())); |
100 return false; | 100 return false; |
101 } | 101 } |
102 #endif | 102 #endif |
103 CheckDownloadUrlDone(download_id, DownloadProtectionService::SAFE); | 103 CheckDownloadUrlDone(download_id, DownloadProtectionService::SAFE); |
104 return false; | 104 return false; |
105 } | 105 } |
106 | 106 |
107 void ChromeDownloadManagerDelegate::ChooseDownloadPath( | 107 void ChromeDownloadManagerDelegate::ChooseDownloadPath( |
108 TabContents* tab_contents, | 108 TabContents* tab_contents, |
109 const FilePath& suggested_path, | 109 const FilePath& suggested_path, |
110 void* data) { | 110 void* data) { |
111 // Deletes itself. | 111 // Deletes itself. |
112 new DownloadFilePicker( | 112 new DownloadFilePicker( |
113 download_manager_, tab_contents, suggested_path, data); | 113 download_manager_, tab_contents, suggested_path, data); |
114 } | 114 } |
115 | 115 |
116 bool ChromeDownloadManagerDelegate::OverrideIntermediatePath( | 116 bool ChromeDownloadManagerDelegate::OverrideIntermediatePath( |
117 DownloadItem* item, | 117 DownloadItem* item, |
118 FilePath* intermediate_path) { | 118 FilePath* intermediate_path) { |
119 if (item->GetDangerType() != DownloadStateInfo::NOT_DANGEROUS) { | 119 if (item->GetDangerType() != DownloadStateInfo::NOT_DANGEROUS) { |
120 // The download might not be safe. It's name is already set to an | 120 // The download might not be safe. It's name is already set to an |
121 // intermediate name, so no need to override. | 121 // intermediate name, so no need to override. |
122 return false; | 122 return false; |
123 } | 123 } |
124 | 124 |
125 // The download is a safe download. We need to rename it to its intermediate | 125 // The download is a safe download. We need to rename it to its intermediate |
126 // '.crdownload' path. The final name after user confirmation will be set | 126 // '.crdownload' path. The final name after user confirmation will be set |
127 // from DownloadItem::OnDownloadCompleting. | 127 // from DownloadItem::OnDownloadCompleting. |
128 *intermediate_path = download_util::GetCrDownloadPath(item->full_path()); | 128 *intermediate_path = download_util::GetCrDownloadPath(item->GetFullPath()); |
129 return true; | 129 return true; |
130 } | 130 } |
131 | 131 |
132 TabContents* ChromeDownloadManagerDelegate:: | 132 TabContents* ChromeDownloadManagerDelegate:: |
133 GetAlternativeTabContentsToNotifyForDownload() { | 133 GetAlternativeTabContentsToNotifyForDownload() { |
134 // Start the download in the last active browser. This is not ideal but better | 134 // Start the download in the last active browser. This is not ideal but better |
135 // than fully hiding the download from the user. | 135 // than fully hiding the download from the user. |
136 Browser* last_active = BrowserList::GetLastActiveWithProfile(profile_); | 136 Browser* last_active = BrowserList::GetLastActiveWithProfile(profile_); |
137 return last_active ? last_active->GetSelectedTabContents() : NULL; | 137 return last_active ? last_active->GetSelectedTabContents() : NULL; |
138 } | 138 } |
139 | 139 |
140 | 140 |
141 bool ChromeDownloadManagerDelegate::ShouldOpenFileBasedOnExtension( | 141 bool ChromeDownloadManagerDelegate::ShouldOpenFileBasedOnExtension( |
142 const FilePath& path) { | 142 const FilePath& path) { |
143 FilePath::StringType extension = path.Extension(); | 143 FilePath::StringType extension = path.Extension(); |
144 if (extension.empty()) | 144 if (extension.empty()) |
145 return false; | 145 return false; |
146 if (Extension::IsExtension(path)) | 146 if (Extension::IsExtension(path)) |
147 return false; | 147 return false; |
148 DCHECK(extension[0] == FilePath::kExtensionSeparator); | 148 DCHECK(extension[0] == FilePath::kExtensionSeparator); |
149 extension.erase(0, 1); | 149 extension.erase(0, 1); |
150 return download_prefs_->IsAutoOpenEnabledForExtension(extension); | 150 return download_prefs_->IsAutoOpenEnabledForExtension(extension); |
151 } | 151 } |
152 | 152 |
153 bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) { | 153 bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) { |
154 #if defined(ENABLE_SAFE_BROWSING) | 154 #if defined(ENABLE_SAFE_BROWSING) |
155 // See if there is already a pending SafeBrowsing check for that download. | 155 // See if there is already a pending SafeBrowsing check for that download. |
156 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->id()); | 156 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->GetId()); |
157 if (it != safe_browsing_state_.end()) { | 157 if (it != safe_browsing_state_.end()) { |
158 SafeBrowsingState state = it->second; | 158 SafeBrowsingState state = it->second; |
159 if (!state.pending) { | 159 if (!state.pending) { |
160 safe_browsing_state_.erase(it); | 160 safe_browsing_state_.erase(it); |
161 } | 161 } |
162 return !state.pending; | 162 return !state.pending; |
163 } | 163 } |
164 // Begin the safe browsing download protection check. | 164 // Begin the safe browsing download protection check. |
165 DownloadProtectionService* service = GetDownloadProtectionService(); | 165 DownloadProtectionService* service = GetDownloadProtectionService(); |
166 if (service) { | 166 if (service) { |
167 VLOG(2) << __FUNCTION__ << "() Start SB download check for download = " | 167 VLOG(2) << __FUNCTION__ << "() Start SB download check for download = " |
168 << item->DebugString(false); | 168 << item->DebugString(false); |
169 service->CheckClientDownload( | 169 service->CheckClientDownload( |
170 DownloadProtectionService::DownloadInfo::FromDownloadItem(*item), | 170 DownloadProtectionService::DownloadInfo::FromDownloadItem(*item), |
171 base::Bind( | 171 base::Bind( |
172 &ChromeDownloadManagerDelegate::CheckClientDownloadDone, | 172 &ChromeDownloadManagerDelegate::CheckClientDownloadDone, |
173 this, | 173 this, |
174 item->id())); | 174 item->GetId())); |
175 SafeBrowsingState state; | 175 SafeBrowsingState state; |
176 state.pending = true; | 176 state.pending = true; |
177 state.verdict = DownloadProtectionService::SAFE; | 177 state.verdict = DownloadProtectionService::SAFE; |
178 safe_browsing_state_[item->id()] = state; | 178 safe_browsing_state_[item->GetId()] = state; |
179 return false; | 179 return false; |
180 } | 180 } |
181 #endif | 181 #endif |
182 return true; | 182 return true; |
183 } | 183 } |
184 | 184 |
185 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { | 185 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { |
186 if (!IsExtensionDownload(item)) { | 186 if (!IsExtensionDownload(item)) { |
187 return true; | 187 return true; |
188 } | 188 } |
189 | 189 |
190 scoped_refptr<CrxInstaller> crx_installer = | 190 scoped_refptr<CrxInstaller> crx_installer = |
191 download_crx_util::OpenChromeExtension(profile_, *item); | 191 download_crx_util::OpenChromeExtension(profile_, *item); |
192 | 192 |
193 // CRX_INSTALLER_DONE will fire when the install completes. Observe() | 193 // CRX_INSTALLER_DONE will fire when the install completes. Observe() |
194 // will call DelayedDownloadOpened() on this item. If this DownloadItem is | 194 // will call DelayedDownloadOpened() on this item. If this DownloadItem is |
195 // not around when CRX_INSTALLER_DONE fires, Complete() will not be called. | 195 // not around when CRX_INSTALLER_DONE fires, Complete() will not be called. |
196 registrar_.Add(this, | 196 registrar_.Add(this, |
197 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 197 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
198 content::Source<CrxInstaller>(crx_installer.get())); | 198 content::Source<CrxInstaller>(crx_installer.get())); |
199 | 199 |
200 crx_installers_[crx_installer.get()] = item->id(); | 200 crx_installers_[crx_installer.get()] = item->GetId(); |
201 // The status text and percent complete indicator will change now | 201 // The status text and percent complete indicator will change now |
202 // that we are installing a CRX. Update observers so that they pick | 202 // that we are installing a CRX. Update observers so that they pick |
203 // up the change. | 203 // up the change. |
204 item->UpdateObservers(); | 204 item->UpdateObservers(); |
205 return false; | 205 return false; |
206 } | 206 } |
207 | 207 |
208 bool ChromeDownloadManagerDelegate::GenerateFileHash() { | 208 bool ChromeDownloadManagerDelegate::GenerateFileHash() { |
209 #if defined(ENABLE_SAFE_BROWSING) | 209 #if defined(ENABLE_SAFE_BROWSING) |
210 return profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && | 210 return profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 download_manager_->GetActiveDownloadItem(download_id); | 315 download_manager_->GetActiveDownloadItem(download_id); |
316 if (!download) | 316 if (!download) |
317 return; | 317 return; |
318 | 318 |
319 VLOG(2) << __FUNCTION__ << "() download = " << download->DebugString(false) | 319 VLOG(2) << __FUNCTION__ << "() download = " << download->DebugString(false) |
320 << " verdict = " << result; | 320 << " verdict = " << result; |
321 if (result == DownloadProtectionService::DANGEROUS) | 321 if (result == DownloadProtectionService::DANGEROUS) |
322 download->MarkUrlDangerous(); | 322 download->MarkUrlDangerous(); |
323 | 323 |
324 download_history_->CheckVisitedReferrerBefore( | 324 download_history_->CheckVisitedReferrerBefore( |
325 download_id, download->referrer_url(), | 325 download_id, download->GetReferrerUrl(), |
326 base::Bind(&ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone, | 326 base::Bind(&ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone, |
327 base::Unretained(this))); | 327 base::Unretained(this))); |
328 } | 328 } |
329 | 329 |
330 void ChromeDownloadManagerDelegate::CheckClientDownloadDone( | 330 void ChromeDownloadManagerDelegate::CheckClientDownloadDone( |
331 int32 download_id, | 331 int32 download_id, |
332 DownloadProtectionService::DownloadCheckResult result) { | 332 DownloadProtectionService::DownloadCheckResult result) { |
333 DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id); | 333 DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id); |
334 if (!item) { | 334 if (!item) { |
335 safe_browsing_state_.erase(download_id); // Just in case. | 335 safe_browsing_state_.erase(download_id); // Just in case. |
336 return; | 336 return; |
337 } | 337 } |
338 | 338 |
339 VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false) | 339 VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false) |
340 << " verdict = " << result; | 340 << " verdict = " << result; |
341 // We only mark the content as being dangerous if the download's safety state | 341 // We only mark the content as being dangerous if the download's safety state |
342 // has not been set to DANGEROUS yet. We don't want to show two warnings. | 342 // has not been set to DANGEROUS yet. We don't want to show two warnings. |
343 if (result == DownloadProtectionService::DANGEROUS && | 343 if (result == DownloadProtectionService::DANGEROUS && |
344 item->safety_state() == DownloadItem::SAFE) | 344 item->GetSafetyState() == DownloadItem::SAFE) |
345 item->MarkContentDangerous(); | 345 item->MarkContentDangerous(); |
346 | 346 |
347 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->id()); | 347 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->GetId()); |
348 DCHECK(it != safe_browsing_state_.end() && it->second.pending); | 348 DCHECK(it != safe_browsing_state_.end() && it->second.pending); |
349 if (it != safe_browsing_state_.end()) { | 349 if (it != safe_browsing_state_.end()) { |
350 it->second.pending = false; | 350 it->second.pending = false; |
351 it->second.verdict = result; | 351 it->second.verdict = result; |
352 } | 352 } |
353 download_manager_->MaybeCompleteDownload(item); | 353 download_manager_->MaybeCompleteDownload(item); |
354 } | 354 } |
355 | 355 |
356 // content::NotificationObserver implementation. | 356 // content::NotificationObserver implementation. |
357 void ChromeDownloadManagerDelegate::Observe( | 357 void ChromeDownloadManagerDelegate::Observe( |
(...skipping 20 matching lines...) Expand all Loading... |
378 bool visited_referrer_before) { | 378 bool visited_referrer_before) { |
379 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 379 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
380 | 380 |
381 DownloadItem* download = | 381 DownloadItem* download = |
382 download_manager_->GetActiveDownloadItem(download_id); | 382 download_manager_->GetActiveDownloadItem(download_id); |
383 if (!download) | 383 if (!download) |
384 return; | 384 return; |
385 | 385 |
386 // Check whether this download is for an extension install or not. | 386 // Check whether this download is for an extension install or not. |
387 // Allow extensions to be explicitly saved. | 387 // Allow extensions to be explicitly saved. |
388 DownloadStateInfo state = download->state_info(); | 388 DownloadStateInfo state = download->GetStateInfo(); |
389 | 389 |
390 if (state.force_file_name.empty()) { | 390 if (state.force_file_name.empty()) { |
391 FilePath generated_name; | 391 FilePath generated_name; |
392 download_util::GenerateFileNameFromRequest(*download, | 392 download_util::GenerateFileNameFromRequest(*download, |
393 &generated_name); | 393 &generated_name); |
394 | 394 |
395 // Freeze the user's preference for showing a Save As dialog. We're going | 395 // Freeze the user's preference for showing a Save As dialog. We're going |
396 // to bounce around a bunch of threads and we don't want to worry about race | 396 // to bounce around a bunch of threads and we don't want to worry about race |
397 // conditions where the user changes this pref out from under us. | 397 // conditions where the user changes this pref out from under us. |
398 if (download_prefs_->PromptForDownload()) { | 398 if (download_prefs_->PromptForDownload()) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 } | 443 } |
444 #endif | 444 #endif |
445 | 445 |
446 // We need to move over to the download thread because we don't want to stat | 446 // We need to move over to the download thread because we don't want to stat |
447 // the suggested path on the UI thread. | 447 // the suggested path on the UI thread. |
448 // We can only access preferences on the UI thread, so check the download path | 448 // We can only access preferences on the UI thread, so check the download path |
449 // now and pass the value to the FILE thread. | 449 // now and pass the value to the FILE thread. |
450 BrowserThread::PostTask( | 450 BrowserThread::PostTask( |
451 BrowserThread::FILE, FROM_HERE, | 451 BrowserThread::FILE, FROM_HERE, |
452 base::Bind(&ChromeDownloadManagerDelegate::CheckIfSuggestedPathExists, | 452 base::Bind(&ChromeDownloadManagerDelegate::CheckIfSuggestedPathExists, |
453 this, download->id(), state, | 453 this, download->GetId(), state, |
454 download_prefs_->download_path())); | 454 download_prefs_->download_path())); |
455 } | 455 } |
456 | 456 |
457 void ChromeDownloadManagerDelegate::CheckIfSuggestedPathExists( | 457 void ChromeDownloadManagerDelegate::CheckIfSuggestedPathExists( |
458 int32 download_id, | 458 int32 download_id, |
459 DownloadStateInfo state, | 459 DownloadStateInfo state, |
460 const FilePath& default_path) { | 460 const FilePath& default_path) { |
461 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 461 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
462 | 462 |
463 // Make sure the default download directory exists. | 463 // Make sure the default download directory exists. |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 561 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
562 | 562 |
563 // Anything loaded directly from the address bar is OK. | 563 // Anything loaded directly from the address bar is OK. |
564 if (state.transition_type & content::PAGE_TRANSITION_FROM_ADDRESS_BAR) | 564 if (state.transition_type & content::PAGE_TRANSITION_FROM_ADDRESS_BAR) |
565 return false; | 565 return false; |
566 | 566 |
567 // Extensions that are not from the gallery are considered dangerous. | 567 // Extensions that are not from the gallery are considered dangerous. |
568 if (IsExtensionDownload(&download)) { | 568 if (IsExtensionDownload(&download)) { |
569 ExtensionService* service = profile_->GetExtensionService(); | 569 ExtensionService* service = profile_->GetExtensionService(); |
570 if (!service || !service->IsDownloadFromGallery(download.GetURL(), | 570 if (!service || !service->IsDownloadFromGallery(download.GetURL(), |
571 download.referrer_url())) | 571 download.GetReferrerUrl())) |
572 return true; | 572 return true; |
573 } | 573 } |
574 | 574 |
575 // Anything the user has marked auto-open is OK if it's user-initiated. | 575 // Anything the user has marked auto-open is OK if it's user-initiated. |
576 if (ShouldOpenFileBasedOnExtension(state.suggested_path) && | 576 if (ShouldOpenFileBasedOnExtension(state.suggested_path) && |
577 state.has_user_gesture) | 577 state.has_user_gesture) |
578 return false; | 578 return false; |
579 | 579 |
580 // "Allow on user gesture" is OK when we have a user gesture and the hosting | 580 // "Allow on user gesture" is OK when we have a user gesture and the hosting |
581 // page has been visited before today. | 581 // page has been visited before today. |
582 download_util::DownloadDangerLevel danger_level = | 582 download_util::DownloadDangerLevel danger_level = |
583 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); | 583 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); |
584 if (danger_level == download_util::AllowOnUserGesture) | 584 if (danger_level == download_util::AllowOnUserGesture) |
585 return !state.has_user_gesture || !visited_referrer_before; | 585 return !state.has_user_gesture || !visited_referrer_before; |
586 | 586 |
587 return danger_level == download_util::Dangerous; | 587 return danger_level == download_util::Dangerous; |
588 } | 588 } |
589 | 589 |
590 void ChromeDownloadManagerDelegate::OnItemAddedToPersistentStore( | 590 void ChromeDownloadManagerDelegate::OnItemAddedToPersistentStore( |
591 int32 download_id, int64 db_handle) { | 591 int32 download_id, int64 db_handle) { |
592 // It's not immediately obvious, but HistoryBackend::CreateDownload() can | 592 // It's not immediately obvious, but HistoryBackend::CreateDownload() can |
593 // call this function with an invalid |db_handle|. For instance, this can | 593 // call this function with an invalid |db_handle|. For instance, this can |
594 // happen when the history database is offline. We cannot have multiple | 594 // happen when the history database is offline. We cannot have multiple |
595 // DownloadItems with the same invalid db_handle, so we need to assign a | 595 // DownloadItems with the same invalid db_handle, so we need to assign a |
596 // unique |db_handle| here. | 596 // unique |db_handle| here. |
597 if (db_handle == DownloadItem::kUninitializedHandle) | 597 if (db_handle == DownloadItem::kUninitializedHandle) |
598 db_handle = download_history_->GetNextFakeDbHandle(); | 598 db_handle = download_history_->GetNextFakeDbHandle(); |
599 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); | 599 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); |
600 } | 600 } |
OLD | NEW |