[sql] Remove _HAS_EXCEPTIONS=0 from build info.
[chromium-blink-merge.git] / chrome / browser / android / offline_pages / offline_page_bridge.cc
blob514dd3ac77aed9eb5a7fd7e8974b878433c2e061
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
3 // found in the LICENSE file.
5 #include "chrome/browser/android/offline_pages/offline_page_bridge.h"
7 #include "base/android/jni_string.h"
8 #include "base/files/file_path.h"
9 #include "chrome/browser/android/offline_pages/offline_page_mhtml_archiver.h"
10 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h"
11 #include "chrome/browser/download/download_prefs.h"
12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/profiles/profile_android.h"
14 #include "components/offline_pages/offline_page_feature.h"
15 #include "components/offline_pages/offline_page_item.h"
16 #include "components/offline_pages/offline_page_model.h"
17 #include "content/public/browser/browser_context.h"
18 #include "content/public/browser/download_manager.h"
19 #include "content/public/browser/web_contents.h"
20 #include "jni/OfflinePageBridge_jni.h"
22 using base::android::ConvertJavaStringToUTF8;
23 using base::android::ConvertUTF16ToJavaString;
24 using base::android::ConvertUTF8ToJavaString;
25 using base::android::ScopedJavaGlobalRef;
27 namespace offline_pages {
28 namespace android {
30 namespace {
32 void LoadAllPagesCallback(ScopedJavaGlobalRef<jobject>* j_callback_obj,
33 ScopedJavaGlobalRef<jobject>* j_result_obj,
34 OfflinePageModel::LoadResult result,
35 const std::vector<OfflinePageItem>& offline_pages) {
36 JNIEnv* env = base::android::AttachCurrentThread();
38 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback_ptr(j_callback_obj);
39 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_result_ptr(j_result_obj);
41 for (const OfflinePageItem& offline_page : offline_pages) {
42 Java_OfflinePageBridge_createOfflinePageAndAddToList(
43 env, j_result_ptr->obj(),
44 ConvertUTF8ToJavaString(env, offline_page.url.spec()).obj(),
45 offline_page.bookmark_id,
46 ConvertUTF8ToJavaString(env, offline_page.GetOfflineURL().spec()).obj(),
47 offline_page.file_size);
50 Java_OfflinePageCallback_onLoadAllPagesDone(env, j_callback_ptr->obj(),
51 static_cast<int>(result),
52 j_result_ptr->obj());
55 void SavePageCallback(ScopedJavaGlobalRef<jobject>* j_callback_obj,
56 const GURL& url,
57 OfflinePageModel::SavePageResult result) {
58 JNIEnv* env = base::android::AttachCurrentThread();
60 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback_ptr(j_callback_obj);
62 Java_OfflinePageCallback_onSavePageDone(
63 env, j_callback_ptr->obj(), static_cast<int>(result),
64 ConvertUTF8ToJavaString(env, url.spec()).obj());
67 } // namespace
69 static jboolean IsOfflinePagesEnabled(JNIEnv* env, jclass clazz) {
70 return offline_pages::IsOfflinePagesEnabled();
73 OfflinePageBridge::OfflinePageBridge(JNIEnv* env,
74 jobject obj,
75 content::BrowserContext* browser_context)
76 : weak_java_ref_(env, obj),
77 offline_page_model_(OfflinePageModelFactory::GetForBrowserContext(
78 browser_context)),
79 browser_context_(browser_context) {
82 void OfflinePageBridge::Destroy(JNIEnv*, jobject) {
83 delete this;
86 void OfflinePageBridge::LoadAllPages(JNIEnv* env,
87 jobject obj,
88 jobject j_callback_obj,
89 jobject j_result_obj) {
90 DCHECK(j_callback_obj);
91 DCHECK(j_result_obj);
93 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback_obj_ptr(
94 new ScopedJavaGlobalRef<jobject>());
95 j_callback_obj_ptr->Reset(env, j_callback_obj);
97 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_result_obj_ptr(
98 new ScopedJavaGlobalRef<jobject>());
99 j_result_obj_ptr->Reset(env, j_result_obj);
101 offline_page_model_->LoadAllPages(base::Bind(&LoadAllPagesCallback,
102 j_callback_obj_ptr.release(),
103 j_result_obj_ptr.release()));
106 void OfflinePageBridge::SavePage(JNIEnv* env,
107 jobject obj,
108 jobject j_callback_obj,
109 jobject j_web_contents,
110 jlong bookmark_id) {
111 DCHECK(j_callback_obj);
112 DCHECK(j_web_contents);
114 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback_obj_ptr(
115 new ScopedJavaGlobalRef<jobject>());
116 j_callback_obj_ptr->Reset(env, j_callback_obj);
118 content::WebContents* web_contents =
119 content::WebContents::FromJavaWebContents(j_web_contents);
120 GURL url(web_contents->GetLastCommittedURL());
122 scoped_ptr<OfflinePageArchiver> archiver(
123 new OfflinePageMHTMLArchiver(web_contents, GetDownloadsPath()));
125 offline_page_model_->SavePage(
126 url, bookmark_id, archiver.Pass(),
127 base::Bind(&SavePageCallback, j_callback_obj_ptr.release(), url));
130 base::FilePath OfflinePageBridge::GetDownloadsPath() const {
131 content::DownloadManager* manager =
132 content::BrowserContext::GetDownloadManager(browser_context_);
133 if (!manager) {
134 DVLOG(1) << "No download manager available in offline page bridge";
135 return base::FilePath();
138 return DownloadPrefs::FromDownloadManager(manager)->DownloadPath();
141 static jlong Init(JNIEnv* env, jobject obj, jobject j_profile) {
142 return reinterpret_cast<jlong>(new OfflinePageBridge(
143 env, obj, ProfileAndroid::FromProfileAndroid(j_profile)));
146 bool RegisterOfflinePageBridge(JNIEnv* env) {
147 return RegisterNativesImpl(env);
150 } // namespace android
151 } // namespace offline_pages