Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "ios/chrome/browser/reading_list/reading_list_download_service.h" | 5 #include "ios/chrome/browser/reading_list/reading_list_download_service.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "ios/chrome/browser/reading_list/reading_list_entry.h" | 12 #include "ios/chrome/browser/reading_list/reading_list_entry.h" |
| 13 #include "ios/chrome/browser/reading_list/reading_list_model.h" | 13 #include "ios/chrome/browser/reading_list/reading_list_model.h" |
| 14 #include "ios/web/public/web_thread.h" | |
| 15 | |
| 16 namespace { | |
| 17 // Number of time the download must fail before the download occurs only in | |
| 18 // wifi. | |
| 19 const int kNumberOfFailsBeforeWifiOnly = 5; | |
| 20 // Number of time the download must fail before we give up trying to download | |
| 21 // it. | |
| 22 const int kNumberOfFailsBeforeStop = 7; | |
| 23 } // namespace | |
| 14 | 24 |
| 15 ReadingListDownloadService::ReadingListDownloadService( | 25 ReadingListDownloadService::ReadingListDownloadService( |
| 16 ReadingListModel* reading_list_model, | 26 ReadingListModel* reading_list_model, |
| 17 dom_distiller::DomDistillerService* distiller_service, | 27 dom_distiller::DomDistillerService* distiller_service, |
| 18 PrefService* prefs, | 28 PrefService* prefs, |
| 19 base::FilePath chrome_profile_path) | 29 base::FilePath chrome_profile_path) |
| 20 : reading_list_model_(reading_list_model) { | 30 : reading_list_model_(reading_list_model), |
| 31 had_connection_(!net::NetworkChangeNotifier::IsOffline()) { | |
| 21 DCHECK(reading_list_model); | 32 DCHECK(reading_list_model); |
| 22 url_downloader_ = base::MakeUnique<URLDownloader>( | 33 url_downloader_ = base::MakeUnique<URLDownloader>( |
| 23 distiller_service, prefs, chrome_profile_path, | 34 distiller_service, prefs, chrome_profile_path, |
| 24 base::Bind(&ReadingListDownloadService::OnDownloadEnd, | 35 base::Bind(&ReadingListDownloadService::OnDownloadEnd, |
| 25 base::Unretained(this)), | 36 base::Unretained(this)), |
| 26 base::Bind(&ReadingListDownloadService::OnDeleteEnd, | 37 base::Bind(&ReadingListDownloadService::OnDeleteEnd, |
| 27 base::Unretained(this))); | 38 base::Unretained(this))); |
| 39 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); | |
| 28 } | 40 } |
| 29 | 41 |
| 30 ReadingListDownloadService::~ReadingListDownloadService() {} | 42 ReadingListDownloadService::~ReadingListDownloadService() { |
| 43 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); | |
| 44 } | |
| 31 | 45 |
| 32 void ReadingListDownloadService::Initialize() { | 46 void ReadingListDownloadService::Initialize() { |
| 33 reading_list_model_->AddObserver(this); | 47 reading_list_model_->AddObserver(this); |
| 34 } | 48 } |
| 35 | 49 |
| 36 void ReadingListDownloadService::Shutdown() { | 50 void ReadingListDownloadService::Shutdown() { |
| 37 reading_list_model_->RemoveObserver(this); | 51 reading_list_model_->RemoveObserver(this); |
| 38 } | 52 } |
| 39 | 53 |
| 40 void ReadingListDownloadService::ReadingListModelLoaded( | 54 void ReadingListDownloadService::ReadingListModelLoaded( |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 54 const ReadingListModel* model, | 68 const ReadingListModel* model, |
| 55 size_t index) { | 69 size_t index) { |
| 56 DCHECK_EQ(reading_list_model_, model); | 70 DCHECK_EQ(reading_list_model_, model); |
| 57 RemoveDownloadedEntry(model->GetUnreadEntryAtIndex(index)); | 71 RemoveDownloadedEntry(model->GetUnreadEntryAtIndex(index)); |
| 58 } | 72 } |
| 59 | 73 |
| 60 void ReadingListDownloadService::ReadingListWillAddUnreadEntry( | 74 void ReadingListDownloadService::ReadingListWillAddUnreadEntry( |
| 61 const ReadingListModel* model, | 75 const ReadingListModel* model, |
| 62 const ReadingListEntry& entry) { | 76 const ReadingListEntry& entry) { |
| 63 DCHECK_EQ(reading_list_model_, model); | 77 DCHECK_EQ(reading_list_model_, model); |
| 64 DownloadEntry(entry); | 78 ScheduleDownloadEntry(entry); |
| 65 } | 79 } |
| 66 | 80 |
| 67 void ReadingListDownloadService::ReadingListWillAddReadEntry( | 81 void ReadingListDownloadService::ReadingListWillAddReadEntry( |
| 68 const ReadingListModel* model, | 82 const ReadingListModel* model, |
| 69 const ReadingListEntry& entry) { | 83 const ReadingListEntry& entry) { |
| 70 DCHECK_EQ(reading_list_model_, model); | 84 DCHECK_EQ(reading_list_model_, model); |
| 71 DownloadEntry(entry); | 85 ScheduleDownloadEntry(entry); |
| 72 } | 86 } |
| 73 | 87 |
| 74 void ReadingListDownloadService::DownloadAllEntries() { | 88 void ReadingListDownloadService::DownloadAllEntries() { |
| 75 DCHECK(reading_list_model_->loaded()); | 89 DCHECK(reading_list_model_->loaded()); |
| 76 size_t size = reading_list_model_->unread_size(); | 90 size_t size = reading_list_model_->unread_size(); |
| 77 for (size_t i = 0; i < size; i++) { | 91 for (size_t i = 0; i < size; i++) { |
| 78 const ReadingListEntry& entry = | 92 const ReadingListEntry& entry = |
| 79 reading_list_model_->GetUnreadEntryAtIndex(i); | 93 reading_list_model_->GetUnreadEntryAtIndex(i); |
| 80 this->DownloadEntry(entry); | 94 this->ScheduleDownloadEntry(entry); |
| 81 } | 95 } |
| 82 size = reading_list_model_->read_size(); | 96 size = reading_list_model_->read_size(); |
| 83 for (size_t i = 0; i < size; i++) { | 97 for (size_t i = 0; i < size; i++) { |
| 84 const ReadingListEntry& entry = reading_list_model_->GetReadEntryAtIndex(i); | 98 const ReadingListEntry& entry = reading_list_model_->GetReadEntryAtIndex(i); |
| 85 this->DownloadEntry(entry); | 99 this->ScheduleDownloadEntry(entry); |
| 86 } | 100 } |
| 87 } | 101 } |
| 88 | 102 |
| 103 void ReadingListDownloadService::ScheduleDownloadEntry( | |
| 104 const ReadingListEntry& entry) { | |
| 105 DCHECK(reading_list_model_->loaded()); | |
| 106 if (entry.DistilledState() == ReadingListEntry::ERROR || | |
| 107 entry.DistilledState() == ReadingListEntry::PROCESSED) | |
| 108 return; | |
| 109 | |
| 110 web::WebThread::PostDelayedTask( | |
| 111 web::WebThread::UI, FROM_HERE, | |
| 112 base::Bind(&ReadingListDownloadService::DownloadEntryFromURL, | |
| 113 base::Unretained(this), entry.URL()), | |
|
gambard
2016/09/20 15:55:05
I am not really sure about this, in particular of
noyau (Ping after 24h)
2016/09/21 11:08:06
You're right not to be sure :)
See the use of bas
gambard
2016/09/22 13:52:46
Using GetWeakPtr() should be OK according to https
| |
| 114 entry.TimeUntilNextTry()); | |
| 115 } | |
| 116 | |
| 117 void ReadingListDownloadService::DownloadEntryFromURL(const GURL& url) { | |
| 118 auto download_callback = | |
| 119 base::Bind(&ReadingListDownloadService::ScheduleDownloadEntry, | |
| 120 base::Unretained(this)); | |
| 121 reading_list_model_->CallbackEntryURL(url, download_callback); | |
| 122 } | |
| 123 | |
| 89 void ReadingListDownloadService::DownloadEntry(const ReadingListEntry& entry) { | 124 void ReadingListDownloadService::DownloadEntry(const ReadingListEntry& entry) { |
| 90 DCHECK(reading_list_model_->loaded()); | 125 DCHECK(reading_list_model_->loaded()); |
| 91 if (entry.DistilledState() != ReadingListEntry::ERROR) { | 126 if (entry.DistilledState() == ReadingListEntry::ERROR || |
| 127 entry.DistilledState() == ReadingListEntry::PROCESSED) | |
| 128 return; | |
| 129 | |
| 130 if (net::NetworkChangeNotifier::IsOffline()) { | |
| 131 // There is no connection, save it for download only if we did not exceed | |
| 132 // the maximaxum number of tries. | |
| 133 if (entry.FailedDownloadCounter() < kNumberOfFailsBeforeWifiOnly) | |
| 134 url_to_download_cellular_.push_back(entry.URL()); | |
| 135 if (entry.FailedDownloadCounter() < kNumberOfFailsBeforeStop) | |
| 136 url_to_download_wifi_.push_back(entry.URL()); | |
| 137 return; | |
| 138 } | |
| 139 | |
| 140 // There is a connection. | |
| 141 if (entry.FailedDownloadCounter() < kNumberOfFailsBeforeWifiOnly) { | |
| 142 // Try to download the page, whatever the connection. | |
| 92 reading_list_model_->SetEntryDistilledState(entry.URL(), | 143 reading_list_model_->SetEntryDistilledState(entry.URL(), |
| 93 ReadingListEntry::PROCESSING); | 144 ReadingListEntry::PROCESSING); |
| 94 url_downloader_->DownloadOfflineURL(entry.URL()); | 145 url_downloader_->DownloadOfflineURL(entry.URL()); |
| 146 | |
| 147 } else if (entry.FailedDownloadCounter() < kNumberOfFailsBeforeStop) { | |
| 148 // Try to download the page only if the connection is wifi. | |
| 149 if (net::NetworkChangeNotifier::GetConnectionType() == | |
| 150 net::NetworkChangeNotifier::CONNECTION_WIFI) { | |
| 151 // The connection is wifi, download the page. | |
| 152 reading_list_model_->SetEntryDistilledState(entry.URL(), | |
| 153 ReadingListEntry::PROCESSING); | |
| 154 url_downloader_->DownloadOfflineURL(entry.URL()); | |
| 155 | |
| 156 } else { | |
| 157 // The connection is not wifi, save it for download when the connection | |
| 158 // changes to wifi. | |
| 159 url_to_download_wifi_.push_back(entry.URL()); | |
| 160 } | |
| 95 } | 161 } |
| 96 } | 162 } |
| 97 | 163 |
| 98 void ReadingListDownloadService::RemoveDownloadedEntry( | 164 void ReadingListDownloadService::RemoveDownloadedEntry( |
| 99 const ReadingListEntry& entry) { | 165 const ReadingListEntry& entry) { |
| 100 DCHECK(reading_list_model_->loaded()); | 166 DCHECK(reading_list_model_->loaded()); |
| 101 url_downloader_->RemoveOfflineURL(entry.URL()); | 167 url_downloader_->RemoveOfflineURL(entry.URL()); |
| 102 } | 168 } |
| 103 | 169 |
| 104 void ReadingListDownloadService::OnDownloadEnd( | 170 void ReadingListDownloadService::OnDownloadEnd( |
| 105 const GURL& url, | 171 const GURL& url, |
| 106 URLDownloader::SuccessState success, | 172 URLDownloader::SuccessState success, |
| 107 const GURL& distilled_url, | 173 const GURL& distilled_url, |
| 108 const std::string& title) { | 174 const std::string& title) { |
| 109 DCHECK(reading_list_model_->loaded()); | 175 DCHECK(reading_list_model_->loaded()); |
| 110 if ((success == URLDownloader::DOWNLOAD_SUCCESS || | 176 if ((success == URLDownloader::DOWNLOAD_SUCCESS || |
| 111 success == URLDownloader::DOWNLOAD_EXISTS) && | 177 success == URLDownloader::DOWNLOAD_EXISTS) && |
| 112 distilled_url.is_valid()) { | 178 distilled_url.is_valid()) { |
| 113 reading_list_model_->SetEntryDistilledURL(url, distilled_url); | 179 reading_list_model_->SetEntryDistilledURL(url, distilled_url); |
| 180 | |
| 114 } else if (success == URLDownloader::ERROR_RETRY) { | 181 } else if (success == URLDownloader::ERROR_RETRY) { |
| 115 reading_list_model_->SetEntryDistilledState(url, | 182 reading_list_model_->SetEntryDistilledState(url, |
| 116 ReadingListEntry::WILL_RETRY); | 183 ReadingListEntry::WILL_RETRY); |
| 184 DownloadEntryFromURL(url); | |
| 185 | |
| 117 } else if (success == URLDownloader::ERROR_PERMANENT) { | 186 } else if (success == URLDownloader::ERROR_PERMANENT) { |
| 118 reading_list_model_->SetEntryDistilledState(url, ReadingListEntry::ERROR); | 187 reading_list_model_->SetEntryDistilledState(url, ReadingListEntry::ERROR); |
| 119 } | 188 } |
| 120 } | 189 } |
| 121 | 190 |
| 122 void ReadingListDownloadService::OnDeleteEnd(const GURL& url, bool success) { | 191 void ReadingListDownloadService::OnDeleteEnd(const GURL& url, bool success) { |
| 123 // Nothing to update as this is only called when deleting reading list entries | 192 // Nothing to update as this is only called when deleting reading list entries |
| 124 } | 193 } |
| 194 | |
| 195 void ReadingListDownloadService::OnConnectionTypeChanged( | |
| 196 net::NetworkChangeNotifier::ConnectionType type) { | |
| 197 if (type == net::NetworkChangeNotifier::CONNECTION_NONE) { | |
| 198 had_connection_ = false; | |
| 199 return; | |
| 200 } | |
| 201 | |
| 202 if (!had_connection_) { | |
| 203 had_connection_ = true; | |
| 204 for (auto& url : url_to_download_cellular_) { | |
| 205 DownloadEntryFromURL(url); | |
| 206 } | |
| 207 } | |
| 208 if (type == net::NetworkChangeNotifier::CONNECTION_WIFI) { | |
| 209 for (auto& url : url_to_download_wifi_) { | |
| 210 DownloadEntryFromURL(url); | |
| 211 } | |
| 212 } | |
| 213 } | |
| OLD | NEW |