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

Side by Side Diff: chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc

Issue 2713013002: Track original URL when downloading a redirected page (Closed)
Patch Set: A little update Created 3 years, 10 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 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 "chrome/browser/android/offline_pages/downloads/offline_page_download_b ridge.h" 5 #include "chrome/browser/android/offline_pages/downloads/offline_page_download_b ridge.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 content::WebContents* GetWebContentsFromJavaTab( 82 content::WebContents* GetWebContentsFromJavaTab(
83 const ScopedJavaGlobalRef<jobject>& j_tab_ref) { 83 const ScopedJavaGlobalRef<jobject>& j_tab_ref) {
84 JNIEnv* env = AttachCurrentThread(); 84 JNIEnv* env = AttachCurrentThread();
85 TabAndroid* tab = TabAndroid::GetNativeTab(env, j_tab_ref); 85 TabAndroid* tab = TabAndroid::GetNativeTab(env, j_tab_ref);
86 if (!tab) 86 if (!tab)
87 return nullptr; 87 return nullptr;
88 88
89 return tab->web_contents(); 89 return tab->web_contents();
90 } 90 }
91 91
92 void SavePageIfNotNavigatedAway(const GURL& original_url, 92 void SavePageIfNotNavigatedAway(const GURL& url,
93 const GURL& original_url,
93 const ScopedJavaGlobalRef<jobject>& j_tab_ref) { 94 const ScopedJavaGlobalRef<jobject>& j_tab_ref) {
94 content::WebContents* web_contents = GetWebContentsFromJavaTab(j_tab_ref); 95 content::WebContents* web_contents = GetWebContentsFromJavaTab(j_tab_ref);
95 if (!web_contents) 96 if (!web_contents)
96 return; 97 return;
97 98
98 // This ignores fragment differences in URLs, bails out only if tab has 99 // This ignores fragment differences in URLs, bails out only if tab has
99 // navigated away and not just scrolled to a fragment. 100 // navigated away and not just scrolled to a fragment.
100 GURL url = web_contents->GetLastCommittedURL(); 101 GURL current_url = web_contents->GetLastCommittedURL();
101 if (!OfflinePageUtils::EqualsIgnoringFragment(url, original_url)) 102 if (!OfflinePageUtils::EqualsIgnoringFragment(current_url, url))
102 return; 103 return;
103 104
104 offline_pages::ClientId client_id; 105 offline_pages::ClientId client_id;
105 client_id.name_space = offline_pages::kDownloadNamespace; 106 client_id.name_space = offline_pages::kDownloadNamespace;
106 client_id.id = base::GenerateGUID(); 107 client_id.id = base::GenerateGUID();
107 int64_t request_id = OfflinePageModel::kInvalidOfflineId; 108 int64_t request_id = OfflinePageModel::kInvalidOfflineId;
108 109
109 if (offline_pages::IsBackgroundLoaderForDownloadsEnabled()) { 110 if (offline_pages::IsBackgroundLoaderForDownloadsEnabled()) {
110 // Post disabled request before passing the download task to the tab helper. 111 // Post disabled request before passing the download task to the tab helper.
111 // This will keep the request persisted in case Chrome is evicted from RAM 112 // This will keep the request persisted in case Chrome is evicted from RAM
112 // or closed by the user. 113 // or closed by the user.
113 // Note: the 'disabled' status is not persisted (stored in memory) so it 114 // Note: the 'disabled' status is not persisted (stored in memory) so it
114 // automatically resets if Chrome is re-started. 115 // automatically resets if Chrome is re-started.
115 offline_pages::RequestCoordinator* request_coordinator = 116 offline_pages::RequestCoordinator* request_coordinator =
116 offline_pages::RequestCoordinatorFactory::GetForBrowserContext( 117 offline_pages::RequestCoordinatorFactory::GetForBrowserContext(
117 web_contents->GetBrowserContext()); 118 web_contents->GetBrowserContext());
118 if (request_coordinator) { 119 if (request_coordinator) {
119 request_id = request_coordinator->SavePageLater( 120 offline_pages::RequestCoordinator::SavePageLaterParams params;
120 url, client_id, true, 121 params.url = current_url;
121 RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER); 122 params.client_id = client_id;
123 params.user_requested = true;
124 params.availability =
125 RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER;
126 params.original_url = original_url;
127 request_id = request_coordinator->SavePageLater(params);
122 } else { 128 } else {
123 DVLOG(1) << "SavePageIfNotNavigatedAway has no valid coordinator."; 129 DVLOG(1) << "SavePageIfNotNavigatedAway has no valid coordinator.";
124 } 130 }
125 } 131 }
126 132
127 // Pass request_id to the current tab's helper to attempt download right from 133 // Pass request_id to the current tab's helper to attempt download right from
128 // the tab. If unsuccessful, it'll enable the already-queued request for 134 // the tab. If unsuccessful, it'll enable the already-queued request for
129 // background offliner. Same will happen if Chrome is terminated since 135 // background offliner. Same will happen if Chrome is terminated since
130 // 'disabled' status of the request is RAM-stored info. 136 // 'disabled' status of the request is RAM-stored info.
131 offline_pages::RecentTabHelper* tab_helper = 137 offline_pages::RecentTabHelper* tab_helper =
(...skipping 10 matching lines...) Expand all
142 } 148 }
143 return; 149 return;
144 } 150 }
145 tab_helper->ObserveAndDownloadCurrentPage(client_id, request_id); 151 tab_helper->ObserveAndDownloadCurrentPage(client_id, request_id);
146 152
147 OfflinePageNotificationBridge notification_bridge; 153 OfflinePageNotificationBridge notification_bridge;
148 notification_bridge.ShowDownloadingToast(); 154 notification_bridge.ShowDownloadingToast();
149 } 155 }
150 156
151 void RequestQueueDuplicateCheckDone( 157 void RequestQueueDuplicateCheckDone(
158 const GURL& url,
152 const GURL& original_url, 159 const GURL& original_url,
153 const ScopedJavaGlobalRef<jobject>& j_tab_ref, 160 const ScopedJavaGlobalRef<jobject>& j_tab_ref,
154 bool has_duplicates, 161 bool has_duplicates,
155 const base::Time& latest_request_time) { 162 const base::Time& latest_request_time) {
156 if (has_duplicates) { 163 if (has_duplicates) {
157 base::TimeDelta time_since_most_recent_duplicate = 164 base::TimeDelta time_since_most_recent_duplicate =
158 base::Time::Now() - latest_request_time; 165 base::Time::Now() - latest_request_time;
159 // Using CUSTOM_COUNTS instead of time-oriented histogram to record 166 // Using CUSTOM_COUNTS instead of time-oriented histogram to record
160 // samples in seconds rather than milliseconds. 167 // samples in seconds rather than milliseconds.
161 UMA_HISTOGRAM_CUSTOM_COUNTS( 168 UMA_HISTOGRAM_CUSTOM_COUNTS(
162 "OfflinePages.DownloadRequestTimeSinceDuplicateRequested", 169 "OfflinePages.DownloadRequestTimeSinceDuplicateRequested",
163 time_since_most_recent_duplicate.InSeconds(), 170 time_since_most_recent_duplicate.InSeconds(),
164 base::TimeDelta::FromSeconds(1).InSeconds(), 171 base::TimeDelta::FromSeconds(1).InSeconds(),
165 base::TimeDelta::FromDays(7).InSeconds(), 50); 172 base::TimeDelta::FromDays(7).InSeconds(), 50);
166 173
167 // TODO(fgorski): Additionally we could update existing request's expiration 174 // TODO(fgorski): Additionally we could update existing request's expiration
168 // period, as it is still important. Alternative would be to actually take a 175 // period, as it is still important. Alternative would be to actually take a
169 // snapshot on the spot, but that would only work if the page is loaded 176 // snapshot on the spot, but that would only work if the page is loaded
170 // enough. 177 // enough.
171 // This simply toasts that the item is downloading. 178 // This simply toasts that the item is downloading.
172 OfflinePageNotificationBridge notification_bridge; 179 OfflinePageNotificationBridge notification_bridge;
173 notification_bridge.ShowDownloadingToast(); 180 notification_bridge.ShowDownloadingToast();
174 return; 181 return;
175 } 182 }
176 183
177 SavePageIfNotNavigatedAway(original_url, j_tab_ref); 184 SavePageIfNotNavigatedAway(url, original_url, j_tab_ref);
178 } 185 }
179 186
180 void ModelDuplicateCheckDone(const GURL& original_url, 187 void ModelDuplicateCheckDone(const GURL& url,
188 const GURL& original_url,
181 const ScopedJavaGlobalRef<jobject>& j_tab_ref, 189 const ScopedJavaGlobalRef<jobject>& j_tab_ref,
182 bool has_duplicates, 190 bool has_duplicates,
183 const base::Time& latest_saved_time) { 191 const base::Time& latest_saved_time) {
184 content::WebContents* web_contents = GetWebContentsFromJavaTab(j_tab_ref); 192 content::WebContents* web_contents = GetWebContentsFromJavaTab(j_tab_ref);
185 if (!web_contents) 193 if (!web_contents)
186 return; 194 return;
187 195
188 if (has_duplicates) { 196 if (has_duplicates) {
189 base::TimeDelta time_since_most_recent_duplicate = 197 base::TimeDelta time_since_most_recent_duplicate =
190 base::Time::Now() - latest_saved_time; 198 base::Time::Now() - latest_saved_time;
191 // Using CUSTOM_COUNTS instead of time-oriented histogram to record 199 // Using CUSTOM_COUNTS instead of time-oriented histogram to record
192 // samples in seconds rather than milliseconds. 200 // samples in seconds rather than milliseconds.
193 UMA_HISTOGRAM_CUSTOM_COUNTS( 201 UMA_HISTOGRAM_CUSTOM_COUNTS(
194 "OfflinePages.DownloadRequestTimeSinceDuplicateSaved", 202 "OfflinePages.DownloadRequestTimeSinceDuplicateSaved",
195 time_since_most_recent_duplicate.InSeconds(), 203 time_since_most_recent_duplicate.InSeconds(),
196 base::TimeDelta::FromSeconds(1).InSeconds(), 204 base::TimeDelta::FromSeconds(1).InSeconds(),
197 base::TimeDelta::FromDays(7).InSeconds(), 50); 205 base::TimeDelta::FromDays(7).InSeconds(), 50);
198 206
199 OfflinePageInfoBarDelegate::Create( 207 OfflinePageInfoBarDelegate::Create(
200 base::Bind(&SavePageIfNotNavigatedAway, original_url, j_tab_ref), 208 base::Bind(&SavePageIfNotNavigatedAway, url, original_url, j_tab_ref),
201 original_url, web_contents); 209 url, web_contents);
202 return; 210 return;
203 } 211 }
204 212
205 OfflinePageUtils::CheckExistenceOfRequestsWithURL( 213 OfflinePageUtils::CheckExistenceOfRequestsWithURL(
206 Profile::FromBrowserContext(web_contents->GetBrowserContext()) 214 Profile::FromBrowserContext(web_contents->GetBrowserContext())
207 ->GetOriginalProfile(), 215 ->GetOriginalProfile(),
208 kDownloadNamespace, original_url, 216 kDownloadNamespace, url, base::Bind(&RequestQueueDuplicateCheckDone, url,
209 base::Bind(&RequestQueueDuplicateCheckDone, original_url, j_tab_ref)); 217 original_url, j_tab_ref));
210 } 218 }
211 219
212 void ToJavaOfflinePageDownloadItemList( 220 void ToJavaOfflinePageDownloadItemList(
213 JNIEnv* env, 221 JNIEnv* env,
214 jobject j_result_obj, 222 jobject j_result_obj,
215 const std::vector<const DownloadUIItem*>& items) { 223 const std::vector<const DownloadUIItem*>& items) {
216 for (const auto item : items) { 224 for (const auto item : items) {
217 Java_OfflinePageDownloadBridge_createDownloadItemAndAddToList( 225 Java_OfflinePageDownloadBridge_createDownloadItemAndAddToList(
218 env, j_result_obj, ConvertUTF8ToJavaString(env, item->guid), 226 env, j_result_obj, ConvertUTF8ToJavaString(env, item->guid),
219 ConvertUTF8ToJavaString(env, item->url.spec()), item->download_state, 227 ConvertUTF8ToJavaString(env, item->url.spec()), item->download_state,
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 const JavaParamRef<jobject>& j_tab) { 376 const JavaParamRef<jobject>& j_tab) {
369 TabAndroid* tab = TabAndroid::GetNativeTab(env, j_tab); 377 TabAndroid* tab = TabAndroid::GetNativeTab(env, j_tab);
370 if (!tab) 378 if (!tab)
371 return; 379 return;
372 380
373 content::WebContents* web_contents = tab->web_contents(); 381 content::WebContents* web_contents = tab->web_contents();
374 if (!web_contents) 382 if (!web_contents)
375 return; 383 return;
376 384
377 GURL url = web_contents->GetLastCommittedURL(); 385 GURL url = web_contents->GetLastCommittedURL();
386 GURL original_url =
387 offline_pages::OfflinePageUtils::GetOriginalURLFromWebContents(
388 web_contents);
378 389
379 ScopedJavaGlobalRef<jobject> j_tab_ref(env, j_tab); 390 ScopedJavaGlobalRef<jobject> j_tab_ref(env, j_tab);
380 391
381 OfflinePageUtils::CheckExistenceOfPagesWithURL( 392 OfflinePageUtils::CheckExistenceOfPagesWithURL(
382 tab->GetProfile()->GetOriginalProfile(), kDownloadNamespace, url, 393 tab->GetProfile()->GetOriginalProfile(), kDownloadNamespace, url,
383 base::Bind(&ModelDuplicateCheckDone, url, j_tab_ref)); 394 base::Bind(&ModelDuplicateCheckDone, url, original_url, j_tab_ref));
384 } 395 }
385 396
386 void OfflinePageDownloadBridge::CancelDownload( 397 void OfflinePageDownloadBridge::CancelDownload(
387 JNIEnv* env, 398 JNIEnv* env,
388 const JavaParamRef<jobject>& obj, 399 const JavaParamRef<jobject>& obj,
389 const JavaParamRef<jstring>& j_guid) { 400 const JavaParamRef<jstring>& j_guid) {
390 std::string guid = ConvertJavaStringToUTF8(env, j_guid); 401 std::string guid = ConvertJavaStringToUTF8(env, j_guid);
391 RequestCoordinator* coordinator = 402 RequestCoordinator* coordinator =
392 RequestCoordinatorFactory::GetForBrowserContext(browser_context_); 403 RequestCoordinatorFactory::GetForBrowserContext(browser_context_);
393 404
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 base::MakeUnique<DownloadUIAdapterDelegate>(offline_page_model)); 499 base::MakeUnique<DownloadUIAdapterDelegate>(offline_page_model));
489 offline_page_model->SetUserData(kDownloadUIAdapterKey, adapter); 500 offline_page_model->SetUserData(kDownloadUIAdapterKey, adapter);
490 } 501 }
491 502
492 return reinterpret_cast<jlong>( 503 return reinterpret_cast<jlong>(
493 new OfflinePageDownloadBridge(env, obj, adapter, browser_context)); 504 new OfflinePageDownloadBridge(env, obj, adapter, browser_context));
494 } 505 }
495 506
496 } // namespace android 507 } // namespace android
497 } // namespace offline_pages 508 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698