Commit 34b60537 authored by Jun Cai's avatar Jun Cai Committed by Commit Bot

[sms] Refactor SmsDialog to use event handler

This CL refactors SmsDialog to use event handler. An enum SmsDialogEvent
is added to SmsDialog class and can be used by both C++ and Java code.

Bug: 985441
Change-Id: I1ecc4e70609479124c80a7166a9551ffa77566a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1737875
Commit-Queue: Jun Cai <juncai@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarAyu Ishii <ayui@chromium.org>
Cr-Commit-Position: refs/heads/master@{#686524}
parent 879306f3
...@@ -23,6 +23,7 @@ import org.chromium.base.VisibleForTesting; ...@@ -23,6 +23,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.content_public.browser.sms.Event;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
/** /**
...@@ -72,13 +73,13 @@ public class SmsReceiverDialog { ...@@ -72,13 +73,13 @@ public class SmsReceiverDialog {
Button cancelButton = (Button) dialogContainer.findViewById(R.id.cancel_button); Button cancelButton = (Button) dialogContainer.findViewById(R.id.cancel_button);
cancelButton.setOnClickListener(v -> { cancelButton.setOnClickListener(v -> {
assert mNativeSmsDialogAndroid != 0; assert mNativeSmsDialogAndroid != 0;
SmsReceiverDialogJni.get().onCancel(mNativeSmsDialogAndroid); SmsReceiverDialogJni.get().onEvent(mNativeSmsDialogAndroid, Event.CANCEL);
}); });
mConfirmButton = (Button) dialogContainer.findViewById(R.id.confirm_button); mConfirmButton = (Button) dialogContainer.findViewById(R.id.confirm_button);
mConfirmButton.setOnClickListener(v -> { mConfirmButton.setOnClickListener(v -> {
assert mNativeSmsDialogAndroid != 0; assert mNativeSmsDialogAndroid != 0;
SmsReceiverDialogJni.get().onConfirm(mNativeSmsDialogAndroid); SmsReceiverDialogJni.get().onEvent(mNativeSmsDialogAndroid, Event.CONFIRM);
}); });
mDialog = new Dialog(mActivity); mDialog = new Dialog(mActivity);
...@@ -149,7 +150,6 @@ public class SmsReceiverDialog { ...@@ -149,7 +150,6 @@ public class SmsReceiverDialog {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
void onCancel(long nativeSmsDialogAndroid); void onEvent(long nativeSmsDialogAndroid, int eventType);
void onConfirm(long nativeSmsDialogAndroid);
} }
} }
...@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.ChromeActivity; ...@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.content_public.browser.sms.Event;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.browser.test.util.TestTouchUtils; import org.chromium.content_public.browser.test.util.TestTouchUtils;
import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.ActivityWindowAndroid;
...@@ -52,13 +53,17 @@ public class SmsReceiverDialogTest { ...@@ -52,13 +53,17 @@ public class SmsReceiverDialogTest {
private class TestSmsReceiverDialogJni implements SmsReceiverDialog.Natives { private class TestSmsReceiverDialogJni implements SmsReceiverDialog.Natives {
@Override @Override
public void onCancel(long nativeSmsDialogAndroid) { public void onEvent(long nativeSmsDialogAndroid, int eventType) {
switch (eventType) {
case Event.CANCEL:
mCancelButtonClickedCallback.notifyCalled(); mCancelButtonClickedCallback.notifyCalled();
} return;
case Event.CONFIRM:
@Override
public void onConfirm(long nativeSmsDialogAndroid) {
mConfirmButtonClickedCallback.notifyCalled(); mConfirmButtonClickedCallback.notifyCalled();
return;
default:
assert false : "|eventType| is invalid";
}
} }
} }
......
...@@ -32,10 +32,8 @@ SmsDialogAndroid::~SmsDialogAndroid() { ...@@ -32,10 +32,8 @@ SmsDialogAndroid::~SmsDialogAndroid() {
} }
void SmsDialogAndroid::Open(content::RenderFrameHost* host, void SmsDialogAndroid::Open(content::RenderFrameHost* host,
base::OnceClosure on_confirm, EventHandler handler) {
base::OnceClosure on_cancel) { handler_ = std::move(handler);
on_confirm_ = std::move(on_confirm);
on_cancel_ = std::move(on_cancel);
content::WebContents* web_contents = content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(host); content::WebContents::FromRenderFrameHost(host);
...@@ -55,10 +53,6 @@ void SmsDialogAndroid::SmsReceived() { ...@@ -55,10 +53,6 @@ void SmsDialogAndroid::SmsReceived() {
Java_SmsReceiverDialog_smsReceived(AttachCurrentThread(), java_dialog_); Java_SmsReceiverDialog_smsReceived(AttachCurrentThread(), java_dialog_);
} }
void SmsDialogAndroid::OnConfirm(JNIEnv* env) { void SmsDialogAndroid::OnEvent(JNIEnv* env, jint event_type) {
std::move(on_confirm_).Run(); std::move(handler_).Run(static_cast<Event>(event_type));
}
void SmsDialogAndroid::OnCancel(JNIEnv* env) {
std::move(on_cancel_).Run();
} }
...@@ -19,22 +19,16 @@ class SmsDialogAndroid : public content::SmsDialog { ...@@ -19,22 +19,16 @@ class SmsDialogAndroid : public content::SmsDialog {
explicit SmsDialogAndroid(const url::Origin& origin); explicit SmsDialogAndroid(const url::Origin& origin);
~SmsDialogAndroid() override; ~SmsDialogAndroid() override;
void Open(content::RenderFrameHost*, void Open(content::RenderFrameHost*, EventHandler handler) override;
base::OnceClosure on_confirm,
base::OnceClosure on_cancel) override;
void Close() override; void Close() override;
void SmsReceived() override; void SmsReceived() override;
// Report the user manually clicks the 'Confirm' button. // Report the user's action through |event_type|.
void OnConfirm(JNIEnv* env); void OnEvent(JNIEnv* env, jint event_type);
// Report the user manually dismisses the SMS dialog.
void OnCancel(JNIEnv* env);
private: private:
base::android::ScopedJavaGlobalRef<jobject> java_dialog_; base::android::ScopedJavaGlobalRef<jobject> java_dialog_;
base::OnceClosure on_confirm_; EventHandler handler_;
base::OnceClosure on_cancel_;
DISALLOW_COPY_AND_ASSIGN(SmsDialogAndroid); DISALLOW_COPY_AND_ASSIGN(SmsDialogAndroid);
}; };
......
...@@ -72,20 +72,19 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, Receive) { ...@@ -72,20 +72,19 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, Receive) {
auto* dialog = new NiceMock<MockSmsDialog>(); auto* dialog = new NiceMock<MockSmsDialog>();
base::OnceClosure on_confirm_callback; SmsDialog::EventHandler hdl;
EXPECT_CALL(delegate_, CreateSmsDialog(_)) EXPECT_CALL(delegate_, CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog))));
EXPECT_CALL(*dialog, Open(_, _, _)) EXPECT_CALL(*dialog, Open(_, _))
.WillOnce(Invoke([&on_confirm_callback](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl = std::move(handler);
on_confirm_callback = std::move(on_confirm);
})); }));
EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&on_confirm_callback]() { EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&hdl]() {
std::move(on_confirm_callback).Run(); std::move(hdl).Run(SmsDialog::Event::kConfirm);
})); }));
auto* provider = new NiceMock<MockSmsProvider>(); auto* provider = new NiceMock<MockSmsProvider>();
...@@ -117,20 +116,19 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, AtMostOnePendingSmsRequest) { ...@@ -117,20 +116,19 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, AtMostOnePendingSmsRequest) {
auto* dialog = new NiceMock<MockSmsDialog>(); auto* dialog = new NiceMock<MockSmsDialog>();
base::OnceClosure on_confirm_callback; SmsDialog::EventHandler hdl;
EXPECT_CALL(delegate_, CreateSmsDialog(_)) EXPECT_CALL(delegate_, CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog))));
EXPECT_CALL(*dialog, Open(_, _, _)) EXPECT_CALL(*dialog, Open(_, _))
.WillOnce(Invoke([&on_confirm_callback](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl = std::move(handler);
on_confirm_callback = std::move(on_confirm);
})); }));
EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&on_confirm_callback]() { EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&hdl]() {
std::move(on_confirm_callback).Run(); std::move(hdl).Run(SmsDialog::Event::kConfirm);
})); }));
auto* provider = new NiceMock<MockSmsProvider>(); auto* provider = new NiceMock<MockSmsProvider>();
...@@ -244,7 +242,8 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) { ...@@ -244,7 +242,8 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) {
true true
)"; )";
base::OnceClosure on_confirm1, on_confirm2; SmsDialog::EventHandler hdl_1;
SmsDialog::EventHandler hdl_2;
{ {
base::RunLoop loop; base::RunLoop loop;
...@@ -260,11 +259,10 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) { ...@@ -260,11 +259,10 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) {
loop.Quit(); loop.Quit();
})); }));
EXPECT_CALL(*dialog, Open(_, _, _)) EXPECT_CALL(*dialog, Open(_, _))
.WillOnce(Invoke([&on_confirm1](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl_1](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl_1 = std::move(handler);
on_confirm1 = std::move(on_confirm);
})); }));
// First tab registers an observer. // First tab registers an observer.
...@@ -287,11 +285,10 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) { ...@@ -287,11 +285,10 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) {
loop.Quit(); loop.Quit();
})); }));
EXPECT_CALL(*dialog, Open(_, _, _)) EXPECT_CALL(*dialog, Open(_, _))
.WillOnce(Invoke([&on_confirm2](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl_2](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl_2 = std::move(handler);
on_confirm2 = std::move(on_confirm);
})); }));
// Second tab registers an observer. // Second tab registers an observer.
...@@ -304,7 +301,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) { ...@@ -304,7 +301,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) {
provider->NotifyReceive(url::Origin::Create(url), "hello1"); provider->NotifyReceive(url::Origin::Create(url), "hello1");
std::move(on_confirm1).Run(); std::move(hdl_1).Run(SmsDialog::Event::kConfirm);
EXPECT_EQ("hello1", EvalJs(tab1, "sms")); EXPECT_EQ("hello1", EvalJs(tab1, "sms"));
...@@ -312,7 +309,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) { ...@@ -312,7 +309,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsSameOrigin) {
provider->NotifyReceive(url::Origin::Create(url), "hello2"); provider->NotifyReceive(url::Origin::Create(url), "hello2");
std::move(on_confirm2).Run(); std::move(hdl_2).Run(SmsDialog::Event::kConfirm);
EXPECT_EQ("hello2", EvalJs(tab2, "sms")); EXPECT_EQ("hello2", EvalJs(tab2, "sms"));
...@@ -356,25 +353,23 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsDifferentOrigin) { ...@@ -356,25 +353,23 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsDifferentOrigin) {
auto* dialog1 = new NiceMock<MockSmsDialog>(); auto* dialog1 = new NiceMock<MockSmsDialog>();
auto* dialog2 = new NiceMock<MockSmsDialog>(); auto* dialog2 = new NiceMock<MockSmsDialog>();
base::OnceClosure on_confirm_callback1; SmsDialog::EventHandler hdl_1;
base::OnceClosure on_confirm_callback2; SmsDialog::EventHandler hdl_2;
EXPECT_CALL(delegate_, CreateSmsDialog(_)) EXPECT_CALL(delegate_, CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog1)))) .WillOnce(Return(ByMove(base::WrapUnique(dialog1))))
.WillOnce(Return(ByMove(base::WrapUnique(dialog2)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog2))));
EXPECT_CALL(*dialog1, Open(_, _, _)) EXPECT_CALL(*dialog1, Open(_, _))
.WillOnce(Invoke([&on_confirm_callback1](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl_1](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl_1 = std::move(handler);
on_confirm_callback1 = std::move(on_confirm);
})); }));
EXPECT_CALL(*dialog2, Open(_, _, _)) EXPECT_CALL(*dialog2, Open(_, _))
.WillOnce(Invoke([&on_confirm_callback2](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl_2](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl_2 = std::move(handler);
on_confirm_callback2 = std::move(on_confirm);
})); }));
EXPECT_EQ(true, EvalJs(tab1, script)); EXPECT_EQ(true, EvalJs(tab1, script));
...@@ -386,7 +381,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsDifferentOrigin) { ...@@ -386,7 +381,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsDifferentOrigin) {
provider->NotifyReceive(url::Origin::Create(url1), "hello1"); provider->NotifyReceive(url::Origin::Create(url1), "hello1");
std::move(on_confirm_callback1).Run(); std::move(hdl_1).Run(SmsDialog::Event::kConfirm);
EXPECT_EQ("hello1", EvalJs(tab1, "sms")); EXPECT_EQ("hello1", EvalJs(tab1, "sms"));
...@@ -394,7 +389,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsDifferentOrigin) { ...@@ -394,7 +389,7 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, TwoTabsDifferentOrigin) {
provider->NotifyReceive(url::Origin::Create(url2), "hello2"); provider->NotifyReceive(url::Origin::Create(url2), "hello2");
std::move(on_confirm_callback2).Run(); std::move(hdl_2).Run(SmsDialog::Event::kConfirm);
EXPECT_EQ("hello2", EvalJs(tab2, "sms")); EXPECT_EQ("hello2", EvalJs(tab2, "sms"));
...@@ -446,12 +441,10 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, Cancels) { ...@@ -446,12 +441,10 @@ IN_PROC_BROWSER_TEST_F(SmsBrowserTest, Cancels) {
EXPECT_CALL(delegate, CreateSmsDialog(_)) EXPECT_CALL(delegate, CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog))));
EXPECT_CALL(*dialog, Open(_, _, _)) EXPECT_CALL(*dialog, Open(_, _))
.WillOnce( .WillOnce(Invoke([](RenderFrameHost*, SmsDialog::EventHandler handler) {
Invoke([](content::RenderFrameHost*, base::OnceClosure on_confirm,
base::OnceClosure on_cancel) {
// Simulates the user pressing "cancel". // Simulates the user pressing "cancel".
std::move(on_cancel).Run(); std::move(handler).Run(SmsDialog::Event::kCancel);
})); }));
EXPECT_CALL(*dialog, Close()).WillOnce(Return()); EXPECT_CALL(*dialog, Close()).WillOnce(Return());
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/callback_helpers.h" #include "base/callback_helpers.h"
#include "base/logging.h"
#include "base/optional.h" #include "base/optional.h"
#include "content/browser/sms/sms_metrics.h" #include "content/browser/sms/sms_metrics.h"
#include "content/public/browser/sms_dialog.h" #include "content/public/browser/sms_dialog.h"
...@@ -143,16 +144,27 @@ void SmsService::OnCancel() { ...@@ -143,16 +144,27 @@ void SmsService::OnCancel() {
Process(SmsStatus::kCancelled, base::nullopt); Process(SmsStatus::kCancelled, base::nullopt);
} }
void SmsService::OnEvent(SmsDialog::Event event_type) {
switch (event_type) {
case SmsDialog::Event::kConfirm:
OnConfirm();
return;
case SmsDialog::Event::kCancel:
OnCancel();
return;
}
DVLOG(1) << "Unsupported event type: " << event_type;
NOTREACHED();
}
void SmsService::Prompt() { void SmsService::Prompt() {
WebContents* web_contents = WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host()); WebContents::FromRenderFrameHost(render_frame_host());
const url::Origin origin = render_frame_host()->GetLastCommittedOrigin(); const url::Origin origin = render_frame_host()->GetLastCommittedOrigin();
prompt_ = web_contents->GetDelegate()->CreateSmsDialog(origin); prompt_ = web_contents->GetDelegate()->CreateSmsDialog(origin);
if (prompt_) { if (prompt_) {
prompt_->Open( prompt_->Open(render_frame_host(),
render_frame_host(), base::BindOnce(&SmsService::OnEvent, base::Unretained(this)));
base::BindOnce(&SmsService::OnConfirm, base::Unretained(this)),
base::BindOnce(&SmsService::OnCancel, base::Unretained(this)));
} }
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "content/browser/sms/sms_provider.h" #include "content/browser/sms/sms_provider.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "content/public/browser/frame_service_base.h" #include "content/public/browser/frame_service_base.h"
#include "content/public/browser/sms_dialog.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "third_party/blink/public/mojom/sms/sms_receiver.mojom.h" #include "third_party/blink/public/mojom/sms/sms_receiver.mojom.h"
#include "url/origin.h" #include "url/origin.h"
...@@ -60,11 +61,14 @@ class CONTENT_EXPORT SmsService ...@@ -60,11 +61,14 @@ class CONTENT_EXPORT SmsService
// Callback when the |timer_| times out. // Callback when the |timer_| times out.
void OnTimeout(); void OnTimeout();
// Callback when the user manually clicks 'Confirm' button. // Called when the user manually clicks 'Confirm' button.
void OnConfirm(); void OnConfirm();
// Callback when the user manually dismisses the dialog. // Called when the user manually dismisses the dialog.
void OnCancel(); void OnCancel();
// Handles the user's action.
void OnEvent(SmsDialog::Event event_type);
// |sms_provider_| is safe because all instances of SmsProvider are owned // |sms_provider_| is safe because all instances of SmsProvider are owned
// by a SmsKeyedService, which is owned by a Profile, which transitively // by a SmsKeyedService, which is owned by a Profile, which transitively
// owns SmsServices. // owns SmsServices.
......
...@@ -78,23 +78,22 @@ class Service { ...@@ -78,23 +78,22 @@ class Service {
NiceMock<MockSmsWebContentsDelegate>* delegate() { return &delegate_; } NiceMock<MockSmsWebContentsDelegate>* delegate() { return &delegate_; }
NiceMock<MockSmsProvider>* provider() { return &provider_; } NiceMock<MockSmsProvider>* provider() { return &provider_; }
void SetupSmsDialog(content::RenderFrameHost* rfh) { void SetupSmsDialog(RenderFrameHost* rfh) {
auto* dialog = new NiceMock<MockSmsDialog>(); auto* dialog = new NiceMock<MockSmsDialog>();
EXPECT_CALL(*delegate(), CreateSmsDialog(_)) EXPECT_CALL(*delegate(), CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog))));
EXPECT_CALL(*dialog, Open(rfh, _, _)) EXPECT_CALL(*dialog, Open(rfh, _))
.WillOnce( .WillOnce(
Invoke([&](content::RenderFrameHost*, base::OnceClosure on_confirm, Invoke([&](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { handler_ = std::move(handler);
on_confirm_callback_ = std::move(on_confirm);
})); }));
EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&]() { EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&]() {
// Simulates user clicking the "Confirm" button to verify received // Simulates user clicking the "Confirm" button to verify received
// sms. // sms.
std::move(on_confirm_callback_).Run(); std::move(handler_).Run(SmsDialog::Event::kConfirm);
})); }));
EXPECT_CALL(*dialog, Close()).WillOnce(Return()); EXPECT_CALL(*dialog, Close()).WillOnce(Return());
...@@ -113,7 +112,7 @@ class Service { ...@@ -113,7 +112,7 @@ class Service {
NiceMock<MockSmsProvider> provider_; NiceMock<MockSmsProvider> provider_;
blink::mojom::SmsReceiverPtr service_ptr_; blink::mojom::SmsReceiverPtr service_ptr_;
std::unique_ptr<SmsService> service_; std::unique_ptr<SmsService> service_;
base::OnceClosure on_confirm_callback_; SmsDialog::EventHandler handler_;
}; };
class SmsServiceTest : public RenderViewHostTestHarness { class SmsServiceTest : public RenderViewHostTestHarness {
...@@ -441,12 +440,10 @@ TEST_F(SmsServiceTest, Cancel) { ...@@ -441,12 +440,10 @@ TEST_F(SmsServiceTest, Cancel) {
EXPECT_CALL(*service.delegate(), CreateSmsDialog(_)) EXPECT_CALL(*service.delegate(), CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog))));
EXPECT_CALL(*dialog, Open(main_rfh(), _, _)) EXPECT_CALL(*dialog, Open(main_rfh(), _))
.WillOnce( .WillOnce(Invoke([](RenderFrameHost*, SmsDialog::EventHandler handler) {
Invoke([](content::RenderFrameHost*, base::OnceClosure on_confirm,
base::OnceClosure on_cancel) {
// Simulates the user pressing "Cancel". // Simulates the user pressing "Cancel".
std::move(on_cancel).Run(); std::move(handler).Run(SmsDialog::Event::kCancel);
})); }));
loop.Run(); loop.Run();
...@@ -479,7 +476,7 @@ TEST_F(SmsServiceTest, TimeoutClosesDialog) { ...@@ -479,7 +476,7 @@ TEST_F(SmsServiceTest, TimeoutClosesDialog) {
// Deliberately avoid calling the on_cancel callback, to simulate the // Deliberately avoid calling the on_cancel callback, to simulate the
// sms being timed out before the user cancels it. // sms being timed out before the user cancels it.
EXPECT_CALL(*dialog, Open(main_rfh(), _, _)).WillOnce(Return()); EXPECT_CALL(*dialog, Open(main_rfh(), _)).WillOnce(Return());
EXPECT_CALL(*dialog, Close()).WillOnce(Return()); EXPECT_CALL(*dialog, Close()).WillOnce(Return());
...@@ -496,24 +493,23 @@ TEST_F(SmsServiceTest, SecondRequestTimesOutEarlierThanFirstRequest) { ...@@ -496,24 +493,23 @@ TEST_F(SmsServiceTest, SecondRequestTimesOutEarlierThanFirstRequest) {
auto* dialog1 = new NiceMock<MockSmsDialog>(); auto* dialog1 = new NiceMock<MockSmsDialog>();
auto* dialog2 = new NiceMock<MockSmsDialog>(); auto* dialog2 = new NiceMock<MockSmsDialog>();
base::OnceClosure on_confirm_callback; SmsDialog::EventHandler hdl;
EXPECT_CALL(*service.delegate(), CreateSmsDialog(_)) EXPECT_CALL(*service.delegate(), CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog1)))) .WillOnce(Return(ByMove(base::WrapUnique(dialog1))))
.WillOnce(Return(ByMove(base::WrapUnique(dialog2)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog2))));
EXPECT_CALL(*dialog1, Open(main_rfh(), _, _)) EXPECT_CALL(*dialog1, Open(main_rfh(), _))
.WillOnce(Invoke([&on_confirm_callback](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl = std::move(handler);
on_confirm_callback = std::move(on_confirm);
})); }));
EXPECT_CALL(*dialog2, Open(main_rfh(), _, _)).Times(1); EXPECT_CALL(*dialog2, Open(main_rfh(), _)).Times(1);
EXPECT_CALL(*dialog1, SmsReceived()) EXPECT_CALL(*dialog1, SmsReceived()).WillOnce(Invoke([&hdl]() {
.WillOnce(Invoke( std::move(hdl).Run(SmsDialog::Event::kConfirm);
[&on_confirm_callback]() { std::move(on_confirm_callback).Run(); })); }));
EXPECT_CALL(*service.provider(), Retrieve()) EXPECT_CALL(*service.provider(), Retrieve())
.WillOnce(Invoke([&service]() { .WillOnce(Invoke([&service]() {
...@@ -601,12 +597,10 @@ TEST_F(SmsServiceTest, RecordMetricsForCancelOnSuccess) { ...@@ -601,12 +597,10 @@ TEST_F(SmsServiceTest, RecordMetricsForCancelOnSuccess) {
EXPECT_CALL(*service.delegate(), CreateSmsDialog(_)) EXPECT_CALL(*service.delegate(), CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog))));
EXPECT_CALL(*dialog, Open(main_rfh(), _, _)) EXPECT_CALL(*dialog, Open(main_rfh(), _))
.WillOnce( .WillOnce(Invoke([](RenderFrameHost*, SmsDialog::EventHandler handler) {
Invoke([](content::RenderFrameHost*, base::OnceClosure on_confirm,
base::OnceClosure on_cancel) {
// Simulates the user pressing "Cancel". // Simulates the user pressing "Cancel".
std::move(on_cancel).Run(); std::move(handler).Run(SmsDialog::Event::kCancel);
})); }));
loop.Run(); loop.Run();
...@@ -637,21 +631,20 @@ TEST_F(SmsServiceTest, RecordMetricsForCancelOnSuccess) { ...@@ -637,21 +631,20 @@ TEST_F(SmsServiceTest, RecordMetricsForCancelOnSuccess) {
})); }));
auto* dialog = new NiceMock<MockSmsDialog>(); auto* dialog = new NiceMock<MockSmsDialog>();
base::OnceClosure on_cancel_callback; SmsDialog::EventHandler hdl;
EXPECT_CALL(*service.delegate(), CreateSmsDialog(_)) EXPECT_CALL(*service.delegate(), CreateSmsDialog(_))
.WillOnce(Return(ByMove(base::WrapUnique(dialog)))); .WillOnce(Return(ByMove(base::WrapUnique(dialog))));
EXPECT_CALL(*dialog, Open(main_rfh(), _, _)) EXPECT_CALL(*dialog, Open(main_rfh(), _))
.WillOnce(Invoke([&on_cancel_callback](content::RenderFrameHost*, .WillOnce(
base::OnceClosure on_confirm, Invoke([&hdl](RenderFrameHost*, SmsDialog::EventHandler handler) {
base::OnceClosure on_cancel) { hdl = std::move(handler);
on_cancel_callback = std::move(on_cancel);
})); }));
EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&]() { EXPECT_CALL(*dialog, SmsReceived()).WillOnce(Invoke([&]() {
// Simulates user clicking the "Cancel" once the SMS has been received. // Simulates user clicking the "Cancel" once the SMS has been received.
std::move(on_cancel_callback).Run(); std::move(hdl).Run(SmsDialog::Event::kCancel);
})); }));
loop.Run(); loop.Run();
......
...@@ -16,8 +16,7 @@ class MockSmsDialog : public SmsDialog { ...@@ -16,8 +16,7 @@ class MockSmsDialog : public SmsDialog {
MockSmsDialog(); MockSmsDialog();
~MockSmsDialog() override; ~MockSmsDialog() override;
MOCK_METHOD3(Open, MOCK_METHOD2(Open, void(RenderFrameHost*, EventHandler handler));
void(RenderFrameHost*, base::OnceClosure, base::OnceClosure));
MOCK_METHOD0(Close, void()); MOCK_METHOD0(Close, void());
MOCK_METHOD0(SmsReceived, void()); MOCK_METHOD0(SmsReceived, void());
......
...@@ -364,6 +364,7 @@ java_cpp_enum("content_public_android_java_enums_srcjar") { ...@@ -364,6 +364,7 @@ java_cpp_enum("content_public_android_java_enums_srcjar") {
"//content/public/browser/browsing_data_remover.h", "//content/public/browser/browsing_data_remover.h",
"//content/public/browser/invalidate_type.h", "//content/public/browser/invalidate_type.h",
"//content/public/browser/navigation_controller.h", "//content/public/browser/navigation_controller.h",
"//content/public/browser/sms_dialog.h",
"//content/public/common/browser_controls_state.h", "//content/public/common/browser_controls_state.h",
"//content/public/common/console_message_level.h", "//content/public/common/console_message_level.h",
"//content/public/common/screen_orientation_values.h", "//content/public/common/screen_orientation_values.h",
......
...@@ -16,11 +16,20 @@ class RenderFrameHost; ...@@ -16,11 +16,20 @@ class RenderFrameHost;
// messages. // messages.
class CONTENT_EXPORT SmsDialog { class CONTENT_EXPORT SmsDialog {
public: public:
// A Java counterpart will be generated for this enum.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.content_public.browser.sms
enum Event {
// User manually clicked the 'Confirm' button.
kConfirm = 0,
// User manually dismissed the SMS dialog.
kCancel = 1,
};
using EventHandler = base::OnceCallback<void(Event)>;
SmsDialog() = default; SmsDialog() = default;
virtual ~SmsDialog() = default; virtual ~SmsDialog() = default;
virtual void Open(content::RenderFrameHost* host, virtual void Open(RenderFrameHost* host, EventHandler handler) = 0;
base::OnceClosure on_confirm,
base::OnceClosure on_cancel) = 0;
virtual void Close() = 0; virtual void Close() = 0;
virtual void SmsReceived() = 0; virtual void SmsReceived() = 0;
......
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