blob: 9976d6a6fd0a5df6630bf74a74589eb4d511af7b [file] [log] [blame]
Sam Goto9c87da7e2019-04-30 23:09:451// Copyright 2019 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.
4
Sam Gotoc1294cab2019-07-15 22:36:015#include "content/browser/sms/sms_service.h"
Sam Goto9c87da7e2019-04-30 23:09:456
Sam Goto36d91172019-07-18 02:55:217#include <iterator>
8#include <queue>
Ayu Ishiid29455462019-10-18 23:23:199#include <string>
Sam Gotoc1294cab2019-07-15 22:36:0110#include <utility>
Sam Goto9c87da7e2019-04-30 23:09:4511
12#include "base/bind.h"
13#include "base/callback_helpers.h"
Jun Cai34b60532019-08-13 19:56:4014#include "base/logging.h"
Sam Goto36d91172019-07-18 02:55:2115#include "base/optional.h"
Ayu Ishii9d303da52019-07-26 15:50:4716#include "content/browser/sms/sms_metrics.h"
Sam Gotoc108b7b2019-07-18 20:12:1517#include "content/public/browser/web_contents.h"
18#include "content/public/browser/web_contents_delegate.h"
Sam Goto36d91172019-07-18 02:55:2119
20using blink::mojom::SmsStatus;
Sam Goto9c87da7e2019-04-30 23:09:4521
22namespace content {
23
Miyoung Shin8ff3aa892019-08-31 03:01:3824SmsService::SmsService(
25 SmsProvider* provider,
26 const url::Origin& origin,
27 RenderFrameHost* host,
28 mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver)
29 : FrameServiceBase(host, std::move(receiver)),
Sam Goto36d91172019-07-18 02:55:2130 sms_provider_(provider),
31 origin_(origin) {}
32
Miyoung Shin8ff3aa892019-08-31 03:01:3833SmsService::SmsService(
34 SmsProvider* provider,
35 RenderFrameHost* host,
36 mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver)
Sam Goto36d91172019-07-18 02:55:2137 : SmsService(provider,
38 host->GetLastCommittedOrigin(),
39 host,
Miyoung Shin8ff3aa892019-08-31 03:01:3840 std::move(receiver)) {}
Sam Goto9c87da7e2019-04-30 23:09:4541
Sam Gotoc1294cab2019-07-15 22:36:0142SmsService::~SmsService() {
Jun Cai2055a0d62019-07-24 17:11:0643 if (callback_)
44 Process(SmsStatus::kTimeout, base::nullopt);
Sam Goto9c87da7e2019-04-30 23:09:4545}
46
Sam Goto36d91172019-07-18 02:55:2147// static
Miyoung Shin8ff3aa892019-08-31 03:01:3848void SmsService::Create(
49 SmsProvider* provider,
50 RenderFrameHost* host,
51 mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver) {
Sam Goto36d91172019-07-18 02:55:2152 DCHECK(host);
53
54 // SmsService owns itself. It will self-destruct when a mojo interface
55 // error occurs, the render frame host is deleted, or the render frame host
56 // navigates to a new document.
Miyoung Shin8ff3aa892019-08-31 03:01:3857 new SmsService(provider, host, std::move(receiver));
Sam Goto9c87da7e2019-04-30 23:09:4558}
59
Ayu Ishiiac090532019-09-04 14:12:0660void SmsService::Receive(ReceiveCallback callback) {
Sam Goto9c87da7e2019-04-30 23:09:4561 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Jun Cai2055a0d62019-07-24 17:11:0662 if (callback_) {
Ayu Ishiid29455462019-10-18 23:23:1963 std::move(callback_).Run(SmsStatus::kCancelled, base::nullopt);
64 sms_provider_->RemoveObserver(this);
Sam Gotoc108b7b2019-07-18 20:12:1565 }
Sam Goto36d91172019-07-18 02:55:2166
Ayu Ishiiae662c22019-08-06 16:24:0967 start_time_ = base::TimeTicks::Now();
68
Jun Cai2055a0d62019-07-24 17:11:0669 sms_provider_->AddObserver(this);
70
71 callback_ = std::move(callback);
Sam Gotoc108b7b2019-07-18 20:12:1572
Sam Goto36d91172019-07-18 02:55:2173 sms_provider_->Retrieve();
74}
75
Sam Goto354bc1ad2019-08-30 00:10:4076bool SmsService::OnReceive(const url::Origin& origin,
77 const std::string& one_time_code,
78 const std::string& sms) {
Sam Goto36d91172019-07-18 02:55:2179 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
80 if (origin_ != origin)
81 return false;
82
Jun Cai2055a0d62019-07-24 17:11:0683 DCHECK(!sms_);
Ayu Ishiiae662c22019-08-06 16:24:0984 DCHECK(!start_time_.is_null());
85
86 RecordSmsReceiveTime(base::TimeTicks::Now() - start_time_);
Sam Goto36d91172019-07-18 02:55:2187
Jun Cai2055a0d62019-07-24 17:11:0688 sms_provider_->RemoveObserver(this);
Sam Goto36d91172019-07-18 02:55:2189
Jun Cai2055a0d62019-07-24 17:11:0690 sms_ = sms;
Ayu Ishii9d303da52019-07-26 15:50:4791 receive_time_ = base::TimeTicks::Now();
Sam Goto4fedd242019-08-22 03:35:3292
Sam Goto354bc1ad2019-08-30 00:10:4093 OpenInfoBar(one_time_code);
94
95 return true;
96}
97
98void SmsService::OpenInfoBar(const std::string& one_time_code) {
Sam Goto4fedd242019-08-22 03:35:3299 WebContents* web_contents =
100 content::WebContents::FromRenderFrameHost(render_frame_host());
101
102 web_contents->GetDelegate()->CreateSmsPrompt(
Sam Goto354bc1ad2019-08-30 00:10:40103 render_frame_host(), origin_, one_time_code,
Sam Goto4fedd242019-08-22 03:35:32104 base::BindOnce(&SmsService::OnConfirm, weak_ptr_factory_.GetWeakPtr()),
105 base::BindOnce(&SmsService::OnCancel, weak_ptr_factory_.GetWeakPtr()));
Sam Goto36d91172019-07-18 02:55:21106}
107
Jun Cai2055a0d62019-07-24 17:11:06108void SmsService::Process(blink::mojom::SmsStatus status,
109 base::Optional<std::string> sms) {
Sam Goto36d91172019-07-18 02:55:21110 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
111
Jun Cai2055a0d62019-07-24 17:11:06112 DCHECK(callback_);
Sam Goto36d91172019-07-18 02:55:21113
Jun Cai2055a0d62019-07-24 17:11:06114 std::move(callback_).Run(status, sms);
Sam Goto36d91172019-07-18 02:55:21115
Sam Goto4fedd242019-08-22 03:35:32116 CleanUp();
Jun Cai2055a0d62019-07-24 17:11:06117}
118
Jun Cai7421705b2019-08-05 21:14:40119void SmsService::OnConfirm() {
Jun Cai2055a0d62019-07-24 17:11:06120 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
121
122 DCHECK(sms_);
Ayu Ishii9d303da52019-07-26 15:50:47123 DCHECK(!receive_time_.is_null());
124 RecordContinueOnSuccessTime(base::TimeTicks::Now() - receive_time_);
Jun Cai2055a0d62019-07-24 17:11:06125
126 Process(SmsStatus::kSuccess, sms_);
Sam Goto9c87da7e2019-04-30 23:09:45127}
128
Sam Gotoc108b7b2019-07-18 20:12:15129void SmsService::OnCancel() {
130 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
131
Ayu Ishii9d303da52019-07-26 15:50:47132 // Record only when SMS has already been received.
Sam Goto4fedd242019-08-22 03:35:32133 DCHECK(!receive_time_.is_null());
134 RecordCancelOnSuccessTime(base::TimeTicks::Now() - receive_time_);
Ayu Ishii9d303da52019-07-26 15:50:47135
Jun Cai2055a0d62019-07-24 17:11:06136 Process(SmsStatus::kCancelled, base::nullopt);
Sam Gotoc108b7b2019-07-18 20:12:15137}
138
Sam Goto4fedd242019-08-22 03:35:32139void SmsService::CleanUp() {
Jun Cai2055a0d62019-07-24 17:11:06140 callback_.Reset();
141 sms_.reset();
Ayu Ishiiae662c22019-08-06 16:24:09142 start_time_ = base::TimeTicks();
Ayu Ishii9d303da52019-07-26 15:50:47143 receive_time_ = base::TimeTicks();
Jun Cai2055a0d62019-07-24 17:11:06144 sms_provider_->RemoveObserver(this);
Sam Gotoc108b7b2019-07-18 20:12:15145}
146
Sam Goto9c87da7e2019-04-30 23:09:45147} // namespace content