blob: 2a4cad944373f377e90172236c360e8f0672ec10 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_
#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_
#include "base/android/scoped_java_ref.h"
#include "base/memory/raw_ptr.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/favicon_base/favicon_callback.h"
#include "content/public/browser/web_contents_observer.h"
using base::android::JavaParamRef;
namespace content {
class WebContents;
class Page;
} // namespace content
namespace permissions {
class PermissionDialogDelegate;
class PermissionPromptAndroid;
class PermissionDialogJavaDelegate {
public:
explicit PermissionDialogJavaDelegate(
PermissionPromptAndroid* permission_prompt);
virtual ~PermissionDialogJavaDelegate();
PermissionDialogJavaDelegate(const PermissionDialogJavaDelegate&) = delete;
PermissionDialogJavaDelegate& operator=(const PermissionDialogJavaDelegate&) =
delete;
virtual void CreateJavaDelegate(content::WebContents* web_contents,
PermissionDialogDelegate* owner);
virtual void CreateDialog(content::WebContents* web_contents);
void GetAndUpdateRequestingOriginFavicon(content::WebContents* web_contents);
void OnRequestingOriginFaviconLoaded(
const favicon_base::FaviconRawBitmapResult& favicon_result);
virtual void DismissDialog();
virtual void UpdateDialog();
virtual void NotifyPermissionAllowed();
private:
base::android::ScopedJavaGlobalRef<jobject> j_delegate_;
raw_ptr<PermissionPromptAndroid, DanglingUntriaged> permission_prompt_;
// The task tracker for loading favicons.
base::CancelableTaskTracker favicon_tracker_;
};
// Delegate class for displaying a permission prompt as a modal dialog. Used as
// the native to Java interface to allow Java to communicate the user's
// decision.
class PermissionDialogDelegate : public content::WebContentsObserver {
public:
PermissionDialogDelegate(
content::WebContents* web_contents,
PermissionPromptAndroid* permission_prompt,
std::unique_ptr<PermissionDialogJavaDelegate> java_delegate);
~PermissionDialogDelegate() override;
// The interface for creating a modal dialog when the PermissionRequestManager
// is enabled.
static std::unique_ptr<PermissionDialogDelegate> Create(
content::WebContents* web_contents,
PermissionPromptAndroid* permission_prompt);
static std::unique_ptr<PermissionDialogDelegate> CreateForTesting(
content::WebContents* web_contents,
PermissionPromptAndroid* permission_prompt,
std::unique_ptr<PermissionDialogJavaDelegate> java_delegate);
PermissionDialogDelegate(const PermissionDialogDelegate&) = delete;
PermissionDialogDelegate& operator=(const PermissionDialogDelegate&) = delete;
// JNI methods.
void Accept(JNIEnv* env);
void AcceptThisTime(JNIEnv* env);
void Acknowledge(JNIEnv* env);
void Deny(JNIEnv* env);
void Dismissed(JNIEnv* env,
int dismissalType);
void Resumed(JNIEnv* env);
void SystemSettingsShown(JNIEnv* env);
void SystemPermissionResolved(JNIEnv* env,
bool accepted);
// Reset the java JNI object object. Called from Java once the permission
// dialog has been responded to.
void Destroy(JNIEnv* env);
bool IsJavaDelegateDestroyed() const { return !java_delegate_; }
// Notify Java side to update content view of the dialog associated with this
// object.
void UpdateDialog();
// Notify Java side that the permission has been allowed. It's basically the
// end if a permission flow and Java side can perform next task, such as
// update permission icon or showing next dialog.
void NotifyPermissionAllowed();
void OnGeolocationAccuracySelected(JNIEnv* env, bool isPrecise);
private:
// On navigation or page destruction, hide the dialog.
void DismissDialog();
void DestroyJavaDelegate() { java_delegate_.reset(); }
// WebContentsObserver:
void PrimaryPageChanged(content::Page&) override;
void WebContentsDestroyed() override;
base::android::ScopedJavaLocalRef<jstring> GetPositiveButtonText(
JNIEnv* env,
bool is_one_time) const;
base::android::ScopedJavaLocalRef<jstring> GetNegativeButtonText(
JNIEnv* env,
bool is_one_time) const;
base::android::ScopedJavaLocalRef<jstring> GetPositiveEphemeralButtonText(
JNIEnv* env,
bool is_one_time) const;
// `permission_prompt_` owns and outlives this object, this is safe to use.
raw_ptr<PermissionPromptAndroid> permission_prompt_;
// The PermissionDialogJavaDelegate abstracts away JNI connectivity from
// native to Java in order to facilicate unit testing.
std::unique_ptr<PermissionDialogJavaDelegate> java_delegate_;
};
} // namespace permissions
#endif // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_