Commit a2dd0dfd authored by Lambros Lambrou's avatar Lambros Lambrou Committed by Commit Bot

Implement PermissionWizard completion callback.

This allows an optional callback to be notified whenever the user
completes or cancels the wizard.

Bug: 1015201
Change-Id: I93cfa973518b40a840dc20068de5e44636b3806a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1907769
Commit-Queue: Lambros Lambrou <lambroslambrou@chromium.org>
Reviewed-by: default avatarYuwei Huang <yuweih@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714371}
parent 0b58324a
...@@ -25,7 +25,8 @@ class PermissionWizard final { ...@@ -25,7 +25,8 @@ class PermissionWizard final {
class Impl; class Impl;
// Callback for the Delegate to inform this class whether a permission was // Callback for the Delegate to inform this class whether a permission was
// granted. // granted. Also used to inform the caller of Start() whether the wizard
// was completed successfully or cancelled.
using ResultCallback = base::OnceCallback<void(bool granted)>; using ResultCallback = base::OnceCallback<void(bool granted)>;
// Interface to delegate the permission-checks. This will be invoked to test // Interface to delegate the permission-checks. This will be invoked to test
...@@ -54,6 +55,14 @@ class PermissionWizard final { ...@@ -54,6 +55,14 @@ class PermissionWizard final {
PermissionWizard& operator=(const PermissionWizard&) = delete; PermissionWizard& operator=(const PermissionWizard&) = delete;
~PermissionWizard(); ~PermissionWizard();
// Sets an optional callback to be notified when the wizard finishes. If set,
// the callback will be run on the ui_task_runner provided to Start(). The
// result will be true if all permissions were granted (even if no pages were
// actually shown). Result is false if the user cancelled the wizard (which
// should only happen if a page was shown and the associated permission was
// not granted).
void SetCompletionCallback(ResultCallback callback);
void Start(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); void Start(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
private: private:
......
...@@ -60,6 +60,7 @@ class PermissionWizard::Impl { ...@@ -60,6 +60,7 @@ class PermissionWizard::Impl {
explicit Impl(std::unique_ptr<PermissionWizard::Delegate> checker); explicit Impl(std::unique_ptr<PermissionWizard::Delegate> checker);
~Impl(); ~Impl();
void SetCompletionCallback(ResultCallback callback);
void Start(); void Start();
std::string GetBundleName(); std::string GetBundleName();
...@@ -69,6 +70,10 @@ class PermissionWizard::Impl { ...@@ -69,6 +70,10 @@ class PermissionWizard::Impl {
void CheckAccessibilityPermission(base::TimeDelta delay); void CheckAccessibilityPermission(base::TimeDelta delay);
void CheckScreenRecordingPermission(base::TimeDelta delay); void CheckScreenRecordingPermission(base::TimeDelta delay);
// Called by PermissionWizardController to notify that the wizard was
// completed/cancelled.
void NotifyCompletion(bool result);
private: private:
void CheckAccessibilityPermissionNow(); void CheckAccessibilityPermissionNow();
void CheckScreenRecordingPermissionNow(); void CheckScreenRecordingPermissionNow();
...@@ -78,6 +83,10 @@ class PermissionWizard::Impl { ...@@ -78,6 +83,10 @@ class PermissionWizard::Impl {
PermissionWizardController* window_controller_ = nil; PermissionWizardController* window_controller_ = nil;
std::unique_ptr<Delegate> checker_; std::unique_ptr<Delegate> checker_;
base::OneShotTimer timer_; base::OneShotTimer timer_;
// Notified when the wizard is completed/cancelled. May be null.
ResultCallback completion_callback_;
base::WeakPtrFactory<Impl> weak_factory_{this}; base::WeakPtrFactory<Impl> weak_factory_{this};
}; };
...@@ -90,6 +99,10 @@ PermissionWizard::Impl::~Impl() { ...@@ -90,6 +99,10 @@ PermissionWizard::Impl::~Impl() {
[window_controller_ release]; [window_controller_ release];
} }
void PermissionWizard::Impl::SetCompletionCallback(ResultCallback callback) {
completion_callback_ = std::move(callback);
}
void PermissionWizard::Impl::Start() { void PermissionWizard::Impl::Start() {
NSWindow* window = NSWindow* window =
[[[NSWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater [[[NSWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater
...@@ -116,6 +129,11 @@ void PermissionWizard::Impl::CheckScreenRecordingPermission( ...@@ -116,6 +129,11 @@ void PermissionWizard::Impl::CheckScreenRecordingPermission(
&Impl::CheckScreenRecordingPermissionNow); &Impl::CheckScreenRecordingPermissionNow);
} }
void PermissionWizard::Impl::NotifyCompletion(bool result) {
if (completion_callback_)
std::move(completion_callback_).Run(result);
}
void PermissionWizard::Impl::CheckAccessibilityPermissionNow() { void PermissionWizard::Impl::CheckAccessibilityPermissionNow() {
checker_->CheckAccessibilityPermission(base::BindOnce( checker_->CheckAccessibilityPermission(base::BindOnce(
&Impl::OnPermissionCheckResult, weak_factory_.GetWeakPtr())); &Impl::OnPermissionCheckResult, weak_factory_.GetWeakPtr()));
...@@ -275,6 +293,7 @@ void PermissionWizard::Impl::OnPermissionCheckResult(bool result) { ...@@ -275,6 +293,7 @@ void PermissionWizard::Impl::OnPermissionCheckResult(bool result) {
} }
- (void)onCancel:(id)sender { - (void)onCancel:(id)sender {
_impl->NotifyCompletion(false);
_cancelled = YES; _cancelled = YES;
[self hide]; [self hide];
} }
...@@ -282,6 +301,7 @@ void PermissionWizard::Impl::OnPermissionCheckResult(bool result) { ...@@ -282,6 +301,7 @@ void PermissionWizard::Impl::OnPermissionCheckResult(bool result) {
- (void)onNext:(id)sender { - (void)onNext:(id)sender {
if (_page == WizardPage::ALL_SET) { if (_page == WizardPage::ALL_SET) {
// OK button closes the window. // OK button closes the window.
_impl->NotifyCompletion(true);
[self hide]; [self hide];
return; return;
} }
...@@ -360,7 +380,13 @@ void PermissionWizard::Impl::OnPermissionCheckResult(bool result) { ...@@ -360,7 +380,13 @@ void PermissionWizard::Impl::OnPermissionCheckResult(bool result) {
break; break;
case WizardPage::SCREEN_RECORDING: case WizardPage::SCREEN_RECORDING:
_page = WizardPage::ALL_SET; _page = WizardPage::ALL_SET;
[self updateUI]; if ([self window].visible) {
[self updateUI];
} else {
// If the wizard hasn't been shown yet, this means that all permissions
// were already granted, and the final ALL_SET page will not be shown.
_impl->NotifyCompletion(true);
}
return; return;
default: default:
NOTREACHED(); NOTREACHED();
...@@ -461,6 +487,10 @@ PermissionWizard::~PermissionWizard() { ...@@ -461,6 +487,10 @@ PermissionWizard::~PermissionWizard() {
ui_task_runner_->DeleteSoon(FROM_HERE, impl_.release()); ui_task_runner_->DeleteSoon(FROM_HERE, impl_.release());
} }
void PermissionWizard::SetCompletionCallback(ResultCallback callback) {
impl_->SetCompletionCallback(std::move(callback));
}
void PermissionWizard::Start( void PermissionWizard::Start(
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
ui_task_runner_ = ui_task_runner; ui_task_runner_ = ui_task_runner;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment