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

Side by Side Diff: chrome/browser/android/offline_pages/offline_page_bridge.cc

Issue 1694863003: Refactor the offline page storage to include client namespace and id. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move id generation to C++, add DB migration Created 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/offline_page_bridge.h" 5 #include "chrome/browser/android/offline_pages/offline_page_bridge.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/android/jni_array.h" 9 #include "base/android/jni_array.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
11 #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h" 11 #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h"
12 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" 12 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h"
13 #include "chrome/browser/android/offline_pages/offline_page_utils.h" 13 #include "chrome/browser/android/offline_pages/offline_page_utils.h"
14 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/profiles/profile_android.h" 15 #include "chrome/browser/profiles/profile_android.h"
16 #include "components/offline_pages/offline_page_feature.h" 16 #include "components/offline_pages/offline_page_feature.h"
17 #include "components/offline_pages/offline_page_item.h" 17 #include "components/offline_pages/offline_page_item.h"
18 #include "components/offline_pages/offline_page_model.h" 18 #include "components/offline_pages/offline_page_model.h"
19 #include "components/offline_pages/proto/offline_pages.pb.h"
19 #include "content/public/browser/browser_context.h" 20 #include "content/public/browser/browser_context.h"
20 #include "content/public/browser/web_contents.h" 21 #include "content/public/browser/web_contents.h"
21 #include "jni/OfflinePageBridge_jni.h" 22 #include "jni/OfflinePageBridge_jni.h"
22 #include "net/base/filename_util.h" 23 #include "net/base/filename_util.h"
23 24
24 using base::android::ConvertJavaStringToUTF8; 25 using base::android::ConvertJavaStringToUTF8;
25 using base::android::ConvertUTF8ToJavaString; 26 using base::android::ConvertUTF8ToJavaString;
26 using base::android::ScopedJavaGlobalRef; 27 using base::android::ScopedJavaGlobalRef;
27 using base::android::ScopedJavaLocalRef; 28 using base::android::ScopedJavaLocalRef;
28 29
29 namespace offline_pages { 30 namespace offline_pages {
30 namespace android { 31 namespace android {
31 32
32 namespace { 33 namespace {
33 34
34 void SavePageCallback(const ScopedJavaGlobalRef<jobject>& j_callback_obj, 35 void SavePageCallback(const ScopedJavaGlobalRef<jobject>& j_callback_obj,
35 const GURL& url, 36 const GURL& url,
36 OfflinePageModel::SavePageResult result) { 37 OfflinePageModel::SavePageResult result,
38 int64_t offline_id) {
37 JNIEnv* env = base::android::AttachCurrentThread(); 39 JNIEnv* env = base::android::AttachCurrentThread();
38 40
39 Java_SavePageCallback_onSavePageDone( 41 Java_SavePageCallback_onSavePageDone(
40 env, j_callback_obj.obj(), static_cast<int>(result), 42 env, j_callback_obj.obj(), static_cast<int>(result),
41 ConvertUTF8ToJavaString(env, url.spec()).obj()); 43 ConvertUTF8ToJavaString(env, url.spec()).obj(), offline_id);
42 } 44 }
43 45
44 void DeletePageCallback(const ScopedJavaGlobalRef<jobject>& j_callback_obj, 46 void DeletePageCallback(const ScopedJavaGlobalRef<jobject>& j_callback_obj,
45 OfflinePageModel::DeletePageResult result) { 47 OfflinePageModel::DeletePageResult result) {
46 JNIEnv* env = base::android::AttachCurrentThread(); 48 JNIEnv* env = base::android::AttachCurrentThread();
47 49
48 Java_DeletePageCallback_onDeletePageDone( 50 Java_DeletePageCallback_onDeletePageDone(
49 env, j_callback_obj.obj(), static_cast<int>(result)); 51 env, j_callback_obj.obj(), static_cast<int>(result));
50 } 52 }
51 53
52 void ToJavaOfflinePageList(JNIEnv* env, 54 void ToJavaOfflinePageList(JNIEnv* env,
53 jobject j_result_obj, 55 jobject j_result_obj,
54 const std::vector<OfflinePageItem>& offline_pages) { 56 const std::vector<OfflinePageItem>& offline_pages) {
55 for (const OfflinePageItem& offline_page : offline_pages) { 57 for (const OfflinePageItem& offline_page : offline_pages) {
56 Java_OfflinePageBridge_createOfflinePageAndAddToList( 58 Java_OfflinePageBridge_createOfflinePageAndAddToList(
57 env, j_result_obj, 59 env, j_result_obj,
58 ConvertUTF8ToJavaString(env, offline_page.url.spec()).obj(), 60 ConvertUTF8ToJavaString(env, offline_page.url.spec()).obj(),
59 offline_page.bookmark_id, 61 offline_page.offline_id,
60 ConvertUTF8ToJavaString(env, offline_page.GetOfflineURL().spec()).obj(), 62 ConvertUTF8ToJavaString(env, offline_page.GetOfflineURL().spec()).obj(),
61 offline_page.file_size, 63 offline_page.file_size, offline_page.creation_time.ToJavaTime(),
62 offline_page.creation_time.ToJavaTime(), 64 offline_page.access_count, offline_page.last_access_time.ToJavaTime());
63 offline_page.access_count,
64 offline_page.last_access_time.ToJavaTime());
65 } 65 }
66 } 66 }
67 67
68 } // namespace 68 } // namespace
69 69
70 static jint GetFeatureMode(JNIEnv* env, const JavaParamRef<jclass>& clazz) { 70 static jint GetFeatureMode(JNIEnv* env, const JavaParamRef<jclass>& clazz) {
71 return static_cast<jint>(offline_pages::GetOfflinePageFeatureMode()); 71 return static_cast<jint>(offline_pages::GetOfflinePageFeatureMode());
72 } 72 }
73 73
74 static jboolean CanSavePage(JNIEnv* env, 74 static jboolean CanSavePage(JNIEnv* env,
(...skipping 26 matching lines...) Expand all
101 101
102 void OfflinePageBridge::OfflinePageModelChanged(OfflinePageModel* model) { 102 void OfflinePageBridge::OfflinePageModelChanged(OfflinePageModel* model) {
103 DCHECK_EQ(offline_page_model_, model); 103 DCHECK_EQ(offline_page_model_, model);
104 JNIEnv* env = base::android::AttachCurrentThread(); 104 JNIEnv* env = base::android::AttachCurrentThread();
105 ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env); 105 ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
106 if (obj.is_null()) 106 if (obj.is_null())
107 return; 107 return;
108 Java_OfflinePageBridge_offlinePageModelChanged(env, obj.obj()); 108 Java_OfflinePageBridge_offlinePageModelChanged(env, obj.obj());
109 } 109 }
110 110
111 void OfflinePageBridge::OfflinePageDeleted(int64_t bookmark_id) { 111 void OfflinePageBridge::OfflinePageDeleted(int64_t offline_id) {
112 JNIEnv* env = base::android::AttachCurrentThread(); 112 JNIEnv* env = base::android::AttachCurrentThread();
113 ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env); 113 ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
114 if (obj.is_null()) 114 if (obj.is_null())
115 return; 115 return;
116 Java_OfflinePageBridge_offlinePageDeleted(env, obj.obj(), bookmark_id); 116 Java_OfflinePageBridge_offlinePageDeleted(env, obj.obj(), offline_id);
117 } 117 }
118 118
119 void OfflinePageBridge::GetAllPages(JNIEnv* env, 119 void OfflinePageBridge::GetAllPages(JNIEnv* env,
120 const JavaParamRef<jobject>& obj, 120 const JavaParamRef<jobject>& obj,
121 const JavaParamRef<jobject>& j_result_obj) { 121 const JavaParamRef<jobject>& j_result_obj) {
122 DCHECK(offline_page_model_->is_loaded()); 122 DCHECK(offline_page_model_->is_loaded());
123 DCHECK(j_result_obj); 123 DCHECK(j_result_obj);
124 const std::vector<OfflinePageItem> offline_pages = 124 const std::vector<OfflinePageItem> offline_pages =
125 offline_page_model_->GetAllPages(); 125 offline_page_model_->GetAllPages();
126 ToJavaOfflinePageList(env, j_result_obj, offline_pages); 126 ToJavaOfflinePageList(env, j_result_obj, offline_pages);
127 } 127 }
128 128
129 void OfflinePageBridge::GetPagesToCleanUp( 129 void OfflinePageBridge::GetPagesToCleanUp(
130 JNIEnv* env, 130 JNIEnv* env,
131 const JavaParamRef<jobject>& obj, 131 const JavaParamRef<jobject>& obj,
132 const JavaParamRef<jobject>& j_result_obj) { 132 const JavaParamRef<jobject>& j_result_obj) {
133 DCHECK(offline_page_model_->is_loaded()); 133 DCHECK(offline_page_model_->is_loaded());
134 DCHECK(j_result_obj); 134 DCHECK(j_result_obj);
135 const std::vector<OfflinePageItem> offline_pages = 135 const std::vector<OfflinePageItem> offline_pages =
136 offline_page_model_->GetPagesToCleanUp(); 136 offline_page_model_->GetPagesToCleanUp();
137 ToJavaOfflinePageList(env, j_result_obj, offline_pages); 137 ToJavaOfflinePageList(env, j_result_obj, offline_pages);
138 } 138 }
139 139
140 ScopedJavaLocalRef<jobject> OfflinePageBridge::GetPageByBookmarkId( 140 ScopedJavaLocalRef<jlongArray> OfflinePageBridge::GetOfflineIdsForClientId(
141 JNIEnv* env, 141 JNIEnv* env,
142 const JavaParamRef<jobject>& obj, 142 const JavaParamRef<jobject>& obj,
143 jlong bookmark_id) { 143 const JavaParamRef<jstring>& j_client_id_namespace,
144 const JavaParamRef<jstring>& j_client_id) {
145 DCHECK(offline_page_model_->is_loaded());
146 offline_pages::ClientId cid;
147 cid.name_space = ConvertJavaStringToUTF8(env, j_client_id_namespace);
148 cid.id = ConvertJavaStringToUTF8(env, j_client_id);
149
150 std::vector<int64_t> results =
151 offline_page_model_->GetOfflineIdsForClientId(cid);
152
153 return base::android::ToJavaLongArray(env, results);
154 }
155
156 ScopedJavaLocalRef<jobject> OfflinePageBridge::GetPageByOfflineId(
157 JNIEnv* env,
158 const JavaParamRef<jobject>& obj,
159 jlong offline_id) {
144 const OfflinePageItem* offline_page = 160 const OfflinePageItem* offline_page =
145 offline_page_model_->GetPageByBookmarkId(bookmark_id); 161 offline_page_model_->GetPageByOfflineId(offline_id);
146 if (!offline_page) 162 if (!offline_page)
147 return ScopedJavaLocalRef<jobject>(); 163 return ScopedJavaLocalRef<jobject>();
148 return CreateOfflinePageItem(env, *offline_page); 164 return CreateOfflinePageItem(env, *offline_page);
149 } 165 }
150 166
151 ScopedJavaLocalRef<jobject> OfflinePageBridge::GetPageByOnlineURL( 167 ScopedJavaLocalRef<jobject> OfflinePageBridge::GetPageByOnlineURL(
152 JNIEnv* env, 168 JNIEnv* env,
153 const JavaParamRef<jobject>& obj, 169 const JavaParamRef<jobject>& obj,
154 const JavaParamRef<jstring>& online_url) { 170 const JavaParamRef<jstring>& online_url) {
155 const OfflinePageItem* offline_page = offline_page_model_->GetPageByOnlineURL( 171 const OfflinePageItem* offline_page = offline_page_model_->GetPageByOnlineURL(
156 GURL(ConvertJavaStringToUTF8(env, online_url))); 172 GURL(ConvertJavaStringToUTF8(env, online_url)));
157 if (!offline_page) 173 if (!offline_page)
158 return ScopedJavaLocalRef<jobject>(); 174 return ScopedJavaLocalRef<jobject>();
159 return CreateOfflinePageItem(env, *offline_page); 175 return CreateOfflinePageItem(env, *offline_page);
160 } 176 }
161 177
162 void OfflinePageBridge::SavePage(JNIEnv* env, 178 void OfflinePageBridge::SavePage(
163 const JavaParamRef<jobject>& obj, 179 JNIEnv* env,
164 const JavaParamRef<jobject>& j_callback_obj, 180 const JavaParamRef<jobject>& obj,
165 const JavaParamRef<jobject>& j_web_contents, 181 const JavaParamRef<jobject>& j_callback_obj,
166 jlong bookmark_id) { 182 const JavaParamRef<jobject>& j_web_contents,
183 jlong offline_id,
184 const JavaParamRef<jstring>& j_client_id_namespace,
185 const JavaParamRef<jstring>& j_client_id) {
167 DCHECK(j_callback_obj); 186 DCHECK(j_callback_obj);
168 DCHECK(j_web_contents); 187 DCHECK(j_web_contents);
169 188
170 ScopedJavaGlobalRef<jobject> j_callback_ref; 189 ScopedJavaGlobalRef<jobject> j_callback_ref;
171 j_callback_ref.Reset(env, j_callback_obj); 190 j_callback_ref.Reset(env, j_callback_obj);
172 191
173 content::WebContents* web_contents = 192 content::WebContents* web_contents =
174 content::WebContents::FromJavaWebContents(j_web_contents); 193 content::WebContents::FromJavaWebContents(j_web_contents);
175 GURL url(web_contents->GetLastCommittedURL()); 194 GURL url(web_contents->GetLastCommittedURL());
176 195
177 scoped_ptr<OfflinePageArchiver> archiver( 196 scoped_ptr<OfflinePageArchiver> archiver(
178 new OfflinePageMHTMLArchiver(web_contents)); 197 new OfflinePageMHTMLArchiver(web_contents));
179 198
199 offline_pages::ClientId cid;
Dmitry Titov 2016/02/25 03:31:52 client_id (to avoid abbreviation and also confusio
bburns 2016/02/26 00:14:35 Done.
200 cid.name_space = ConvertJavaStringToUTF8(env, j_client_id_namespace);
201 cid.id = ConvertJavaStringToUTF8(env, j_client_id);
202
180 offline_page_model_->SavePage( 203 offline_page_model_->SavePage(
181 url, bookmark_id, std::move(archiver), 204 url, offline_id, cid, std::move(archiver),
182 base::Bind(&SavePageCallback, j_callback_ref, url)); 205 base::Bind(&SavePageCallback, j_callback_ref, url));
183 } 206 }
184 207
185 void OfflinePageBridge::MarkPageAccessed(JNIEnv* env, 208 void OfflinePageBridge::MarkPageAccessed(JNIEnv* env,
186 const JavaParamRef<jobject>& obj, 209 const JavaParamRef<jobject>& obj,
187 jlong bookmark_id) { 210 jlong offline_id) {
188 offline_page_model_->MarkPageAccessed(bookmark_id); 211 offline_page_model_->MarkPageAccessed(offline_id);
189 } 212 }
190 213
191 void OfflinePageBridge::DeletePage(JNIEnv* env, 214 void OfflinePageBridge::DeletePage(JNIEnv* env,
192 const JavaParamRef<jobject>& obj, 215 const JavaParamRef<jobject>& obj,
193 const JavaParamRef<jobject>& j_callback_obj, 216 const JavaParamRef<jobject>& j_callback_obj,
194 jlong bookmark_id) { 217 jlong offline_id) {
195 DCHECK(j_callback_obj); 218 DCHECK(j_callback_obj);
196 219
197 ScopedJavaGlobalRef<jobject> j_callback_ref; 220 ScopedJavaGlobalRef<jobject> j_callback_ref;
198 j_callback_ref.Reset(env, j_callback_obj); 221 j_callback_ref.Reset(env, j_callback_obj);
199 222
200 offline_page_model_->DeletePageByBookmarkId(bookmark_id, base::Bind( 223 offline_page_model_->DeletePageByOfflineId(
201 &DeletePageCallback, j_callback_ref)); 224 offline_id, base::Bind(&DeletePageCallback, j_callback_ref));
202 } 225 }
203 226
204 void OfflinePageBridge::DeletePages( 227 void OfflinePageBridge::DeletePages(
205 JNIEnv* env, 228 JNIEnv* env,
206 const JavaParamRef<jobject>& obj, 229 const JavaParamRef<jobject>& obj,
207 const JavaParamRef<jobject>& j_callback_obj, 230 const JavaParamRef<jobject>& j_callback_obj,
208 const JavaParamRef<jlongArray>& bookmark_ids_array) { 231 const JavaParamRef<jlongArray>& offline_ids_array) {
209 DCHECK(j_callback_obj); 232 DCHECK(j_callback_obj);
210 233
211 ScopedJavaGlobalRef<jobject> j_callback_ref; 234 ScopedJavaGlobalRef<jobject> j_callback_ref;
212 j_callback_ref.Reset(env, j_callback_obj); 235 j_callback_ref.Reset(env, j_callback_obj);
213 236
214 std::vector<int64_t> bookmark_ids; 237 std::vector<int64_t> offline_ids;
215 base::android::JavaLongArrayToInt64Vector(env, bookmark_ids_array, 238 base::android::JavaLongArrayToInt64Vector(env, offline_ids_array,
216 &bookmark_ids); 239 &offline_ids);
217 240
218 offline_page_model_->DeletePagesByBookmarkId( 241 offline_page_model_->DeletePagesByOfflineId(
219 bookmark_ids, 242 offline_ids, base::Bind(&DeletePageCallback, j_callback_ref));
220 base::Bind(&DeletePageCallback, j_callback_ref));
221 } 243 }
222 244
223 void OfflinePageBridge::CheckMetadataConsistency( 245 void OfflinePageBridge::CheckMetadataConsistency(
224 JNIEnv* env, 246 JNIEnv* env,
225 const JavaParamRef<jobject>& obj) { 247 const JavaParamRef<jobject>& obj) {
226 offline_page_model_->CheckForExternalFileDeletion(); 248 offline_page_model_->CheckForExternalFileDeletion();
227 } 249 }
228 250
229 ScopedJavaLocalRef<jstring> OfflinePageBridge::GetOfflineUrlForOnlineUrl( 251 ScopedJavaLocalRef<jstring> OfflinePageBridge::GetOfflineUrlForOnlineUrl(
230 JNIEnv* env, 252 JNIEnv* env,
(...skipping 15 matching lines...) Expand all
246 if (obj.is_null()) 268 if (obj.is_null())
247 return; 269 return;
248 Java_OfflinePageBridge_offlinePageModelLoaded(env, obj.obj()); 270 Java_OfflinePageBridge_offlinePageModelLoaded(env, obj.obj());
249 } 271 }
250 272
251 ScopedJavaLocalRef<jobject> OfflinePageBridge::CreateOfflinePageItem( 273 ScopedJavaLocalRef<jobject> OfflinePageBridge::CreateOfflinePageItem(
252 JNIEnv* env, 274 JNIEnv* env,
253 const OfflinePageItem& offline_page) const { 275 const OfflinePageItem& offline_page) const {
254 return Java_OfflinePageBridge_createOfflinePageItem( 276 return Java_OfflinePageBridge_createOfflinePageItem(
255 env, ConvertUTF8ToJavaString(env, offline_page.url.spec()).obj(), 277 env, ConvertUTF8ToJavaString(env, offline_page.url.spec()).obj(),
256 offline_page.bookmark_id, 278 offline_page.offline_id,
257 ConvertUTF8ToJavaString(env, offline_page.GetOfflineURL().spec()).obj(), 279 ConvertUTF8ToJavaString(env, offline_page.GetOfflineURL().spec()).obj(),
258 offline_page.file_size, 280 offline_page.file_size, offline_page.creation_time.ToJavaTime(),
259 offline_page.creation_time.ToJavaTime(), 281 offline_page.access_count, offline_page.last_access_time.ToJavaTime());
260 offline_page.access_count,
261 offline_page.last_access_time.ToJavaTime());
262 } 282 }
263 283
264 static jlong Init(JNIEnv* env, 284 static jlong Init(JNIEnv* env,
265 const JavaParamRef<jobject>& obj, 285 const JavaParamRef<jobject>& obj,
266 const JavaParamRef<jobject>& j_profile) { 286 const JavaParamRef<jobject>& j_profile) {
267 return reinterpret_cast<jlong>(new OfflinePageBridge( 287 return reinterpret_cast<jlong>(new OfflinePageBridge(
268 env, obj, ProfileAndroid::FromProfileAndroid(j_profile))); 288 env, obj, ProfileAndroid::FromProfileAndroid(j_profile)));
269 } 289 }
270 290
271 bool RegisterOfflinePageBridge(JNIEnv* env) { 291 bool RegisterOfflinePageBridge(JNIEnv* env) {
272 return RegisterNativesImpl(env); 292 return RegisterNativesImpl(env);
273 } 293 }
274 294
275 } // namespace android 295 } // namespace android
276 } // namespace offline_pages 296 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698