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

Side by Side Diff: chrome/browser/android/most_visited_sites.cc

Issue 297233008: [NTP] Use server thumbnails from SuggestionsService on Android NTP. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: UI thread concerns Created 6 years, 6 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/most_visited_sites.h" 5 #include "chrome/browser/android/most_visited_sites.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_array.h" 8 #include "base/android/jni_array.h"
9 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
10 #include "base/android/scoped_java_ref.h" 10 #include "base/android/scoped_java_ref.h"
11 #include "base/callback.h"
11 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h" 13 #include "base/time/time.h"
13 #include "chrome/browser/chrome_notification_types.h" 14 #include "chrome/browser/chrome_notification_types.h"
14 #include "chrome/browser/history/history_types.h" 15 #include "chrome/browser/history/history_types.h"
15 #include "chrome/browser/history/top_sites.h" 16 #include "chrome/browser/history/top_sites.h"
16 #include "chrome/browser/profiles/profile.h" 17 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/browser/profiles/profile_android.h" 18 #include "chrome/browser/profiles/profile_android.h"
18 #include "chrome/browser/search/suggestions/proto/suggestions.pb.h" 19 #include "chrome/browser/search/suggestions/proto/suggestions.pb.h"
19 #include "chrome/browser/search/suggestions/suggestions_service.h" 20 #include "chrome/browser/search/suggestions/suggestions_service.h"
20 #include "chrome/browser/search/suggestions/suggestions_service_factory.h" 21 #include "chrome/browser/search/suggestions/suggestions_service_factory.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 Java_ThumbnailCallback_onMostVisitedURLsThumbnailAvailable( 92 Java_ThumbnailCallback_onMostVisitedURLsThumbnailAvailable(
92 env, j_callback->obj(), bitmap->obj()); 93 env, j_callback->obj(), bitmap->obj());
93 } 94 }
94 95
95 void AddForcedURLOnUIThread(scoped_refptr<history::TopSites> top_sites, 96 void AddForcedURLOnUIThread(scoped_refptr<history::TopSites> top_sites,
96 const GURL& url) { 97 const GURL& url) {
97 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 98 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
98 top_sites->AddForcedURL(url, base::Time::Now()); 99 top_sites->AddForcedURL(url, base::Time::Now());
99 } 100 }
100 101
102 void OnSuggestionsThumbnailAvailable(
103 ScopedJavaGlobalRef<jobject>* j_callback,
104 const GURL& url,
105 const SkBitmap* bitmap) {
106 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
107 JNIEnv* env = AttachCurrentThread();
108
109 ScopedJavaGlobalRef<jobject>* j_bitmap_ref =
110 new ScopedJavaGlobalRef<jobject>();
111 if (bitmap) {
112 j_bitmap_ref->Reset(
113 env,
114 gfx::ConvertToJavaBitmap(bitmap).obj());
115 }
116
117 Java_ThumbnailCallback_onMostVisitedURLsThumbnailAvailable(
118 env, j_callback->obj(), j_bitmap_ref->obj());
119 }
120
121 // Runs on the DB thread.
101 void GetUrlThumbnailTask( 122 void GetUrlThumbnailTask(
102 std::string url_string, 123 std::string url_string,
103 scoped_refptr<TopSites> top_sites, 124 scoped_refptr<TopSites> top_sites,
104 ScopedJavaGlobalRef<jobject>* j_callback) { 125 ScopedJavaGlobalRef<jobject>* j_callback,
126 base::Closure lookup_failed_ui_callback) {
105 JNIEnv* env = AttachCurrentThread(); 127 JNIEnv* env = AttachCurrentThread();
106 128
107 ScopedJavaGlobalRef<jobject>* j_bitmap_ref = 129 ScopedJavaGlobalRef<jobject>* j_bitmap_ref =
108 new ScopedJavaGlobalRef<jobject>(); 130 new ScopedJavaGlobalRef<jobject>();
109 131
110 GURL gurl(url_string); 132 GURL gurl(url_string);
111 133
112 scoped_refptr<base::RefCountedMemory> data; 134 scoped_refptr<base::RefCountedMemory> data;
113 if (top_sites->GetPageThumbnail(gurl, false, &data)) { 135 if (top_sites->GetPageThumbnail(gurl, false, &data)) {
114 SkBitmap thumbnail_bitmap = ExtractThumbnail(*data.get()); 136 SkBitmap thumbnail_bitmap = ExtractThumbnail(*data.get());
115 if (!thumbnail_bitmap.empty()) { 137 if (!thumbnail_bitmap.empty()) {
116 j_bitmap_ref->Reset( 138 j_bitmap_ref->Reset(
117 env, 139 env,
118 gfx::ConvertToJavaBitmap(&thumbnail_bitmap).obj()); 140 gfx::ConvertToJavaBitmap(&thumbnail_bitmap).obj());
119 } 141 }
120 } else { 142 } else {
121 // A thumbnail is not locally available for |gurl|. Make sure it is put in 143 // A thumbnail is not locally available for |gurl|. Make sure it is put in
122 // the list to be fetched at the next visit to this site. 144 // the list to be fetched at the next visit to this site.
123 BrowserThread::PostTask( 145 BrowserThread::PostTask(
124 BrowserThread::UI, FROM_HERE, 146 BrowserThread::UI, FROM_HERE,
125 base::Bind(AddForcedURLOnUIThread, top_sites, gurl)); 147 base::Bind(AddForcedURLOnUIThread, top_sites, gurl));
148
149 // If appropriate, return on the UI thread to execute the proper callback.
150 if (!lookup_failed_ui_callback.is_null()) {
151 BrowserThread::PostTask(
152 BrowserThread::UI, FROM_HERE, lookup_failed_ui_callback);
153 return;
154 }
126 } 155 }
127 156
128 // Since j_callback is owned by this callback, when the callback falls out of 157 // Since j_callback is owned by this callback, when the callback falls out of
129 // scope it will be deleted. We need to pass ownership to the next callback. 158 // scope it will be deleted. We need to pass ownership to the next callback.
130 ScopedJavaGlobalRef<jobject>* j_callback_pass = 159 ScopedJavaGlobalRef<jobject>* j_callback_pass =
131 new ScopedJavaGlobalRef<jobject>(*j_callback); 160 new ScopedJavaGlobalRef<jobject>(*j_callback);
132 BrowserThread::PostTask( 161 BrowserThread::PostTask(
133 BrowserThread::UI, FROM_HERE, 162 BrowserThread::UI, FROM_HERE,
134 base::Bind( 163 base::Bind(
135 &OnObtainedThumbnail, 164 &OnObtainedThumbnail,
136 base::Owned(j_bitmap_ref), base::Owned(j_callback_pass))); 165 base::Owned(j_bitmap_ref), base::Owned(j_callback_pass)));
137 } 166 }
138 167
168 void GetSuggestionsThumbnailOnUIThread(
169 SuggestionsService* suggestions_service,
170 const std::string& url_string,
171 ScopedJavaGlobalRef<jobject>* j_callback) {
172 suggestions_service->GetPageThumbnail(
173 GURL(url_string),
174 base::Bind(&OnSuggestionsThumbnailAvailable,
175 base::Owned(new ScopedJavaGlobalRef<jobject>(*j_callback))));
176 }
177
139 } // namespace 178 } // namespace
140 179
141 MostVisitedSites::MostVisitedSites(Profile* profile) 180 MostVisitedSites::MostVisitedSites(Profile* profile)
142 : profile_(profile), num_sites_(0), weak_ptr_factory_(this) { 181 : profile_(profile), num_sites_(0), weak_ptr_factory_(this) {
143 // Register the debugging page for the Suggestions Service and the thumbnails 182 // Register the debugging page for the Suggestions Service and the thumbnails
144 // debugging page. 183 // debugging page.
145 content::URLDataSource::Add(profile_, 184 content::URLDataSource::Add(profile_,
146 new suggestions::SuggestionsSource(profile_)); 185 new suggestions::SuggestionsSource(profile_));
147 content::URLDataSource::Add(profile_, new ThumbnailListSource(profile_)); 186 content::URLDataSource::Add(profile_, new ThumbnailListSource(profile_));
148 } 187 }
(...skipping 20 matching lines...) Expand all
169 // force an update now. 208 // force an update now.
170 top_sites->SyncWithHistory(); 209 top_sites->SyncWithHistory();
171 210
172 // Register for notification when TopSites changes so that we can update 211 // Register for notification when TopSites changes so that we can update
173 // ourself. 212 // ourself.
174 registrar_.Add(this, chrome::NOTIFICATION_TOP_SITES_CHANGED, 213 registrar_.Add(this, chrome::NOTIFICATION_TOP_SITES_CHANGED,
175 content::Source<history::TopSites>(top_sites)); 214 content::Source<history::TopSites>(top_sites));
176 } 215 }
177 } 216 }
178 217
179 // May be called from any thread 218 // Called from the UI Thread.
Ted C 2014/06/02 22:36:26 Should we DCHECK we are on the UI thread here now?
Mathieu 2014/06/03 15:01:55 Done.
180 void MostVisitedSites::GetURLThumbnail(JNIEnv* env, 219 void MostVisitedSites::GetURLThumbnail(JNIEnv* env,
181 jobject obj, 220 jobject obj,
182 jstring url, 221 jstring url,
183 jobject j_callback_obj) { 222 jobject j_callback_obj) {
184 ScopedJavaGlobalRef<jobject>* j_callback = 223 ScopedJavaGlobalRef<jobject>* j_callback =
185 new ScopedJavaGlobalRef<jobject>(); 224 new ScopedJavaGlobalRef<jobject>();
186 j_callback->Reset(env, j_callback_obj); 225 j_callback->Reset(env, j_callback_obj);
187 226
188 std::string url_string = ConvertJavaStringToUTF8(env, url); 227 std::string url_string = ConvertJavaStringToUTF8(env, url);
189 scoped_refptr<TopSites> top_sites(profile_->GetTopSites()); 228 scoped_refptr<TopSites> top_sites(profile_->GetTopSites());
229
230 // If the Suggestions service is enabled, create a callback to fetch a
231 // server thumbnail from it, in case the local thumbnail is not found.
232 SuggestionsService* suggestions_service =
233 SuggestionsServiceFactory::GetForProfile(profile_);
234 base::Closure lookup_failed_callback = suggestions_service ?
235 base::Bind(&GetSuggestionsThumbnailOnUIThread,
Ted C 2014/06/02 22:36:26 Out of curiosity, would it be better to batch all
Mathieu 2014/06/03 15:01:55 My next CL is going to be implementing local cachi
236 suggestions_service, url_string,
237 base::Owned(new ScopedJavaGlobalRef<jobject>(*j_callback))) :
238 base::Closure();
190 BrowserThread::PostTask( 239 BrowserThread::PostTask(
191 BrowserThread::DB, FROM_HERE, base::Bind( 240 BrowserThread::DB, FROM_HERE,
192 &GetUrlThumbnailTask, 241 base::Bind(
193 url_string, 242 &GetUrlThumbnailTask, url_string, top_sites,
194 top_sites, base::Owned(j_callback))); 243 base::Owned(j_callback), lookup_failed_callback));
195 } 244 }
196 245
197 void MostVisitedSites::BlacklistUrl(JNIEnv* env, 246 void MostVisitedSites::BlacklistUrl(JNIEnv* env,
198 jobject obj, 247 jobject obj,
199 jstring j_url) { 248 jstring j_url) {
200 TopSites* top_sites = profile_->GetTopSites(); 249 TopSites* top_sites = profile_->GetTopSites();
201 if (!top_sites) 250 if (!top_sites)
202 return; 251 return;
203 252
204 std::string url_string = ConvertJavaStringToUTF8(env, j_url); 253 std::string url_string = ConvertJavaStringToUTF8(env, j_url);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 j_observer->obj(), 322 j_observer->obj(),
274 ToJavaArrayOfStrings(env, titles).obj(), 323 ToJavaArrayOfStrings(env, titles).obj(),
275 ToJavaArrayOfStrings(env, urls).obj()); 324 ToJavaArrayOfStrings(env, urls).obj());
276 } 325 }
277 326
278 static jlong Init(JNIEnv* env, jobject obj, jobject jprofile) { 327 static jlong Init(JNIEnv* env, jobject obj, jobject jprofile) {
279 MostVisitedSites* most_visited_sites = 328 MostVisitedSites* most_visited_sites =
280 new MostVisitedSites(ProfileAndroid::FromProfileAndroid(jprofile)); 329 new MostVisitedSites(ProfileAndroid::FromProfileAndroid(jprofile));
281 return reinterpret_cast<intptr_t>(most_visited_sites); 330 return reinterpret_cast<intptr_t>(most_visited_sites);
282 } 331 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698