blob: 248decdb2c03f86b905b7b471ec032154d234697 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_OFFLINE_PAGES_ANDROID_OFFLINE_PAGE_BRIDGE_H_
#define CHROME_BROWSER_OFFLINE_PAGES_ANDROID_OFFLINE_PAGE_BRIDGE_H_
#include <stdint.h>
#include "base/android/jni_android.h"
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/supports_user_data.h"
#include "components/offline_items_collection/core/launch_location.h"
#include "components/offline_pages/core/background/save_page_request.h"
#include "components/offline_pages/core/offline_page_item.h"
#include "components/offline_pages/core/offline_page_model.h"
namespace content {
class BrowserContext;
class WebContents;
}
namespace offline_pages {
namespace android {
// This enum must be kept in sync with enums.xml - OfflinePagesPublishSource
enum PublishSource { kPublishByOfflineId = 0, kPublishByGuid = 1, kMaxValue };
/**
* Bridge between C++ and Java for exposing native implementation of offline
* pages model in managed code.
*/
class OfflinePageBridge : public OfflinePageModel::Observer,
public base::SupportsUserData::Data {
public:
static base::android::ScopedJavaLocalRef<jobject> ConvertToJavaOfflinePage(
JNIEnv* env,
const OfflinePageItem& offline_page);
static base::android::ScopedJavaLocalRef<jobjectArray>
CreateJavaSavePageRequests(
JNIEnv* env,
std::vector<std::unique_ptr<SavePageRequest>> requests);
static void AddOfflinePageItemsToJavaList(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_result_obj,
const std::vector<OfflinePageItem>& offline_pages);
static std::string GetEncodedOriginApp(
const content::WebContents* web_contents);
OfflinePageBridge(JNIEnv* env,
content::BrowserContext* browser_context,
OfflinePageModel* offline_page_model);
~OfflinePageBridge() override;
// OfflinePageModel::Observer implementation.
void OfflinePageModelLoaded(OfflinePageModel* model) override;
void OfflinePageAdded(OfflinePageModel* model,
const OfflinePageItem& added_page) override;
void OfflinePageDeleted(
const OfflinePageModel::DeletedPageInfo& page_info) override;
void GetAllPages(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_result_obj,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void GetPageByOfflineId(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong offline_id,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void DeletePagesByClientId(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobjectArray>& j_namespaces_array,
const base::android::JavaParamRef<jobjectArray>& j_ids_array,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void DeletePagesByClientIdAndOrigin(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobjectArray>& j_namespaces_array,
const base::android::JavaParamRef<jobjectArray>& j_ids_array,
const base::android::JavaParamRef<jstring>& j_origin,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void DeletePagesByOfflineId(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jlongArray>& j_offline_ids_array,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void GetPagesByClientId(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_result_obj,
const base::android::JavaParamRef<jobjectArray>& j_namespaces_array,
const base::android::JavaParamRef<jobjectArray>& j_ids_array,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void GetPagesByRequestOrigin(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_result_obj,
const base::android::JavaParamRef<jstring>& j_request_origin,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void GetPagesByNamespace(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_result_obj,
const base::android::JavaParamRef<jstring>& j_namespace,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void SelectPageForOnlineUrl(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_online_url,
int tab_id,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void SavePage(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_callback_obj,
const base::android::JavaParamRef<jobject>& j_web_contents,
const base::android::JavaParamRef<jstring>& j_namespace,
const base::android::JavaParamRef<jstring>& j_client_id,
const base::android::JavaParamRef<jstring>& j_origin);
void SavePageLater(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_callback_obj,
const base::android::JavaParamRef<jstring>& url,
const base::android::JavaParamRef<jstring>& j_namespace,
const base::android::JavaParamRef<jstring>& j_client_id,
const base::android::JavaParamRef<jstring>& j_origin,
jboolean user_requested);
void PublishInternalPageByOfflineId(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const jlong j_offline_id,
const base::android::JavaParamRef<jobject>& j_published_callback);
void PublishInternalPageByGuid(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_guid,
const base::android::JavaParamRef<jobject>& j_published_callback);
jboolean IsShowingOfflinePreview(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
jboolean IsShowingDownloadButtonInErrorPage(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
base::android::ScopedJavaLocalRef<jstring> GetOfflinePageHeaderForReload(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
void GetRequestsInQueue(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void RemoveRequestsFromQueue(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jlongArray>& j_request_ids_array,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void WillCloseTab(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
void ScheduleDownload(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents,
const base::android::JavaParamRef<jstring>& j_namespace,
const base::android::JavaParamRef<jstring>& j_url,
int ui_action,
const base::android::JavaParamRef<jstring>& j_origin);
base::android::ScopedJavaGlobalRef<jobject> java_ref() { return java_ref_; }
jboolean IsOfflinePage(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
jboolean IsInPrivateDirectory(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_file_path);
jboolean IsUserRequestedDownloadNamespace(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_name_space);
base::android::ScopedJavaLocalRef<jobject> GetOfflinePage(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
void CheckForNewOfflineContent(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const jlong j_timestamp_millis,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void GetLoadUrlParamsByOfflineId(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong j_offline_id,
jint launch_location,
const base::android::JavaParamRef<jobject>& j_callback_obj);
void GetLoadUrlParamsForOpeningMhtmlFileOrContent(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_url,
const base::android::JavaParamRef<jobject>& j_callback_obj);
jboolean IsShowingTrustedOfflinePage(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
void AcquireFileAccessPermission(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents,
const base::android::JavaParamRef<jobject>& j_callback_obj);
private:
void GetPageByOfflineIdDone(
offline_items_collection::LaunchLocation launch_location,
const base::android::ScopedJavaGlobalRef<jobject>& j_callback_obj,
const OfflinePageItem* offline_page);
void GetSizeAndComputeDigestDone(
const base::android::ScopedJavaGlobalRef<jobject>& j_callback_obj,
const GURL& intent_url,
std::pair<int64_t, std::string> size_and_digest);
void GetPageBySizeAndDigestDone(
const base::android::ScopedJavaGlobalRef<jobject>& j_callback_obj,
const GURL& intent_url,
const OfflinePageItem* offline_page);
void NotifyIfDoneLoading() const;
base::android::ScopedJavaLocalRef<jobject> CreateClientId(
JNIEnv* env,
const ClientId& clientId) const;
void PublishInternalArchive(
const base::android::ScopedJavaGlobalRef<jobject>& j_callback_obj,
const PublishSource publish_source,
const OfflinePageItem* offline_page);
base::android::ScopedJavaGlobalRef<jobject> java_ref_;
// Not owned.
content::BrowserContext* browser_context_;
// Not owned.
OfflinePageModel* offline_page_model_;
base::WeakPtrFactory<OfflinePageBridge> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(OfflinePageBridge);
};
} // namespace android
} // namespace offline_pages
#endif // CHROME_BROWSER_OFFLINE_PAGES_ANDROID_OFFLINE_PAGE_BRIDGE_H_